关于Java模块和maven的Eclipse 2019-03

问题描述 投票:1回答:1

我有一个基于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");
   }
 }

TP tests.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依赖项放到类路径中。重新编译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没有多模块支持? - 这也会让我回到更新1的问题。

更新3

缩短整个问题并添加完整(缩短)的文件内容。

注1

在我所有的测试中,例如在test/java/下有一个秒module-info.java,我发现eclipse 2019-03非常不稳定并且有bug!例如 - 有时在尝试删除测试中的module-info.java时 - Eclipse无法删除它。另一个影响是,当使用测试路径eclipse编辑module-info.java时,还要编辑主路径下的module-info.java。这意味着在main module-info.java中我发现exort已经改为de.test.tp.test - 当我修复它时(在eclipse编辑器中)我无法保存文件。当我在外部编辑器中修复它并刷新/清理项目时,eclipse仍然告诉我de.test.tp.test不存在 - 所以我必须从标记选项卡手动删除错误。

所以从我的观点来看,eclipse 2019-03在处理java模块方面存在一些缺陷。

笔记2

从下面的评论中可以看出@howIger已将此报告为bug in Eclipse

注3

看起来我喜欢它现在在eclipse 2019-06修复:)

java eclipse maven junit5 java-module
1个回答
1
投票

错误说有多个模块(可能是JAR)包含org.apache.logging.log4j包(或更准确地说,包可以从中访问)。 Java平台模块系统(JPMS)中不允许这样做。但在这种情况下,只有一个JAR包含该包,因此Eclipse 2019-03(4.11)中错误地显示了此错误。看到:

Eclipse bug 546315 - "The package […] is accessible from more than one module: , […]" error shown in Java editor by mistake

作为此错误的解决方法,请执行以下操作之一:

  • 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项目(因为每个模块都有自己的依赖项)。

© www.soinside.com 2019 - 2024. All rights reserved.