如何在 Eclipse Oxygen 中将 log4j 与 maven 和 java9 一起使用?
How to use log4j with maven and java9 in Eclipse Oxygen?
我尝试将 Java8 项目迁移到 Java9。自动生成的模块-info.java 包含一个条目
requires log4j;
并显示错误:
log4j cannot be resolved to a module
=> 如何正确地将 log4j 作为模块依赖包含在 Java9 中?
(我对以下依赖项有同样的问题:
需要 hibernate.core;
需要 hibernate.jpa.2.1.api;
需要jcommander;
需要联机;
需要思考;
)
到目前为止我做了什么:
- 已安装 Java 9.0.1
- 已将 Eclipse 升级到 Oxygen.1a 版本 (4.7.1a)
- 将我的 Java 项目的合规级别更改为 9
生成模块-info.java 右键单击项目=>配置=>生成模块-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>
module-info 中的错误。java
即使项目的 合规级别 已设置为 Java9,也可能显示 module-info.[=203= 的误导性错误] 在 Eclipse 中。
我预计只有在更改 pom.xml 文件时才需要更新 maven 项目。现在我了解到更改 module-info.java 还需要手动更新 maven 项目。
=> 更新maven项目(Alt+F5)
更新后我的错误消失了。
我还了解到,最好先更新 pom.xml 文件中的版本,然后再生成 module-info.java。否则 module-info.java 将包含 non-existing 模块,例如 "requires log4j" 而不是 "requires log4j.api"
module-info.java 中的另一个误导性错误可能是由于 pom 打包引起的,请参见下文。
未解决的导入
对于导入无法解决的情况,问题可能是 "Which corresponding (new) module do I need for that (old) import?"。什么可能对这里有帮助:
在以下页面搜索所需页面:
http://cr.openjdk.java.net/~mr/jigsaw/ea/module-summary.html
(列出 JDK-modules 的所有导出包)
在(旧的)*.jar 文件上使用 JDeps 来获取所需的 jar 文件列表,例如
jdeps --class-path "lib" -递归 MY-OLD.jar >output.txt
使用 jar 查找 jar 文件的模块
jar --describe-module --file REQUIRED-JAR-FILE.jar
另见:
Re-Export 依赖关系
为了自动让 log4j 对一个 grandparent 项目可见
grandparent => parent => log4j
您可能想使用
requires transitive log4j.api
在parent而不是
requires log4j.api
盛大parent。另见:
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 版本
一个。除了更改 "requires log4j" => "requires log4j.api" 我还必须调整与 Java9:
兼容的新 log4j 版本的调用代码
私有静态记录器 sysLog = Logger.getLogger(Main.class);
至
私有静态记录器 sysLog = LogManager.getLogger(Main.class);
乙。 log4j 2 没有 PropertyConfigurator。另请参阅此相关问题:
PropertyConfigurator in log4j2
C。 log4j 2 不支持 log4j.properties 个文件。以前我用
src/main/resources/META-INF/log4j.properties
进行配置。现在我用
src/main/resources/log4j2.xml
另见
Log4j 2 doesn't support log4j.properties file anymore?
Converting log4j.properties to log4j.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>
module-info.java:
module Log4JWithJava9 {
requires javafx.base;
requires log4j.api;
}
Main.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构建路径=>库=>模块路径
而不是 requires log4j.api
我不得不使用 requires org.apache.logging.log4j
我能以某种方式完成这项工作。
- 我下载了最新的 Eclipse Photon Release (4.8.0),我不知道这个修复是否适用于旧版本。
- 我将
module-info.java
更改为具有以下几行:
requires log4j.api;
requires log4j.core;
- 我不得不切换到较早版本的 log4j,2.8.2。
- 我将所有显示
import org.apache.logging.log4j.*;
的导入更改为不使用通配符。所以他们改为:import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
就是这样,它适用于 Maven 和 Eclipse。
我尝试将 Java8 项目迁移到 Java9。自动生成的模块-info.java 包含一个条目
requires log4j;
并显示错误:
log4j cannot be resolved to a module
=> 如何正确地将 log4j 作为模块依赖包含在 Java9 中?
(我对以下依赖项有同样的问题: 需要 hibernate.core; 需要 hibernate.jpa.2.1.api; 需要jcommander; 需要联机; 需要思考; )
到目前为止我做了什么:
- 已安装 Java 9.0.1
- 已将 Eclipse 升级到 Oxygen.1a 版本 (4.7.1a)
- 将我的 Java 项目的合规级别更改为 9
生成模块-info.java 右键单击项目=>配置=>生成模块-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>
module-info 中的错误。java
即使项目的 合规级别 已设置为 Java9,也可能显示 module-info.[=203= 的误导性错误] 在 Eclipse 中。
我预计只有在更改 pom.xml 文件时才需要更新 maven 项目。现在我了解到更改 module-info.java 还需要手动更新 maven 项目。
=> 更新maven项目(Alt+F5)
更新后我的错误消失了。
我还了解到,最好先更新 pom.xml 文件中的版本,然后再生成 module-info.java。否则 module-info.java 将包含 non-existing 模块,例如 "requires log4j" 而不是 "requires log4j.api"
module-info.java 中的另一个误导性错误可能是由于 pom 打包引起的,请参见下文。
未解决的导入
对于导入无法解决的情况,问题可能是 "Which corresponding (new) module do I need for that (old) import?"。什么可能对这里有帮助:
在以下页面搜索所需页面: http://cr.openjdk.java.net/~mr/jigsaw/ea/module-summary.html (列出 JDK-modules 的所有导出包)
在(旧的)*.jar 文件上使用 JDeps 来获取所需的 jar 文件列表,例如
jdeps --class-path "lib" -递归 MY-OLD.jar >output.txt
使用 jar 查找 jar 文件的模块
jar --describe-module --file REQUIRED-JAR-FILE.jar
另见:
Re-Export 依赖关系
为了自动让 log4j 对一个 grandparent 项目可见
grandparent => parent => log4j
您可能想使用
requires transitive log4j.api
在parent而不是
requires log4j.api
盛大parent。另见:
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 版本
一个。除了更改 "requires log4j" => "requires log4j.api" 我还必须调整与 Java9:
兼容的新 log4j 版本的调用代码私有静态记录器 sysLog = Logger.getLogger(Main.class);
至
私有静态记录器 sysLog = LogManager.getLogger(Main.class);
乙。 log4j 2 没有 PropertyConfigurator。另请参阅此相关问题:
PropertyConfigurator in log4j2
C。 log4j 2 不支持 log4j.properties 个文件。以前我用
src/main/resources/META-INF/log4j.properties
进行配置。现在我用
src/main/resources/log4j2.xml
另见
Log4j 2 doesn't support log4j.properties file anymore?
Converting log4j.properties to log4j.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>
module-info.java:
module Log4JWithJava9 {
requires javafx.base;
requires log4j.api;
}
Main.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构建路径=>库=>模块路径
而不是 requires log4j.api
我不得不使用 requires org.apache.logging.log4j
我能以某种方式完成这项工作。
- 我下载了最新的 Eclipse Photon Release (4.8.0),我不知道这个修复是否适用于旧版本。
- 我将
module-info.java
更改为具有以下几行:requires log4j.api; requires log4j.core;
- 我不得不切换到较早版本的 log4j,2.8.2。
- 我将所有显示
import org.apache.logging.log4j.*;
的导入更改为不使用通配符。所以他们改为:import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger;
就是这样,它适用于 Maven 和 Eclipse。