我尝试将 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;
需要反射(reflection);
)
到目前为止我做了什么:
<!-- 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>
<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>
最佳答案
module-info.java 中的错误
即使合规水平的项目已设置为 Java9,可能会在 Eclipse 中显示 module-info.java 的误导性错误。
我预计只有在更改 pom.xml 文件时才需要更新 maven 项目。现在我了解到更改 module-info.java 还需要手动更新 maven 项目。
=> 更新 maven 项目 (Alt+F5)
在那次更新之后,我的错误消失了。
我还了解到,最好先更新 pom.xml 文件中的版本,然后生成 module-info.java。否则,module-info.java 将包含不存在的模块,例如“需要 log4j”而不是“需要 log4j.api”
由于 pom 打包,可能会在 module-info.java 中出现另一个误导性错误,见下文。
Unresolved 导入
对于无法解决导入的情况,问题可能是“该(旧)导入需要哪个相应的(新)模块?”。这里可能有什么帮助:
http://cr.openjdk.java.net/~mr/jigsaw/ea/module-summary.html
(列出 JDK 模块的所有导出包)
jdeps --class-path "lib"-recursive MY-OLD.jar >output.txt
jar --describe-module --file REQUIRED-JAR-FILE.jar
另见:
重新导出依赖项
为了自动使 log4j 对祖父项目可见
grandparent => parent => log4j
你可能想用
requires transitive log4j.api
在 parent 而不是
requires log4j.api
在祖 parent 。另见:
What's the difference between requires and requires transitive statements in Java 9 module declaration
POM包装
我的主要问题似乎是我的 Java8 pom.xml 文件使用了 pom 打包:
<packaging>pom</packaging>
如果我删除该行,module-info.java 中不会显示任何错误
另请参阅这个额外的问题:How to use maven with Java9.0.1 and pom packaging in Eclipse Oxygen 1a Release (4.7.1a)?
新的 log4j 版本
A. 除了更改“需要 log4j”=>“需要 log4j.api”之外,我还必须为与 Java9 兼容的新 log4j 版本调整调用代码:
私有(private)静态记录器 sysLog = Logger.getLogger(Main.class);
到
私有(private)静态记录器 sysLog = LogManager.getLogger(Main.class);
B. log4j 2 没有 PropertyConfigurator。另请参阅此相关问题:
PropertyConfigurator in log4j2
C. log4j 2 不支持 log4j.properties 文件。以前我用
src/main/resources/META-INF/log4j.properties
用于配置。现在我用
src/main/resources/log4j2.xml
另见
工作示例作为引用
pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>Log4JWithJava9</groupId>
<artifactId>Log4JWithJava9</artifactId>
<version>0.0.1-SNAPSHOT</version>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<release>9</release>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<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>
</dependencies>
</project>
模块信息.java:
module Log4JWithJava9 {
requires javafx.base;
requires log4j.api;
}
主.java:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Main {
private static Logger sysLog = LogManager.getLogger(Main.class);
public static void main(String[] args) {
}
}
Eclipse 插件
为了将 log4j 添加到 Eclipse 插件,我将文件 log4j-api-2.10.0.jar 复制到文件夹“lib”中,并将 jar 文件添加到 Java Build Path=>Libraries=>ModulePath
而不是
requires log4j.api
我不得不使用 requires org.apache.logging.log4j
关于maven - 如何在 Eclipse Oxygen 中将 log4j 与 maven 和 java9 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47223440/