Скажем, у меня есть проект Java с использованием Maven 3 и junit. Существуют каталоги src/main/java
и src/test/java
, которые содержат основные источники и источники тестов, соответственно (все стандартно).
Теперь я хочу перенести проект на Java 9. src/main/java
контент представляет собой модуль Java 9; есть com/acme/project/module-info.java
, выглядящий примерно так:
module com.acme.project {
require module1;
require module2;
...
}
Что, если тестовый код нуждается в module-info.java
? Например, чтобы добавить зависимость от некоторого модуля, который необходим только для тестов, а не для производственного кода. В таком случае я должен положить module-info.java
в src/test/java/com/acme/project/
, давая модулю другое имя. Таким образом, Maven, по-видимому, рассматривает основные источники и источники тестирования как разные модули, поэтому мне приходится экспортировать пакеты из основного модуля в тестовый модуль и потребовать пакеты в тестовом модуле, например:
главный модуль (в src/main/java/com/acme/project
):
module prod.module {
exports com.acme.project to test.module;
}
тестовый модуль (в src/test/java/com/acme/project
):
module test.module {
requires junit;
requires prod.module;
}
Это создает
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:testCompile (default-testCompile) on project test-java9-modules-junit: Compilation failure: Compilation failure:
[ERROR] /home/rpuch/git/my/test-java9-modules-junit/src/test/java/com/acme/project/GreeterTest.java:[1,1] package exists in another module: prod.module
потому что один пакет определен в двух модулях. Так что теперь у меня должны быть разные проекты в основном модуле и тестовом модуле, что неудобно.
Я чувствую, что следую неправильному пути, все начинает выглядеть очень уродливо. Как я могу использовать module-info.java
в тестовом коде, или как мне достичь тех же эффектов (require
и т.д.) Без него?