我有一个基于java 11的maven(3.6.0)项目,具有以下结构(在命令行上可以正常工作!):</ p>
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项目”时,日食将所有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
导入都是。
问题是,如何解决?
更新1
我真正想要的是一个基于maven的java模块项目的清晰项目结构,该项目可以在Eclipse中工作,并且支持白盒和黑盒测试。有人可以给我这样的项目框架吗?
更新2
还是我在某些文章中阅读时eclipse不支持多模块的问题? -这还会使我回到Update 1的问题。
更新3
缩短了整个问题,并添加了完整(缩短的)文件内容。
注释1
在我所有的测试中,例如,在test/java/
下有一个秒钟的module-info.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将不存在-因此我必须从“标记”选项卡中手动删除错误。
所以从我的角度来看,eclipse 2019-03在处理Java模块方面存在一些错误。
注释2
从下面的评论中可以看到,@ howIger将其报告为bug in Eclipse。
答案 0 :(得分:1)
该错误表明存在个以上的模块(可能是一个JAR),其中包含程序包org.apache.logging.log4j
(或更准确地说,从中该包是可访问的)。 在Java平台模块系统(JPMS)中是不允许的。但是在这种情况下,只有一个JAR包含该软件包,因此此错误在Eclipse 2019-03(4.11)中被错误显示。参见:
作为此错误的解决方法,请执行以下任一操作:
module-info.java
中添加行requires org.apache.logging.log4j.core;
,以将所有相关的JAR提取到模块路径上默认情况下,所有Maven依赖项都在类路径上。在module-info.java
行requires org.apache.logging.log4j;
中,将带有org.apache.logging.log4j
模块的JAR拉到modulepath上。该错误错误地指出,类路径上(因此在 unnamed 模块中)还有另一个JAR,该JAR也包含包org.apache.logging.log4j
。请注意,modules-info.test
(文件扩展名为.test
)既不是Java也不是Maven,因此对于Eclipse仅是文本文件。
多模块支持:在您的情况下,您只有一个module-info.java
,这意味着您只有一个Java模块。在Eclipse中,每个Java模块都需要一个Java项目(由于每个模块都有自己的依赖性)。