如何在Eclipse Oxygen中使用log4j和maven以及java9?

时间:2017-11-10 13:04:29

标签: maven log4j java-9 jigsaw eclipse-oxygen

我尝试将Java8项目迁移到Java9。 auto生成的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并右键单击project => Configure =>生成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>
    

2 个答案:

答案 0 :(得分:3)

module-info.java中的错误

即使项目的合规级别已设置为Java9,Eclipse中的module-info.java可能会显示误导性错误。

我预计只有在更改pom.xml文件时才需要更新maven项目。现在我了解到更改module-info.java还需要手动更新maven项目。

=&GT; 更新maven项目(Alt + F5)

在更新之后,我的错误消失了。

我还了解到,最好先更新pom.xml文件中的版本,然后生成module-info.java。否则module-info.java将包含不存在的模块,如“require log4j”而不是“requires log4j.api”

由于pom打包,module-info.java中可能会出现另一个误导性错误,见下文。

未解决的导入

对于无法解析导入的问题,问题可能是“我(旧)导入需要哪个相应(新)模块?”。这可能会有所帮助:

  • 在以下页面搜索所需页面: http://cr.openjdk.java.net/~mr/jigsaw/ea/module-summary.html (列出JDK模块的所有导出包)

  • 在(旧)* .jar文件中使用JDeps获取所需jar文件的列表,例如

    jdeps --class-path“lib”-recursive MY-OLD.jar&gt; output.txt

  • 使用jar查找jar文件的模块

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

另见:

重新导出依赖关系

为了祖父母项目自动使log4j可见

grandparent => parent => log4j

您可能想要使用

requires transitive log4j.api 

在父级而不是

requires log4j.api

祖父母。另见:

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

一个。除了更改“要求log4j”=&gt; “需要log4j.api”我必须调整与Java9兼容的新log4j版本的调用代码:

private static Logger sysLog = Logger.getLogger(Main.class);

private static Logger sysLog = LogManager.getLogger(Main.class);

B中。 log4j 2没有PropertyConfigurator。另请参阅此相关问题:

PropertyConfigurator in log4j2

℃。 log4j 2不支持log4j.properties文件。以前我用过

的src /主/资源/ META-INF / log4j.properties

用于配置。现在我用

的src /主/资源/ log4j2.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>

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 Build Path =&gt; Libraries =&gt; ModulePath < / p>

而不是requires log4j.api我必须使用requires org.apache.logging.log4j

enter image description here

答案 1 :(得分:0)

我能够以某种方式完成这项工作。

  1. 我下载了最新的Eclipse Photon版本(4.8.0),我不知道此修补程序是否适用于较旧的版本。
  2. 我将module-info.java更改为以下几行: requires log4j.api; requires log4j.core;
  3. 我不得不切换到Log4j的早期版本2.8.2。
  4. 我将所有说import org.apache.logging.log4j.*;的导入内容更改为不使用通配符。因此他们更改为:import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger;

就这样,它可以与Maven和Eclipse一起使用。