0

我有一个 Java 8 应用程序,我正在努力转换为 Java 11,当然我是第一次使用模块系统。

我设置了我的应用程序 Maven 程序集配置,以便所有 JAR 文件都放在 bin 分发的 /lib 目录中。然后,maven-jar-plugin 使用所有 JAR 文件名设置 MANIFEST Class-Path 值。该应用程序以简单的方式运行java -jar /lib/application.jar

转到 Java 11,如果我继续以这种方式构建 bin 分发,我很想知道运行时如何解释 MANIFEST Class-Path 值?我通读了 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. 由于一切都在 Class-Path 上,因此模块系统在运行时基本上没有被使用
  5. 既然一切都在 Class-Path 上,那么应用程序本质上应该像运行 Java 8 一样运行吗?

如果我确实想改变这一点,我会开始将任何模块化 JAR 文件放在 --module-path 上,并将其他 JAR 文件保留在 Class-Path 上吗?

4

1 回答 1

0

确切地; 通过 -jar 运行您的所有代码都在未命名的模块中,而 JDK 类本身在模块上运行,这就是为什么您可以在使用 JDK 9+ 运行的堆栈跟踪中看到“java.base/”的原因。

因此,您的调用必须从更改java -jar lib/application.jarjava --module-path lib --module application/your.main.class

您可以使用 JLink 和/或 JPackage 进一步改进它,您可以在其中创建一个已经执行您的模块的可执行文件,例如./bin/application.

首先将所有 jars 添加到模块路径中,看看 Java 是否没有说明拆分包的任何内容。因此,通过这样做,几乎可以肯定您的模块将是“自动模块”。所以你会遇到一些ClassNotFoundException。

如果发生这种情况,您将需要--add-module module.

于 2021-03-29T14:34:31.707 回答