3

我尝试将 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
  • 右键单击项目=>配置=>生成模块信息.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>
    
4

2 回答 2

3

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 中出现另一个误导性错误,见下文。

未解决的进口

对于无法解决导入的情况,问题可能是“该(旧)导入需要哪个相应的(新)模块?”。这里可能有什么帮助:

  • 在以下页面搜索所需的页面: 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

另见:

重新导出依赖项

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

grandparent => parent => log4j

你可能想用

requires transitive log4j.api 

在父母而不是

requires log4j.api

在祖父母。另见:

Java 9 模块声明中的 requires 和 requires 传递语句有什么区别

聚甲醛包装

我的主要问题似乎是我的 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 版本的调用代码:

私有静态记录器 sysLog = Logger.getLogger(Main.class);

私有静态记录器 sysLog = LogManager.getLogger(Main.class);

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

log4j2 中的 PropertyConfigurator

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

在此处输入图像描述

于 2017-11-10T14:03:38.937 回答
0

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

  1. 我下载了最新的 Eclipse Photon Release (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。

于 2018-09-06T12:27:47.553 回答