1. 程式人生 > >如何正確地實現Java模塊與inter-module Maven構建測試依賴關系

如何正確地實現Java模塊與inter-module Maven構建測試依賴關系

介紹 項目創建 info 是我 error 正常 default failed symbol

我有一個多模塊使用Maven和Java項目。 我現在想遷移到Java 9/10/11和實現模塊(如JSR 376:Java平臺模塊系統)。 隨著項目已經由Maven模塊,和依賴直,為項目創建模塊描述符很直接。

現在每個Maven模塊有自己的模塊描述符(module-info.java),在src/main/java文件夾中。 沒有測試類的模塊描述符。

然而,我偶然發現了我一直未能解決的問題,並沒有找到任何描述如何解決:我怎麽能有inter-module嗎測試與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做一些“魔法”測試的範圍內執行模塊,它不會在我依賴的模塊測試工作(由於某種原因)。 我怎麽解決這個問題?

項目的結構是這樣的:

├───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>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
註:以上是我創建的一個項目來證明這個問題。 我將試著更新完整項目的問題。 真正的項目是一個復雜多了在這裏找到,但還沒有模塊化的主分支。

PS:代碼本身沒有什麽錯,一切使用正常的類路徑(即編譯並運行。 在IntelliJ)。 介紹了問題的模塊。

如何正確地實現Java模塊與inter-module Maven構建測試依賴關系