【问题标题】:Package JAR from LeanFT project从 LeanFT 项目打包 JAR
【发布时间】:2018-06-22 08:25:46
【问题描述】:

我在IntelliJ IDEA 中有一个带有TestNG 框架的LeanFT 测试套件。我使用mvn install 命令生成jar 文件。当我尝试执行它时收到错误消息:

错误:无法找到或加载主类 test.LeanFTest

LeanFTest 类存在于名为 test 的包中,包含以下几行:

public class LeanFTest {
    public static void main(String[] args) throws IOException, SAXException, ParserConfigurationException {
        TestNG testNG = new TestNG();
        testNG.setTestSuites(Arrays.asList("testng.xml"));
        testNG.setPreserveOrder(true);
        testNG.run();
}

testng.xml文件:

<suite name="MyTestSuite" verbose="2" parallel="methods" thread-count="1">

    <listeners>
        <listener class-name="utils.TestNGListener"></listener>
    </listeners>

    <test name="Regression" parallel="false" >
        <classes>
            <class name="test.RegressionTest" />
        </classes>
    </test>

</suite>

我在pom.xml 中使用以下插件:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>3.0.1</version>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.directory}/lib</outputDirectory>
                <overWriteIfNewer>true</overWriteIfNewer>
                <overWriteReleases>false</overWriteReleases>
                <overWriteSnapshots>true</overWriteSnapshots>
            </configuration>
        </execution>
    </executions>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.0.2</version>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>lib/</classpathPrefix>
                <mainClass>test.LeanFTest</mainClass>
            </manifest>
        </archive>
        <excludes>
            <exclude>log4j2.xml</exclude>
        </excludes>
    </configuration>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>3.0.0</version>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <finalName>${project.artifactId}-${project.version}</finalName>
        <appendAssemblyId>false</appendAssemblyId>
        <descriptors>
            <descriptor>src/main/assembly/leanft-assembly.xml</descriptor>
        </descriptors>
    </configuration>
</plugin>

leanft-assembly.xml文件:

<?xml version="1.0"?>
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">

    <id>fat-tests</id>
    <formats>
        <format>jar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <dependencySets>
        <dependencySet>
            <outputDirectory>/</outputDirectory>
            <useProjectArtifact>true</useProjectArtifact>
            <unpack>true</unpack>
            <scope>test</scope>
        </dependencySet>
    </dependencySets>
    <fileSets>
        <fileSet>
            <directory>${project.build.directory}/test-classes</directory>
            <outputDirectory>/</outputDirectory>
            <includes>
                <include>*.class</include>
            </includes>
            <useDefaultExcludes>true</useDefaultExcludes>
        </fileSet>
    </fileSets>
</assembly>

更新: 我检查了 JAR 文件,发现它包含来自 /src/main/ 项目文件夹的文件,但不包含测试类所在的 /src/test/ 文件夹。

06.27 更新。 我的项目结构和这个示例项目中的一样:https://github.com/kohli-harshit/leanft-testng-template

【问题讨论】:

  • 有没有 RegressionTest 类?你想运行的,
  • @IshitaShah :是的,当然,它存在于名为测试的包中。

标签: java intellij-idea jar testng leanft


【解决方案1】:

LeanFTest class 必须包含 @Test annotation非 Java 主方法。 TestNG 不会调用 java main 方法。因此,无论您要调用哪个类(RegressionTest),请确保它具有要调用的@Test 注释。

您可以通过使用TestNG Run 执行脚本来检查脚本,而无需从 .XML 文件执行。

【讨论】:

  • 当我从IntelliJ IDEA 执行LeanFTest 类时,它开始执行RegressionTest。所以它在 IDE 中正常工作。
  • 您正在从 textng.xml 执行它,因此 testng 参数正在寻找 @Test 注释而不是 java main 方法。在 LEanFTest 类上使用 Test 注释运行时是否出错?
  • 我在LeanFTest类中添加了@Test注解,但没有任何变化,效果一样。
  • 我检查了 JAR 文件,发现它包含 /src/main 文件夹中的文件,但不包含测试类所在的 /src/test 文件夹。
【解决方案2】:

默认情况下,当您构建 jar 时,位于 src/test/java 下的类永远不会包含在您的 jar 中。

因此,当您尝试通过 jar 调用 TestNG 时,TestNG 显然无法找到它。

请参阅this Stackoverflow answer 了解如何构建包含测试类的 jar。

当您使用 IDE 时,TestNG 可以看到 src/main/javasrc/test/java 下的所有类,这解释了为什么事情在 IDE 内工作。

更新:我已经更新了答案,并参考了解决此问题的适当 Stack-overflow 答案。

我正在复制相关部分供您参考。

pom 文件中对应的maven-jar-pluginmaven-assembly-plugin 描述。

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <executions>
    <execution>
      <goals>
        <goal>test-jar</goal>
      </goals>
    </execution>
  </executions>
</plugin>
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>3.1.0</version>
  <executions>
    <execution>
      <id>make-assembly</id>
      <phase>package</phase>
      <goals>
        <goal>single</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <archive>
      <manifest>
        <mainClass>org.testng.TestNG</mainClass>
      </manifest>
    </archive>
    <appendAssemblyId>false</appendAssemblyId>
    <descriptors>
      <descriptor>src/test/resources/assembly.xml</descriptor>
    </descriptors>
  </configuration>
</plugin>

文件内容src/test/resources/assembly.xml

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
  <id>test-jar-with-dependencies</id>
  <formats>
    <format>jar</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <dependencySets>
    <dependencySet>
      <outputDirectory>/</outputDirectory>
      <useProjectArtifact>true</useProjectArtifact>
      <!-- we're creating the test-jar as an attachement -->
      <useProjectAttachments>true</useProjectAttachments>
      <unpack>true</unpack>
      <scope>test</scope>
    </dependencySet>
  </dependencySets>
</assembly>

现在,当您运行 mvn clean package 时,应该能够在创建的 jar 中找到您的测试类。 这里我们基本上做了两件事:

  1. 使用maven-jar-plugin,我们首先创建一个包含测试文件的jar(您应该在target/*-tests.jar下看到jar
  2. 使用maven-assembly-plugin,我们现在正在创建一个超级jar,其中包含test-jar 也作为附件,但在解压后包含它。

【讨论】:

  • 我使用链接答案中描述的maven-assembly-plugin 3.1.0,但测试类不存在于 jar 文件中。
  • @plaidshirt - 请编辑您的问题并向我们展示您的src/main/assembly/leanft-assembly.xml 文件的内容。
  • 我将文件添加到问题中。
  • 为了更好地理解问题,我也添加了示例项目。
  • @plaidshirt - 我已经用可以解决您问题的必要信息更新了我的答案。
猜你喜欢
  • 2018-10-07
  • 2014-09-06
  • 2011-10-06
  • 2017-01-21
  • 2012-01-11
  • 2019-02-15
  • 2014-11-23
  • 2018-07-30
  • 1970-01-01
相关资源
最近更新 更多