执行Maven单元测试,并将classpath设置为生成的项目JAR

时间:2012-08-30 13:30:33

标签: java maven classpath

我的应用程序中的某些单元测试与查找和操作属于应用程序本身的某些文件资源有关。 我需要在应用程序的实际生产设置中执行这些测试,它将其部署为JAR文件,而不是展开的目录。

我如何指示Maven执行我的单元测试,考虑作为项目生成jar文件(以及任何其他声明的库依赖项)的类路径而不是默认情况下文件系统中的编译类?

换句话说,现在我的单元测试的类路径设置为:/$PROJECTPATH/target/classes/

相反,我希望将此类路径设置为:/$PROJECTPATH/target/myjarfile.jar

我尝试过手动添加和删除依赖项类,如下所述: http://maven.apache.org/plugins/maven-surefire-plugin/examples/configuring-classpath.html ,但直到现在它还没有用。

我目前的项目POM如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.mygroupid</groupId>
  <artifactId>myartifact</artifactId>
  <version>0.0.1-SNAPSHOT</version>

  <dependencies>
      ...
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.1</version>
        <configuration>
        <source>1.7</source>
        <target>1.7</target>
        </configuration>
      </plugin>

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-source-plugin</artifactId>
        <version>2.1.2</version> 
        <executions>
          <execution>
            <id>attach-sources</id>
            <goals>
              <goal>jar</goal>
            </goals>
          </execution>
        </executions>
      </plugin>

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>2.4</version>

        <configuration>
              <includeScope>runtime</includeScope>
              <outputDirectory>${project.build.directory}/lib</outputDirectory>
        </configuration>

        <executions>
          <execution> 
            <id>copy-dependencies</id>
            <phase>process-resources</phase>
            <!-- <phase>package</phase>  -->
            <goals>
              <goal>copy-dependencies</goal>
            </goals>

          </execution>
        </executions>
      </plugin>

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.12.3</version>
        <configuration>
              <classpathDependencyExcludes>
                <classpathDependencyExclude>
                  ${project.build.outputDirectory}
                </classpathDependencyExclude>
              </classpathDependencyExcludes>

              <additionalClasspathElements>
                <additionalClasspathElement>
              ${project.build.directory}/${project.build.finalName}.${project.packaging}
                </additionalClasspathElement>
              </additionalClasspathElements>
        </configuration>
      </plugin>

    </plugins>

  </build>
</project>

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:4)

作为测试生命周期阶段的一部分执行的标准单元测试无法看到项目JAR,因为test阶段在package阶段之前执行,因此您的测试在Maven生成JAR之前运行。有关生命周期阶段及其顺序的列表,请参阅this page

您希望它将您的测试作为集成测试运行,该测试在integration-test阶段执行。

有许多教程可以设置Maven来运行集成测试。 Herehere是两个先发者。 failsafe plugin通常用于执行集成测试。

我无法准确地记得集成测试是否在类路径中使用target/classes或项目的JAR文件。但如果不是,您可以随时创建另一个Maven项目,在那里添加测试并将主项目添加为此集成测试项目的依赖项。在某些情况下,这可能比在主项目中使用集成测试阶段更可取,如果它不仅仅是标准的Java库,例如,如果您正在编写注释处理器。