如何在Java测试的类路径上放置maven zip依赖项

时间:2014-10-03 09:35:10

标签: java unit-testing maven dependencies

我有一个完全由maven管理的junit / integration测试组成的Java项目。其中一个依赖项是zip存档,我希望在运行测试时在类路径中提供其内容。自maven does not put the content of a zip dependency on the classpath以来,我不得不提出我认为是一种愚蠢的解决方法。我将zip存档解压缩到临时目录,然后将其中一个结果目录复制到/test-classes文件夹中。我还必须使clean步骤删除临时目录。以下是pom的相关部分:

<groupId>com.my.package</groupId>
<artifactId>test-project</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>My Test Project</name>

<properties>
    <config.artifactId>environment-dev</config.artifactId>
    <config.version>2.0.8-SNAPSHOT</config.version>
    <tempDir>${project.basedir}/temp</tempDir>
</properties>

<build>
    <plugins>
        ...
        <!-- clean out our custom temp directory as well as the default dir during clean phase-->
        <plugin>
            <artifactId>maven-clean-plugin</artifactId>
            <version>2.3</version>
            <configuration>
                <filesets>
                    <fileset>
                        <directory>${tempDir}</directory>
                    </fileset>
                </filesets>
            </configuration>
        </plugin>
        <!-- since the config dependency is a zip it does not get added to the classpath.  So we extract
        it to a temp dir, then copy the content we need into a directory on the classpath -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.8</version>
            <executions>
                <execution>
                    <id>unpack-config</id>
                    <phase>compile</phase>
                    <goals><goal>unpack-dependencies</goal></goals>
                    <configuration>
                        <includeGroupIds>com.my.package.config</includeGroupIds>
                        <includeArtifactIds>${config.artifactId}</includeArtifactIds>
                        <includeClassifiers>config</includeClassifiers>
                        <outputDirectory>${tempDir}</outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <!-- copy the content of the zip file that we extracted into a directory on the classpath -->
        <plugin>
            <artifactId>maven-resources-plugin</artifactId>
            <version>2.6</version>
            <executions>
                <execution>
                    <phase>compile</phase>
                    <goals><goal>copy-resources</goal></goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/test-classes/TargetDir</outputDirectory>
                        <resources>
                            <resource>
                                <directory>${tempDir}/${config.artifactId}-${config.version}/TargetDir</directory>
                                <filtering>true</filtering>
                            </resource>
                        </resources>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
<dependencies>
    ...
    <dependency>
        <groupId>com.my.package.config</groupId>
        <artifactId>${config.artifactId}</artifactId>
        <version>${config.version}</version>
        <classifier>config</classifier>
        <type>zip</type>
    </dependency>
</dependencies>

必须有更好的方法。

我可以强制maven将zip文件视为jar吗?我提供的链接有一个诱人的提示,这可能曾经是可能的,但我在文档中找不到任何相关内容。这似乎是一件很简单的事情,我真的希望我在某个地方错过了一个配置参数。任何人都可以建议一种更好的方法来获取zip依赖的内容到类路径?

1 个答案:

答案 0 :(得分:3)

我会将依赖项解压缩到target目录的子目录中,并将该目录添加到surefire插件的additionalClasspathElements配置中。

<properties>
    <config.artifactId>environment-dev</config.artifactId>
    <config.version>2.0.8-SNAPSHOT</config.version>
    <unzipDir>${project.build.directory}/addTestClasspath</unzipDir>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.8</version>
            <executions>
                <execution>
                    <id>unpack-config</id>
                    <phase>compile</phase>
                    <goals><goal>unpack-dependencies</goal></goals>
                    <configuration>
                        <includeGroupIds>com.my.package.config</includeGroupIds>
                        <includeArtifactIds>${config.artifactId}</includeArtifactIds>
                        <includeClassifiers>config</includeClassifiers>
                        <outputDirectory>${unzipDir}</outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.17</version>
            <configuration>
                <additionalClasspathElements>
                    <additionalClasspathElement>${unzipDir}</additionalClasspathElement>
                </additionalClasspathElements>
            </configuration>
        </plugin>
    </plugins>
</build>

在这种情况下,您可以省略clean plugin配置,因为所有内容都在target文件夹下,默认情况下将被clean插件删除。

可悲的是,此配置仅适用于命令行,而不适用于eclipse,因为m2e插件不支持additionalClasspathElement。请参阅jira问题MNGECLIPSE-1213