簡體   English   中英

Eclipse 2019-03 關於 Java 模塊和 maven

[英]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
  • 忽略錯誤(因為它不會阻止編譯代碼)
  • 降級到 Eclipse 2018-12 (4.10) 或等到 Eclipse 2019-06 (4.12)

默認情況下,所有 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM