簡體   English   中英

Maven:在運行時使用測試罐時缺少依賴項

[英]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/classesFoo將存儲為/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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM