我正在基于Java 11的Maven(3.6.0)项目使用以下结构(在命令行上可以正常工作!):
src/main/java/ module-info.java /de/test/tp/TP.java src/test/java/ /de/test/tp/test/TPTests.java
module-info.java如下所示:
module de.test.tp { exports de.test.tp; requires org.apache.logging.log4j; }
TP.java:
package de.test.tp; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class TP { private static final Logger LOGGER = LogManager.getLogger(TP.class); public TP() { super(); LOGGER.info("test"); } }
TPTests.java:
package de.test.tp.test; import static org.junit.jupiter.api.Assertions.assertNotNull; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.junit.jupiter.api.Test; import de.test.tp.TP; public class TPTests { private static final Logger LOGGER = LogManager.getLogger(TP.class); public TPTests() { super(); } @Test public void defaultConstructor() { final TP tp = new TP(); assertNotNull(tp, "Default constructor failed!"); } }
最后但并非最不重要的是pom.xml的重要部分
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> <configuration> <fork>true</fork> <showDeprecation>true</showDeprecation> <showWarnings>true</showWarnings> <optimize>false</optimize> <debug>true</debug> <release>11</release> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.1</version> <dependencies> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>5.4.1</version> </dependency> </dependencies> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>5.4.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.11.2</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.11.2</version> </dependency> </dependencies>
现在,当我说(从Eclipse中)“ maven / update project”时,eclipse将所有maven依赖项放到了 classpath 。重新编译后,eclipse告诉我:
The package org.apache.logging.log4j is accessible from more than one module: <unnamed>, org.apache.logging.log4j
对于两种org.apache.logging.log4j进口。
org.apache.logging.log4j
所以问题是,如何解决?
更新1
我真正想要的是一个基于Maven的Java模块项目的清晰项目结构,该项目可在Eclipse中工作并支持白盒和黑盒测试。有人可以给我这样的项目框架吗?
更新2
还是我在某些文章中阅读到的Eclipse没有多模块支持的问题?-这还将使我回到更新1的问题。
更新3
缩短了整个问题,并添加了完整(缩短)的文件内容。
注1
例如,在我所有的测试中,有一秒钟下的module-info.java,test/java/我发现eclipse 2019-03非常不稳定并且有错误!例如-有时尝试删除被测模块-info.java- Eclipse无法删除它。另一个效果是,当使用测试路径eclipse编辑module-info.java时,还编辑了主路径下的module- info.java。这意味着在主模块info.java中,我发现该替代已更改为de.test.tp.test- 当我修复该问题(在Eclipse编辑器中)时,无法保存该文件。当我在外部编辑器中修复该问题并刷新/清理该项目时,eclipse仍然告诉我de.test.tp.test将不存在- 因此我必须从“标记”选项卡中手动删除错误。
test/java/
所以从我的角度来看,Eclipse 2019-03在处理Java模块方面存在一些错误。
笔记2
从下面的注释中可以看到,@ howIger将其报告为Eclipse中的错误。
注3
在我看来,它现在已在Eclipse 2019-06中修复:)
该错误表明存在 一个以上 包含该软件包的org.apache.logging.log4j 模块 (可能是一个JAR)(或更精确地说,可以从中访问该软件包)。 Java平台模块系统 (JPMS) 不允许 这样做。但是在这种情况下,只有一个JAR包含该软件包,因此 在Eclipse 2019-03(4.11)中会错误地显示 此 错误 。看到:
Eclipse错误546315 -Java编辑器中错误显示“从多个模块可以访问包[…]:,[…]”错误
作为 此错误的 解决方法 ,请执行以下任一操作:
module-info.java
requires org.apache.logging.log4j.core;
默认情况下,所有Maven依赖项都位于类路径上。在module-info.java该行中,requires org.apache.logging.log4j;将带有org.apache.logging.log4j模块的JAR 拉到modulepath上。该错误错误地指出,在类路径上(因此在 未命名 模块中)还有另一个JAR 也包含package org.apache.logging.log4j。请注意,modules- info.test(带有文件扩展名.test)既不是Java也不是Maven,因此对于Eclipse仅是文本文件。
requires org.apache.logging.log4j;
modules- info.test
.test
多模块支持 :在您的情况下,您只有一个module-info.java,这意味着您只有一个Java模块。在Eclipse中 ,每个Java模块都需要一个Java项目 (因为每个模块都有其自己的依赖性)。