【发布时间】:2018-04-23 17:19:12
【问题描述】:
我尝试将 Java8 项目迁移到 Java9。自动生成的 module-info.java 包含一个条目
requires log4j;
并显示错误:
log4j cannot be resolved to a module
=> 如何正确地将 log4j 作为 Java9 的模块依赖项包含在内?
(我对以下依赖项有同样的问题: 需要hibernate.core; 需要hibernate.jpa.2.1.api; 需要 jcommander; 需要junit; 需要反思; )
到目前为止我做了什么:
- 已安装 Java 9.0.1
- 将 Eclipse 升级到 Oxygen.1a 版本 (4.7.1a)
- 将我的 Java 项目的合规级别更改为 9
通过右键单击项目=>配置=>生成 module-info.java 生成 module-info.java
-
更新了我的 pom.xml 文件中的插件(另见 https://cwiki.apache.org/confluence/display/MAVEN/Java+9+-+Jigsaw)并将 java 版本设置为 9:
<!-- plugin for compile phase (and test-compile phase) --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.7.0</version> <configuration> <!-- specify current java version here: --> <source>9</source> <target>9</target> </configuration> </plugin> -
更新了 pom.xml 文件中的 log4j 版本,因为 log4j 1.2 似乎不适用于 Java9(参见 https://blogs.apache.org/logging/entry/moving_on_to_log4j_2)
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.9.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.9.1</version> </dependency>
【问题讨论】:
-
您不应再次将编译器插件绑定到生命周期。仅在 pluginManagement 版本 3.7.0 中定义 maven-compiler-plugin 并定义源/目标...无绑定.. log4j-api 不包含 modules-info.class 文件,因此仅使用自动模块名称,即 log4j- api?而不是 log4j...
-
如果没有一个
requires被识别,我会坚持你分享完整的项目结构和你的 pom.xml 的<build>配置。此外,为上述依赖项派生的自动模块名称分别为log4j.api和log4j.core。 -
您可以使用
jar命令(来自Java 9)来找出模块的名称:jar --describe-module --file $JAR-FILE告诉您必须使用哪个名称来要求它。此外,您可以use JDeps to identify which JARs you directly depend on。 -
@nullpointer 我要使用的 pom 包装(我的问题中没有提到它,因为我首先认为它不相关)不包括编译阶段。因此我必须明确包含编译器插件。
标签: maven log4j java-9 java-platform-module-system eclipse-oxygen