java - 使用设置为生成的项目 JAR 的类路径执行 Maven 单元测试

标签 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>

在此先感谢您的帮助!

最佳答案

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

您希望它以集成测试的形式运行您的测试,集成测试在 integration-test 阶段执行。

有许多教程可用于设置 Maven 以运行集成测试。 Herehere是几个开胃菜。 failsafe plugin通常用于执行集成测试。

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

关于java - 使用设置为生成的项目 JAR 的类路径执行 Maven 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12198047/

相关文章:

java - 带有 Spring Webflow : ClassNotFoundException: org. springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean 的 Maven 项目

ruby-on-rails - ruby rails 4.2.0 : How to find the directories set for loading libraries etc

java - 如何将 Datanucleus 与多个 Eclipse 项目一起使用?

java - 在 Eclipse 中注释/取消注释特定格式

java - 在 Java 中实现单例模式的有效方法是什么?

Java GUI - 如何从静态方法将文本附加到 JTextArea?

java - Selenium webelement 可点击或不可点击 JAVA

maven - 可以通过使用 maven 但不使用 gradle 的 Artifact 来解决依赖关系吗?

java - 类型不匹配 : cannot convert from org. slf4j.Logger 到 org.apache.log4j.Logger

java - 在 Kubernetes ConfigMap 上托管 jar 文件