[英]Eclipse 2019-03 regarding Java modules and maven
我有一個基於 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
導入。
所以問題是,如何解決這個問題?
更新 1
我真正想要的是一個基於 maven、在 eclipse 中工作並支持白盒和黑盒測試的 java 模塊項目的清晰項目結構。 有人可以給我這樣的項目骨架嗎?
更新 2
還是我在某些文章中讀到的 eclipse 沒有多模塊支持的問題? - 這也會讓我回到更新 1 的問題。
更新 3
縮短整個問題並添加完整(縮短)的文件內容。
注 1
在我所有的測試中,例如在test/java/
下有幾秒鍾的 module-info.java 我發現 eclipse 2019-03 非常不穩定並且有錯誤! 例如 - 有時在嘗試刪除測試中的 module-info.java 時 - Eclipse 無法刪除它。 另一個效果是,當使用測試路徑 eclipse 編輯 module-info.java 時,也會編輯主路徑下的 module-info.java。 這意味着在主 module-info.java 中,我發現 exort 已更改為 de.test.tp.test - 當我修復(在 eclipse 編輯器中)時,我無法保存文件。 當我在外部編輯器中修復並刷新/清理項目時,eclipse 仍然告訴我 de.test.tp.test 不存在 - 所以我必須從標記選項卡中手動刪除錯誤。
因此,從我的角度來看,eclipse 2019-03 在處理 java 模塊方面存在一些錯誤。
筆記2
正如您從下面的評論中看到的,@howIger 已將此報告為Eclipse 中的錯誤。
注 3
在我看來,它現在已經在 eclipse 2019-06 中修復了:)
該錯誤表示有多個模塊(可能是 JAR)包含包org.apache.logging.log4j
(或者更准確地說,可以從中訪問該包)。 這在 Java 平台模塊系統(JPMS) 中是不允許的。 但是在這種情況下,只有一個 JAR 包含該包,因此在 Eclipse 2019-03 (4.11) 中錯誤地顯示了此錯誤。 看:
Eclipse 錯誤 546315 - “包 [...] 可從多個模塊訪問:,[...]”錯誤顯示在 Java 編輯器中
作為此錯誤的解決方法,請執行以下操作之一:
module-info.java
添加行requires org.apache.logging.log4j.core;
它在模塊路徑上拉取所有相關的 JAR 默認情況下,所有 Maven 依賴項都在類路徑上。 在module-info.java
該行requires org.apache.logging.log4j;
使用模塊路徑上的org.apache.logging.log4j
模塊拉取 JAR。 該錯誤錯誤地指出類路徑上(因此在未命名模塊中)還有另一個 JAR,它也包含包org.apache.logging.log4j
。 請注意, modules-info.test
(文件擴展名為.test
)既不是 Java 也不是 Maven 的東西,因此對於 Eclipse 來說只是一個文本文件。
多模塊支持:在您的情況下,您只有一個module-info.java
,這意味着您只有一個 Java 模塊。 在 Eclipse 中,每個 Java 模塊都需要一個 Java 項目(因為每個模塊都有自己的依賴項)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.