【问题标题】:Is it possible to use dependencies without module-info.class in a Java 9 module是否可以在 Java 9 模块中使用没有 module-info.class 的依赖项
【发布时间】:2016-07-08 14:51:39
【问题描述】:

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

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

module-info.java 在第一个项目中只包含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 中的类?特别是对于依赖于 3rd-party 项目的项目(例如 apache-commons,...),我认为需要这样的东西。

【问题讨论】:

    标签: java java-9 java-platform-module-system


    【解决方案1】:

    是的,这是可能的。你要找的是automatic modules

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

    然后您可以使用它的名字来请求它(例如require guava; - 请参阅here)。

    【讨论】:

    • 很好,谢谢!所以为了让我明白这一点:当我使用模块时,我基本上应该总是使用模块路径而不是类路径?
    • 没那么简单。 JVM 只会从另一个模块需要的模块路径加载模块。任何人都不需要自动模块的依赖关系(因为它们没有module-info),所以它们不会被加载。他们必须继续上课,在那里他们会被挤进unnamed module
    • 如果一个自动模块依赖于另一个自动模块(即,两者都在模块路径上,但显式模块只需要第一个模块),那么您可以通过--add-modules 选项。此选项接受各种特殊标记,表示有用的模块集合。特别是ALL-MODULE-PATH,将加载在模块路径上找到的所有可观察模块。
    • @MarkReinhold 我知道,但我认为这不是推荐的方式,因为它没有任何好处 - 或者是吗?
    • 主要区别在于自动模块需要进行完整性检查,例如拆分和重复包的检查。如果您要将现有的 JAR 文件集迁移到模块,那么通过 ALL-MODULE-PATH 将它们作为自动模块加载可能是一个有用的步骤。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多