【问题标题】:Executing Maven unit tests with classpath set to generated project JAR使用设置为生成的项目 JAR 的类路径执行 Maven 单元测试
【发布时间】:2012-08-31 04:47:56
【问题描述】:

我的应用程序中的一些单元测试与查找和操作属于应用程序本身的某些文件资源有关。 我需要在应用程序的实际生产环境中执行这些测试,将其部署为 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>

提前感谢您的帮助!

【问题讨论】:

  • 这个问题可能会有所帮助:stackoverflow.com/questions/1401857/…。要求不同(因为 OP 特别希望 JAR 在类路径中关闭),但也许它会提供一些提示。
  • 这个问题解决了吗?

标签: java maven classpath


【解决方案1】:

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

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

有许多教程用于设置 Maven 以运行集成测试。 Herehere 是一些初学者。 failsafe plugin 通常用于执行集成测试。

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

【讨论】:

  • +1 感谢您的澄清,但是,这个简单的问题比我预期的要复杂得多。一个问题,你的回答解释了为什么 jar 不能添加到类路径中,但它没有解释为什么 ${project.build.outputDirectory} 没有从类路径中排除(测试成功使用该类路径),有什么问题吗我的 classpathDependencyExclude 元素?
  • ClasspathDependencyExcludes 仅排除 依赖项,它们采用 groupId:artifactId 的形式。如果您将插件配置选项 classesDirectory(默认为 ${project.build.outputDirectory})设置为其他不存在的目录,这样您的类目录不包含在类路径中,它可能会起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-16
  • 2013-09-02
相关资源
最近更新 更多