我有一个使用Maven和Java的多模块项目。我现在尝试迁移到Java 9/10/11并实现模块(如
JSR 376: Java Platform Module System
,JPMS)。由于项目已经由maven模块组成,并且依赖关系是直接的,因此为项目创建模块描述符是非常直接的。
每个maven模块现在都有自己的模块描述符(
module-info.java
)
src/main/java
文件夹。没有测试类的模块描述符。
然而,我偶然发现了一个我无法解决的问题,并且没有找到任何关于如何解决的描述:
我怎么能有模块间的
测试
与Maven和Java模块的依赖关系?
在我的例子中,我有一个“公共”Maven模块,其中包含一些接口和/或抽象类(但没有具体的实现)。在同一个Maven模块中,我有
摘要
测试以确保实现这些接口/抽象类的正确行为。然后,有一个或多个子模块,其中包含接口/抽象类的实现和扩展抽象测试的测试。
但是,当尝试执行
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做了一些“魔术”来让测试在模块的范围内执行,它也不适用于我所依赖的模块中的测试(出于某种原因)。我该怎么解决这个问题?
项目的结构如下(
full demo project files available here
):
ââââ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>
注意:上面只是我创建的一个项目来演示这个问题。真正的项目要复杂得多,而且
found here
(主分支是
不
但是原理是一样的。
PS:我不认为代码本身有任何错误,因为所有的东西都是用普通类路径编译的(如在ItLiLJ中,或者是没有Java模块描述符的Maven)。用Java模块和模块路径介绍了该问题。