Как использовать .classpath модульного проекта в Eclipse?

Я создал тестовый проект со следующей структурой:

baseTest
   |- src/main/java
   |  |- com.base
   |  |  |- MainDependency.java
   |  |- module-info.java
   |- src/test/java
      |- test.com.base
         |- SomeTest.java

module-info.java — это просто объявление пустого модуля:

module com.baseTest {
}

То же самое для MainDependency.java:

package com.base;

public class MainDependency {
}

SomeTest — это класс, основанный на коде из main и из JDK:

import java.util.logging.Logger;

import com.base.MainDependency;

public class SomeTest {

    String s;
    MainDependency md;
    Logger j;
}

.classpath это

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" path="src/main/java"/>
    <classpathentry kind="src" path="src/test/java"/>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER">
        <attributes>
            <attribute name="module" value="true"/>
            <attribute name="add-exports" value="java.logging/java.util.logging=ALL-UNNAMED"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="output" path="bin"/>
</classpath>

Используя приведенную выше конфигурацию, я получаю ошибку The import java.util.logging cannot be resolved. Удаление <classpathentry kind="src" path="src/main/java"/> устраняет ошибку (вероятно, потому что проект больше не считается модульным).

Я нашел ошибку 526831 в Eclipse, но похоже оттуда что на самом деле это не ошибка (?). Я делаю что-то неправильно в отношении настройки или конфигурации проекта?


person user1803551    schedule 27.01.2018    source источник
comment
Вы запускаете ошибку Eclipse 525948, которая уже исправлена, но будет выпущена с Eclipse Oxygen.3 21 марта (пока можно использовать ночную или веховую сборку).   -  person howlger    schedule 28.01.2018
comment
@howlger Я пробовал 4.8M5, и та же проблема.   -  person user1803551    schedule 28.01.2018
comment
Обязательно сначала исправьте Путь сборки Java вашего проекта (создайте новый проект, чтобы увидеть, как должен выглядеть правильный .classpath).   -  person howlger    schedule 28.01.2018
comment
@howlger Сделал это, не вижу никакой разницы.   -  person user1803551    schedule 28.01.2018
comment
Ваш .classpath говорит JUnit 5 (org.eclipse.jdt.junit.JUNIT_CONTAINER/5), но ваш код Java говорит JUnit 4 (import org.junit.Test; вместо import org.junit.jupiter.api.Test;).   -  person howlger    schedule 28.01.2018
comment
@howlger Неважно, использую ли я 4 или 5 в пути к классам.   -  person user1803551    schedule 28.01.2018
comment
Вы должны получить другую ошибку при добавлении JUnit в путь к модулям вместо пути к классам. В качестве временного решения ошибки, вызванной JAR-файлами JUnit, вам необходимо вручную добавить в проект JAR-файлы JUnit 5.0.2 или 5.0.3. См. ошибку Eclipse 529120, которая еще не исправлена. Я бы рекомендовал использовать Automatic-Module-Name вместо module-info.java (что, ИМХО, не добавляет никакой ценности).   -  person howlger    schedule 28.01.2018
comment
См. также stackoverflow.com/a/46289257/6505250.   -  person howlger    schedule 29.01.2018
comment
@howlger Это не так. Я отредактировал вопрос, чтобы удалить зависимость JUnit, потому что она кажется запутанной и использовала другую (я написал, что не имеет значения, какая это зависимость).   -  person user1803551    schedule 30.01.2018
comment
Ваша структура показывает, что module-info.java находится в папке source/, которая не является исходной папкой. Ваш файл .classpath показывает, что есть папка src/, которая также не является исходной папкой (kind="src").   -  person howlger    schedule 30.01.2018
comment
@howlger Извините, структура была написана от руки, поэтому в ней была опечатка, это /src. Должно быть правильно сейчас.   -  person user1803551    schedule 30.01.2018
comment
module-info.java должен быть либо в src/main/java, либо в src/test/java (но не в src/source)   -  person howlger    schedule 30.01.2018
comment
@howlger Видимо, я не нажал «Сохранить редактирование». Он находится под src/main/java.   -  person user1803551    schedule 30.01.2018
comment
Я предполагаю, что SomeMock (третий абзац) — это SomeTest (структура), верно? Что именно вы подразумеваете под пустым объявлением модуля?   -  person howlger    schedule 30.01.2018
comment
@howlger Да, и я добавил файл модуля.   -  person user1803551    schedule 30.01.2018
comment
Я думаю, вы спросили что-то еще. Однако см. мой ответ на ваш текущий вопрос ниже.   -  person howlger    schedule 30.01.2018


Ответы (1)


В module-info.java необходимо указать требуемый модуль java.logging (вместо <attribute name="add-exports" value="java.logging/java.util.logging=ALL-UNNAMED"/> в .classpath):

module com.baseTest {
    requires java.logging;
}

В Eclipse есть быстрое исправление (Ctrl+1): Добавить 'requires java.logging' в module-info.java.

person howlger    schedule 30.01.2018
comment
Но test не определяет модуль, поэтому он находится в безымянном модуле. Требование модуля для main не должно иметь значения. - person user1803551; 01.02.2018
comment
module-info.java для обоих пакетов, независимо от того, в какой исходной папке он находится. В настоящее время Eclipse поддерживает только один модуль для каждого проекта. Если бы Eclipse позволял использовать несколько модулей (один модуль на исходную папку), потребуются разные выходные папки для каждой исходной папки (вместо только bin, как в вашем примере). - person howlger; 01.02.2018
comment
В 3.8 уже можно определить другую выходную папку (и пометить тестовый источник атрибутом test), но, похоже, это ничего не меняет. - person user1803551; 01.02.2018
comment
Да, проект может иметь несколько выходных папок, но не (пока) несколько модулей (сейчас я не могу найти ошибку Eclipse для этого улучшения). - person howlger; 01.02.2018
comment
Итак, в конечном итоге ответ заключается в том, что Eclipse еще не поддерживает полные спецификации, и обходной путь делает то, что вы предложили в своем ответе. Да? - person user1803551; 01.02.2018
comment
В спецификации языка Java ничего не говорится о проектах. . Eclipse поддерживает несколько модулей, но в настоящее время для каждого модуля требуется один проект. Eclipse разработан с помощью Eclipse, и здесь проект не может содержать более одного пакета OSGi (также известного как подключаемый модуль Eclipse). Если вы пришли из мира Maven, вы наверняка ожидаете дополнительный уровень папок для модулей. Однако если бы вы пришли из мира Eclipse, структура папок Maven с глубокой вложенностью показалась бы вам сложной. - person howlger; 01.02.2018