maven - 如何在 Eclipse Oxygen 中将 log4j 与 maven 和 java9 一起使用?

标签 maven log4j java-9 java-platform-module-system eclipse-oxygen

我尝试将 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);
)

到目前为止我做了什么:
  • 已安装 Java 9.0.1
  • 将 Eclipse 升级到 Oxygen.1a 版本 (4.7.1a)
  • 将我的 Java 项目的合规级别更改为 9
  • 右键单击项目=>配置=>生成模块信息.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,可能会在 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 模块的所有导出包)
  • 在(旧)*.jar 文件上使用 JDeps 以获取所需 jar 文件的列表,例如

    jdeps --class-path "lib"-recursive MY-OLD.jar >output.txt
  • 使用 jar 查找 jar 文件的模块

    jar --describe-module --file REQUIRED-JAR-FILE.jar

  • 另见:
  • What are the predefined modules in JDK9 or Which module do I need to fix dependency problems?
  • https://blog.codefx.org/tools/jdeps-tutorial-analyze-java-project-dependencies/#Getting-To-Know-JDeps

  • 重新导出依赖项

    为了自动使 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

    另见
  • Log4j 2 doesn't support log4j.properties file anymore?
  • Converting log4j.properties to log4j.xml

  • 工作示例作为引用

    enter image description here

    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
    enter image description here

    关于maven - 如何在 Eclipse Oxygen 中将 log4j 与 maven 和 java9 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47223440/

    相关文章:

    java - 什么是非法反射访问?

    xml - 在模块路径或类路径上未找到 JAXB-API 的 javax.xml.bind.JAXBException 实现

    java - -server -XX :+UnlockExperimentalVMOptions -XX:+EnableJVMCI -XX:+UseJVMCICompiler时使用哪个编译器

    java - Maven 添加运行时依赖

    使用 SSH key 进行身份验证的带有 Artifactory <server/> 的 Maven settings.xml

    maven - 使用 Maven/Cucumber/Serenity 重新运行失败的场景

    java - log4j2 不适用于 tomcat

    maven - 我的maven插件没有执行

    java - Log4j2 不滚动日志文件

    eclipse - 在 Eclipse 中部署 JSP 应用程序时遇到问题