У меня есть многомодульный проект с использованием Maven и Java.Сейчас я пытаюсь перейти на Java 9/10/11 и внедрить модули (как в JSR 376: Система платформ Java , JPMS).Поскольку проект уже состоял из модулей Maven, а зависимости были прямыми, создание дескрипторов модулей для проекта было довольно простым.
Каждый модуль Maven теперь имеет свой собственный дескриптор модуля (module-info.java
), вsrc/main/java
папка.Для тестовых классов нет дескриптора модуля.
Однако я наткнулся на проблему, которую не смог решить, и не нашел описания того, как ее решить:
Как я могу иметь межмодульный проверить зависимости с модулями Maven и Java?
В моем случае у меня есть «общий» модуль Maven, который содержит некоторые интерфейсы и / или абстрактные классы (но без конкретной реализации).В том же модуле Maven у меня есть abstract тесты, чтобы гарантировать правильное поведение для реализации этих интерфейсов / абстрактных классов.Затем есть один или несколько подмодулей, с реализациями интерфейса / абстрактного класса и тестами, расширяющими абстрактный тест.
Однако при попытке выполнить фазу test
сборки Maven, субмодульпроизойдет сбой:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.0:testCompile (default-testCompile) on project my-impl-module: Compilation failure: Compilation failure:
[ERROR] C:\projects\com.example\my-module-test\my-impl-module\src\test\java\com\example\impl\FooImplTest.java:[4,25] error: cannot find symbol
[ERROR] symbol: class FooAbstractTest
[ERROR] location: package com.example.common
Я подозреваю, что это происходит, потому что тесты не являются частью модуля .И даже если Maven совершает «магию» для выполнения тестов в рамках модуля, он не работает для тестов в модуле, от которого я зависел (по какой-то причине).Как это исправить?
Структура проекта выглядит следующим образом ( полные файлы демонстрационных проектов доступны здесь ):
├───my-common-module
│ ├───pom.xml
│ └───src
│ ├───main
│ │ └───java
│ │ ├───com
│ │ │ └───example
│ │ │ └───common
│ │ │ ├───AbstractFoo.java (abstract, implements Foo)
│ │ │ └───Foo.java (interface)
│ │ └───module-info.java (my.common.module: exports com.example.common)
│ └───test
│ └───java
│ └───com
│ └───example
│ └───common
│ └───FooAbstractTest.java (abstract class, tests Foo)
├───my-impl-module
│ ├───pom.xml
│ └───src
│ ├───main
│ │ └───java
│ │ ├───com
│ │ │ └───example
│ │ │ └───impl
│ │ │ └───FooImpl.java (extends AbstractFoo)
│ │ └───module-info.java (my.impl.module: requires my.common.module)
│ └───test
│ └───java
│ └───com
│ └───example
│ └───impl
│ └───FooImplTest.java (extends FooAbstractTest)
└───pom.xml
Зависимости в my-impl-module/pom.xml
выглядит следующим образом:
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>my-common-module</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>my-common-module</artifactId>
<classifier>tests</classifier> <!-- tried type:test-jar instead, same error -->
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
Примечание. Выше приведен только проект, созданный мной для демонстрации проблемы.Реальный проект намного более сложный, и найден здесь (основная ветвь не пока что модульная), но принцип тот же.
PS: я надеваюНе думаю, что с самим кодом что-то не так, поскольку все компилируется и выполняется с использованием обычного пути к классам (т. е. в IntelliJ или Maven без дескрипторов модуля Java).Проблема возникает с модулями Java и путем к модулю.