1

我的 Maven 项目foo.web有它的源文件src/mainsrc/test. 当然,测试类使用“主”类。现在我想在运行时在另一个项目中使用测试类,所以我按照这些说明来创建一个测试jar。

<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项设置不正确,因为在运行时我收到 NoClassDefFoundErrors 中可用的类foo.web。所以我添加了另一个依赖项:

<dependency>
        <groupId>foo</groupId>
        <artifactId>web</artifactId>
        <version>SNAPSHOT</version>
        <type>war</type>
        <scope>runtime</scope>
</dependency>

不幸的是,这没有任何改变。有谁知道这里有什么问题?

4

3 回答 3

5

WAR 档案的结构与 JAR 不同。在 Tomcat 或 JBoss 等应用服务器中运行时,服务器将正确处理 WAR。由于您在服务器之外运行,因此该工件将像普通 JAR 存档一样使用。因为 WAR 对.class文件使用不同的位置,所以NoClassDefFoundError在运行时会抛出 WAR。

在 JAR 中,类com.example.Foo将存储在/com/example/Foo.class. 由于 WAR 旨在包含库、资源等,因此不应相对于存档的根目录存储类。相反,它们包含在文件夹/WEB-INF/classes中,Foo将存储为/WEB-INF/classes/com/example/Foo.class.

幸运的是,Maven 开发人员想到了这个问题,并attachClasses在 WAR 插件中添加了该选项。classes此选项使用仅包含 JAR 格式的 Java 类(相对于存档根目录)的分类器创建一个附加 JAR 。

要启用此 JAR 的构建,您可以在 WAR 项目的部分中使用此代码build段(除了maven-jar-plugin构建测试 JAR 的配置):

<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>
于 2013-09-22T22:08:16.320 回答
1

尝试:

<dependency>
    <groupId>foo</groupId>
    <artifactId>web</artifactId>
    <version>SNAPSHOT</version>
    <type>war</type>
    <classifier>tests</classifier>
    <scope>test</scope>
</dependency>
于 2013-09-18T13:54:46.403 回答
0

Maven 允许您对快照依赖进行一些配置

<repository>
<id>foo-repository</id>
<url>...</url>
<snapshots>
    <enabled>true</enabled>
    <updatePolicy>XXX</updatePolicy>
</snapshots>

检查上面的配置。如果它在 pom.xml 中为 false,maven 将不会更新快照。此外,您会发现以下线程对您的查询很有用什么是 Maven 快照,我们为什么需要它?

于 2013-09-18T10:13:34.573 回答