是否可以在Java 9模块中使用不带module-info.class的依赖项

Jan*_*sen 11 java java-platform-module-system java-9

我创建了两个小项目de.app1de.app2,其中Appde.app1使用Testde.app2.

??? de.app1
?   ??? de
?   ?   ??? app
?   ?       ??? App.java
?   ??? module-info.java
??? de.app2
    ??? de
        ??? test
            ??? Test.java
Run Code Online (Sandbox Code Playgroud)

第一个项目中的module-info.java只包含module de.app1 {}

我编译了第二个项目并创建了一个jar文件:

javac de/test/Test.java
jar cf app2.jar de/test/Test.class
Run Code Online (Sandbox Code Playgroud)

然后尝试编译第一个项目,如下所示:

javac -cp ../de.app2/app2.jar de/app/App.java module-info.java
Run Code Online (Sandbox Code Playgroud)

失败,因为Test无法找到.当我在没有module-info.java的情况下编译项目时,一切正常.

是否有可能在Java 9模块使用不是Java 9模块的jar中的类?特别是对于依赖第三方项目的项目(例如apache-commons,......),我认为需要这样的东西.

Nic*_*lai 12

对的,这是可能的.您正在寻找的是自动模块.

要创建一个,您只需将常规JAR放入模块路径中提到的文件夹中(例如guava-19.0.jar,在文件夹中libs- 请参阅我的示例项目).这告诉JVM从中创建一个模块.该模块将根据文件名获取名称(在本例中guava),将读取所有其他模块,并导出其所有包.

然后你可以用它给出的名称来要求它(例如require guava;- 见这里).

  • 关键的区别在于自动模块需要进行健全性检查,例如拆分和重复包装.如果您正在将现有的一组JAR文件迁移到模块,那么通过"ALL-MODULE-PATH"将它们作为自动模块加载可能是一个有用的步骤. (3认同)
  • 事情没那么简单。JVM 只会从模块路径加载另一个模块所需的模块。任何人都不需要自动模块的依赖项(因为它们没有“module-info”),因此不会加载它们。它们必须进入类路径,在那里它们被聚集到[未命名模块](http://openjdk.java.net/projects/jigsaw/spec/sotms/#the-unnamed-module)。 (2认同)
  • 如果一个自动模块依赖于另一个自动模块(即,两个都在模块路径上,但只有第一个是显式模块所需),那么您可以通过[`--add-modules`加载第二个自动模块](http://openjdk.java.net/jeps/261#Root-modules)选项.此选项接受表示有用模块集合的各种特殊标记.特别是[`ALL-MODULE-PATH`](http://openjdk.java.net/jeps/261#ALL-MODULE-PATH)将加载模块路径上找到的所有可观察模块. (2认同)