22

我在我的 Maven pom.xml 中包含了这些依赖项:

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>${httpclient.version}</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>

我正在尝试在 module-info.java 中添加此依赖项,如下所示:

module io.github.wildcraft.restclient {
    requires httpcore; // no compilation problem
    requires httpclient; // no compilation problem
    requires commons-io; // shows compilation error
}

对于 commons-io,我收到编译错误。我怎样才能使这项工作?

4

2 回答 2

18

精简版

使用requires commons.io. (一般来说,请参阅nullpointer 的回答如何学习模块的名称。)

长版

由于commons-io.jar尚未模块化,您正在创建一个自动模块,模块系统必须为其命名。的JavadocModuleFinder描述了这是如何发生的:

此方法返回的模块查找器支持打包为 JAR 文件的模块。module-info.class[...]顶级目录中没有 的 JAR 文件定义了一个自动模块,如下所示:

  • 如果 JAR 文件在其主清单中具有属性“Automatic-Module-Name”,则其值为模块名称。模块名称是从 JAR 文件的名称派生而来的。

  • 版本和模块名 [...] 是从 JAR 文件的文件名派生而来的,如下所示:

    • [...]

    • 模块名称中的所有非字母数字字符 ([^A-Za-z0-9]) 都替换为点 ("."),所有重复的点都替换为一个点,所有前导点和尾随点都被删除。

最后两个项目符号适用于未为 Java 9 准备的自动模块,例如commons.io. 来自同一个 Javadoc 的这个示例解释了在您的情况下会发生什么:

  • 例如,名为“foo-bar.jar”的 JAR 文件将派生模块名称“foo.bar”且没有版本。名为“foo-bar-1.2.3-SNAPSHOT.jar”的 JAR 文件将派生模块名称“foo.bar”和“1.2.3-SNAPSHOT”作为版本。

因此requires commons.io应该工作。

于 2017-09-24T17:50:27.180 回答
10

添加到尼古拉提供的答案的较短版本。为了找出项目中使用的依赖项(jar)的模块名称,您可以从命令行使用jar 工具。

jar --file=<jar-file-path> --describe-module 

由于这些将被工具理解为自动模块,因此输出有点像:-

$ / jar --file=commons-lang3-3.6.jar --describe-module
No module descriptor found. Derived automatic module.

org.apache.commons.lang3@3.6 automatic // this is what you need to use without the version

requires java.base mandated
contains org.apache.commons.lang3
contains org.apache.commons.lang3.arch
contains org.apache.commons.lang3.builder
contains org.apache.commons.lang3.concurrent
contains org.apache.commons.lang3.event
contains org.apache.commons.lang3.exception
contains org.apache.commons.lang3.math
contains org.apache.commons.lang3.mutable
contains org.apache.commons.lang3.reflect
contains org.apache.commons.lang3.text
contains org.apache.commons.lang3.text.translate
contains org.apache.commons.lang3.time
contains org.apache.commons.lang3.tuple
于 2017-09-24T19:10:55.817 回答