我试图更好地了解新的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
我的问题是:
如果没有“包信息”(例如,像普通的Java中那样),javac
工具如何知道module-info.class
应该位于根目录文件夹build/classes
中文件),而不是例如在模拟原始位置的文件夹中(例如build/classes/src/main/java/module-info.class
我没想到它可以工作,但是确实可以。 JVM如何知道org.lb.app
包属于lb.module
模块?我故意“错误地命名了”模块,使其与包含它的目录没有相同的名称,并且也没有export
软件包。对于人类读者来说,这似乎是显而易见的,但是我想了解java
程序的假设,以便将这两者捆绑在一起。
谢谢。