[英]How to add test-jar and jar as dependency in a maven multimodule project?
[英]Maven: Missing dependency when using test-jar at runtime
我的Maven項目foo.web
的源文件位於src/main
,測試源位於src/test
。 當然,測試類使用“主要”類。 現在我想在運行時使用另一個項目的測試類,所以我遵循這些說明如何創建一個測試罐子。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
這非常完美,創建了一個類似web-SNAPSHOT-tests.jar
的jar,我可以將其包含在其他項目中。
<dependency>
<groupId>foo</groupId>
<artifactId>web</artifactId>
<version>SNAPSHOT</version>
<type>test-jar</type>
</dependency>
但是似乎對web-SNAPSHOT
的依賴關系未正確設置,因為在運行時,我收到foo.web
中可用的類的NoClassDefFoundErrors。 因此,我添加了另一個依賴項:
<dependency>
<groupId>foo</groupId>
<artifactId>web</artifactId>
<version>SNAPSHOT</version>
<type>war</type>
<scope>runtime</scope>
</dependency>
不幸的是,這沒有改變。 有人知道這是怎么回事嗎?
WAR檔案的結構與JAR不同。 在Tomcat或JBoss之類的應用程序服務器中運行時,該服務器將正確處理WAR。 由於您在服務器外部運行,因此將像普通的JAR存檔一樣使用工件。 由於WAR對.class
文件使用不同的位置,因此在運行時會引發NoClassDefFoundError
。
在JAR中, com.example.Foo
類將存儲在/com/example/Foo.class
。 由於WAR設計為包含庫,資源等,因此不應相對於檔案的根目錄存儲類。 相反,它們包含在文件夾/WEB-INF/classes
, Foo
將存儲為/WEB-INF/classes/com/example/Foo.class
。
幸運的是,Maven開發人員想到了這個問題,並向WAR插件添加了attachClasses
選項。 此選項使用classes
分類器創建一個附加的JAR,該分類器僅包含JAR格式的Java類(相對於歸檔根)。
要啟用此JAR的構建,可以在WAR項目的build
部分中使用以下代碼段(除了用於構建測試JAR的maven-jar-plugin
的配置之外):
<pluginManagement>
<plugins>
<!-- … -->
<plugin>
<!-- build the classes JAR (non-test classes) -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.4</version>
<configuration>
<attachClasses>true</attachClasses>
</configuration>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<!-- … -->
<plugin>
<!-- build the test JAR (test classes) -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
由於這些類是附加的 ,因此它們將由Maven與WAR工件一起安裝和部署。 請注意,這僅為您提供常規WAR存檔的內容,要使用測試類,您需要同時依賴類工件和測試jar。 為此,您可以使用:
<dependencies>
<!-- … -->
<dependency>
<!-- test classes only -->
<groupId>foo</groupId>
<artifactId>web</artifactId>
<version>SNAPSHOT</version>
<type>test-jar</type>
</dependency>
<dependency>
<!-- non-test classes only -->
<groupId>foo</groupId>
<artifactId>web</artifactId>
<version>SNAPSHOT</version>
<type>jar</type>
<classifier>classes</classifier>
<scope>runtime</scope>
</dependency>
</dependencies>
嘗試:
<dependency>
<groupId>foo</groupId>
<artifactId>web</artifactId>
<version>SNAPSHOT</version>
<type>war</type>
<classifier>tests</classifier>
<scope>test</scope>
</dependency>
Maven允許您進行一些有關快照依賴性的配置
<repository>
<id>foo-repository</id>
<url>...</url>
<snapshots>
<enabled>true</enabled>
<updatePolicy>XXX</updatePolicy>
</snapshots>
檢查以上配置。 如果在pom.xml中為false,則maven不會更新快照。 此外,您還將發現以下對查詢有用的線程什么是Maven快照,為什么我們需要它?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.