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

我创建了两个小项目de.app1de.app2 ,其中来自de.app1的 App使用来自de.app2的 Test

 ├── de.app1 │  ├── de │  │  └── app │  │  └── App.java │  └── module-info.java └── de.app2 └── de  └── test  └── Test.java 

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

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

 javac de/test/Test.java jar cf app2.jar de/test/Test.class 

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

 javac -cp ../de.app2/app2.jar de/app/App.java module-info.java 

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

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

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

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

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