JPMS如何知道哪些软件包属于哪些模块?

时间:2018-08-05 22:55:18

标签: java javac java-9 java-module jigsaw

我试图更好地了解新的Java模块系统如何工作,尤其是在将Java程序包捆绑到各自的模块时。

如果不将其与特定示例联系在一起,我找不到一种易于理解的方式来问这个问题。

如果我具有以下项目结构:

.
└── src
    └── main
        └── java
            ├── module-info.java
            └── org
                └── lb
                    └── app
                        └── App.java

其中module-info.java是:

module lb.module {}

App.java是:

package org.lb.app;

public class App {
    public static void main (String[] args) {
        System.out.println("Hello, world!");
    }
}

然后从.目录运行命令:

javac -d build/classes $(find src/main/ -name "*.java")

这给了我以下结果:

.
├── build
│   └── classes
│       ├── module-info.class
│       └── org
│           └── lb
│               └── app
│                   └── App.class
└── src
    └── ...

最后我运行命令:

java --module-path build/classes/ --module lb.module/org.lb.app.App

我的问题是:

  1. 如果没有“包信息”(例如,像普通的Java中那样),javac工具如何知道module-info.class应该位于根目录文件夹build/classes中文件),而不是例如在模拟原始位置的文件夹中(例如build/classes/src/main/java/module-info.class

  2. 我没想到它可以工作,但是确实可以。 JVM如何知道org.lb.app包属于lb.module模块?我故意“错误地命名了”模块,使其与包含它的目录没有相同的名称,并且也没有export软件包。对于人类读者来说,这似乎是显而易见的,但是我想了解java程序的假设,以便将这两者捆绑在一起。

谢谢。

0 个答案:

没有答案