我有一个 Java 8 应用程序,正在努力转换为 Java 11,当然,这是我第一次使用模块系统。
我设置了应用程序 Maven 程序集配置,以便将所有 JAR 文件放入 bin 发行版的/lib 目录中。然后,maven-jar-plugin 使用所有 JAR 文件名设置 MANIFEST 类路径值。该应用程序使用简单的 java -jar/lib/application.jar
转向 Java 11,如果我继续以这种方式构建 bin 发行版,我很想知道运行时如何解释 MANIFEST 类路径值?我通读了 JAR 规范 ( https://docs.oracle.com/en/java/javase/11/docs/specs/jar/jar.html ),我想我将其理解为:
- 任何模块化 JAR 文件(包含 module-info.class)都将被视为非模块化 JAR。
- 任何非模块化 JAR 文件(无 module-info.class)都将被视为非模块化 JAR。
- 由于一切都在类路径上,所以一切本质上都是未命名的模块
- 由于所有内容都位于类路径上,因此模块系统本质上不会在运行时使用
- 由于所有内容都位于类路径上,因此应用程序的运行本质上应该就像仍以 Java 8 运行一样?
如果我确实想更改此设置,我是否会开始将任何模块化 JAR 文件放在 --module-path 上并将其他 JAR 文件保留在类路径上?
最佳答案
完全正确; 通过 -jar 运行,所有代码都在未命名的模块中,而 JDK 类本身在模块上运行,这就是为什么您可以在使用 JDK 9+ 运行的堆栈跟踪中看到“java.base/”。
因此,您的调用必须从 java -jar lib/application.jar
更改为 java --module-path lib --module application/your.main.class
您可以使用 JLink 和/或 JPackage 进一步改进它,您可以在其中创建一个已经执行您的模块的可执行文件,例如 ./bin/application
。
首先将所有 jar 添加到模块路径中,看看 Java 是否没有提及任何有关拆分包的信息。因此,通过这样做,几乎可以肯定您的模块将是“自动模块”。所以你可能会遇到一些ClassNotFoundException。
如果发生这种情况,您需要--add-module module
。
关于Java 模块和 JAR MANIFEST 类路径属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66818887/