如何运行构建后生成的maven项目的jar文件?
Posted
技术标签:
【中文标题】如何运行构建后生成的maven项目的jar文件?【英文标题】:How to run jar file of a maven project generated after build? 【发布时间】:2020-04-06 20:36:09 【问题描述】:我做了一个简单的项目,其中包含一些测试,我希望能够在其他计算机上启动测试。我在 Eclipse 中使用 Run As -> Maven build... -> Goals: package 构建了项目,我在 Eclipse 中找到了一个 jar 文件项目的目标文件夹。但是当我尝试使用 java -jar project.jar
在 cmd 中运行它时,我收到以下错误:
错误:在 com.example.TestPurchase 类中找不到主方法,请将主方法定义为: 公共静态无效主要(字符串 [] 参数) 或者 JavaFX 应用程序类必须扩展 javafx.application.Application
据我所知,TestNG 不需要任何 Main 方法,因为有注释。 这让我想到了一些问题:
-
我构建项目的方式有问题吗?
我对通过 jar 文件执行测试的方法理解正确吗?
我什至必须使用那个 jar 文件吗?因为我可以使用
mvn test
从项目文件夹中的命令行运行测试
这是我的 pom.xml 文件:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>Sightsy</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
<selenium.version>3.12.0</selenium.version>
<testng.version>6.13.1</testng.version>
<javafaker.version>0.14</javafaker.version>
<guava.version>23.2-jre</guava.version>
<extentreports.version>3.0.7</extentreports.version>
<extenttestng.version>1.3.1</extenttestng.version>
<assertj.version>3.8.0</assertj.version>
<maven.compiler.version>3.7.0</maven.compiler.version>
<commons.version>3.7</commons.version>
<commons.io.version>2.6</commons.io.version>
</properties>
<dependencies>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>$selenium.version</version>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>$testng.version</version>
</dependency>
<dependency>
<groupId>com.github.javafaker</groupId>
<artifactId>javafaker</artifactId>
<version>$javafaker.version</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>$guava.version</version>
</dependency>
<dependency>
<groupId>com.aventstack</groupId>
<artifactId>extentreports</artifactId>
<version>$extentreports.version</version>
</dependency>
<dependency>
<groupId>com.vimalselvam</groupId>
<artifactId>testng-extentsreport</artifactId>
<version>$extenttestng.version</version>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>$assertj.version</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>$commons.version</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>$commons.io.version</version>
</dependency>
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>3.4</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-core</artifactId>
<version>1.2.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>$maven.compiler.version</version>
<configuration>
<source>$java.version</source>
<target>$java.version</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.example.TestPurchase</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.21.0</version>
<configuration>
<suiteXmlFiles>
<suiteXmlFile>src/main/resources/suites/testng.xml</suiteXmlFile>
</suiteXmlFiles>
</configuration>
</plugin>
</plugins>
</build>
【问题讨论】:
根据您的 build.xml,jar 本身不包含测试文件。要运行测试,您只需要运行“mvn test”,假设您计划启动测试的其他计算机具有代码库。 Ikeban 的回答几乎涵盖了它。如果您发现自己确实需要 jar / 中的测试路径中的代码作为 Maven 依赖项:maven.apache.org/plugins/maven-jar-plugin/examples/… 通常你不需要 TestNG 中的套件文件,因为测试将根据它们的名称来识别,例如用于单元测试的*Test.java
和用于集成测试的 *IT.java
。基于 selenium,我会投票支持集成测试,您应该使用 failsafe-plugin 来运行它们,而不是万无一失...
【参考方案1】:
我不熟悉TestNG框架,但我的理解如下:
当“mvn package”被执行时,你的项目被“验证”、“编译”然后“打包”。在编译期间,您的代码将更改为字节码,并且可以由 Java 虚拟机 (JVM) 解释(执行)。这个编译后的代码只有你的应用程序(我假设这是一个在 Java 服务器上执行的应用程序)。
在“打包”步骤中,这些已编译的类(没有测试)被放在 jar 文件中。这个 jar 文件应该只包含您的应用程序(同样,没有测试) - 这是您想要的,因为您的 jar 文件更小并且只包含真正需要的内容。
现在当“mvn test”被执行时,带有测试代码的类被编译然后执行。 TestNG “自动”添加主函数,以便 JVM 知道该做什么。请注意,再次运行“mvn package”仍然不会在 jar 文件中包含这些测试。
直接解决您的问题: 广告 1. 没有 广告 2. 是的,“mvn test”是正确的方法。 广告 3. 不,您不应该在测试期间使用 jar 文件。稍后在部署期间使用它。
【讨论】:
【参考方案2】:首先,您必须有一个带有“main”方法的单独类,您将在其中指定您的 xml 套件文件。
package com.example;
import java.util.ArrayList;
import java.util.List;
import org.testng.TestNG;
public class MainClass
public static void main(String[] args)
TestNG testSuite = new TestNG();
List<String> suites = new ArrayList<String>();
suites.add("path_to_your_xml_suite_file_in_target_folder");
testSuite.setTestSuites(suites);
testSuite.run();
然后,您需要在 pom.xml 中的 maven-shade-plugin 配置中使用“main”方法指定此类
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.example.TestNGMainClass</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
然后,当您在不执行测试的情况下执行mvn build package
时,您将在目标文件夹中拥有一个完全工作的可执行jar 文件,您可以使用java -jar name_of_you_jar_file.jar
在命令行中启动它。它需要驱动程序和 xml 套件文件才能工作
【讨论】:
以上是关于如何运行构建后生成的maven项目的jar文件?的主要内容,如果未能解决你的问题,请参考以下文章