Java 模块和 JAR MANIFEST 类路径属性

标签 java classpath module-info module-path

我有一个 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 ),我想我将其理解为:

  1. 任何模块化 JAR 文件(包含 module-info.class)都将被视为非模块化 JAR。
  2. 任何非模块化 JAR 文件(无 module-info.class)都将被视为非模块化 JAR。
  3. 由于一切都在类路径上,所以一切本质上都是未命名的模块
  4. 由于所有内容都位于类路径上,因此模块系统本质上不会在运行时使用
  5. 由于所有内容都位于类路径上,因此应用程序的运行本质上应该就像仍以 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/

相关文章:

java - Java 9 中的 requires 和 requires 传递语句有什么区别?

java - 为什么要求传递仅限于直接需要包含它的模块的模块?

java for 循环执行得太快导致 System.currentTimeMillis() 重复

java - JAX-RS 响应生成器生成的 JSON 实体不正确

java按静音区分割声音

java - TokensRegex 中正则表达式的开始/结束

java - 使用maven和shade插件创建可运行的war(tomcat)

classpath - 从哪里可以获得 sunrsasign.jar 的正式副本?

java - 如何解决在类路径中覆盖 mssql-jdbc 驱动程序时出现的错误 - 在类中找不到 Main 方法

java - 是否可以跨 Java 模块使用 SharedSecrets?