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

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

我有一個多模組使用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)。 介紹了問題的模組。