Eclipse 2019-03, касающийся модулей Java и maven - PullRequest
1 голос
/ 08 апреля 2019

У меня есть проект maven (3.6.0), основанный на Java 11 со следующей структурой (которая отлично работает в командной строке!):

src/main/java/
  module-info.java
  /de/test/tp/TP.java

src/test/java/
  /de/test/tp/test/TPTests.java

Модуль-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 . После перекомпиляции затмение говорит мне:

The package org.apache.logging.log4j is accessible from more than one module: <unnamed>, org.apache.logging.log4j

для обоих org.apache.logging.log4j импортов.

Итак, вопрос в том, как это исправить?

Обновление 1

Что мне действительно нужно, так это четкая структура проекта для проекта java-модулей, основанная на maven, работающая в eclipse и поддерживающая тестирование белого и черного ящиков. Может кто-нибудь дать мне такой скелет проекта?

Обновление 2

Или моя проблема в том, что у eclipse нет многомодульной поддержки, как я читал в некоторых статьях? - Что также привело бы меня к вопросу об обновлении 1.

Обновление 3

Сократил весь вопрос и добавил полное (сокращенное) содержимое файла.

Примечание 1

Во время всех моих испытаний, например, с наличием секунд module-info.java под test/java/, я обнаружил, что eclipse 2019-03 очень нестабилен и имеет ошибки! Например - Иногда при попытке удалить тестируемый модуль-info.java - Eclipse не смог удалить его. Другой эффект состоял в том, что при редактировании module-info.java с помощью тестового пути eclipse также редактировал модуль-info.java под основным путем. Это означает, что в основном модуле-info.java я обнаружил, что экспорт изменился на de.test.tp.test - когда я это исправил (в редакторе eclipse), я не смог сохранить файл. Когда я исправил это во внешнем редакторе и обновил / очистил проект, затмение все еще говорит мне, что файл de.test.tp.test не существует, поэтому я должен удалить ошибки вручную со вкладки маркера.

Так что, с моей точки зрения, в eclipse 2019-03 есть некоторые ошибки, связанные с обработкой java-модулей.

Примечание 2

Как видно из комментариев ниже, @howIger сообщил об этом как об ошибке в Eclipse .

Примечание 3

Похоже, это исправлено в затмении 2019-06:)

1 Ответ

1 голос
/ 09 апреля 2019

Ошибка говорит о том, что более одного модуля (возможно, 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; извлекает JAR с модулем org.apache.logging.log4j на пути модуля.Ошибка ошибочно указывает, что в пути к классам есть еще один JAR (и, следовательно, в безымянном модуле), который также содержит пакет org.apache.logging.log4j.Обратите внимание: modules-info.test (с расширением файла .test) не является ни Java, ни Maven, и поэтому для Eclipse только текстовый файл.

Поддержка нескольких модулей : вв вашем случае у вас есть только один module-info.java, что означает, что у вас есть только один модуль Java.В Eclipse для каждого модуля Java требуется проект Java (поскольку каждый модуль имеет свои зависимости).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...