Java 使用依赖项和测试在Maven中生成jar文件

Java 使用依赖项和测试在Maven中生成jar文件,java,maven,jar,pom.xml,Java,Maven,Jar,Pom.xml,我在pom.xml中使用这段代码来创建一个jar文件 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <excludes> <

我在pom.xml中使用这段代码来创建一个jar文件

   <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <configuration>
            <excludes>
                <exclude>**/log4j.properties</exclude>
            </excludes>
            <archive>
                <manifest>
                    <mainClass>test.LeanFTest</mainClass>
                </manifest>
            </archive>
        </configuration>
    </plugin>
pom.xml
文件:

<?xml version="1.0" encoding="UTF-8"?>
<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>groupId</groupId>
    <artifactId>LeanFT</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>Mytest</name>
    <description>Regression test</description>

    <properties>
        <leanftsdk>C:/Program Files (x86)/HPE/Unified Functional Testing/SDK/Java/</leanftsdk>
        <maven.test.skip>true</maven.test.skip>
    </properties>

    <dependencies>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.14.3</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-core</artifactId>
            <version>1.3</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>com.hp.lft</groupId>
            <artifactId>sdk</artifactId>
            <version>14.0.0</version>
            <scope>system</scope>
            <systemPath>${leanftsdk}/com.hp.lft.sdk-standalone.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>com.hp.lft</groupId>
            <artifactId>report</artifactId>
            <version>14.0.0</version>
            <scope>system</scope>
            <systemPath>${leanftsdk}/com.hp.lft.report.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>com.hp.lft</groupId>
            <artifactId>unittesting</artifactId>
            <version>14.0.0</version>
            <scope>system</scope>
            <systemPath>${leanftsdk}/com.hp.lft.unittesting.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>com.hp.lft</groupId>
            <artifactId>verifications</artifactId>
            <version>14.0.0</version>
            <scope>system</scope>
            <systemPath>${leanftsdk}/com.hp.lft.verifications.jar</systemPath>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>build-helper-maven-plugin</artifactId>
                <version>1.10</version>
                <executions>
                    <execution>
                        <id>add-source</id>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>add-source</goal>
                        </goals>
                        <configuration>
                            <sources>
                                <source>appmodels</source>
                            </sources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>test.LeanFTest</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <skipTests>true</skipTests>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

4.0.0
groupId
利恩夫特
1.0-快照
罐子
我的测试
回归试验
C:/ProgramFiles(x86)/HPE/Unified Functional Testing/SDK/Java/
真的
log4j
log4j
1.2.17
org.testng
testng
6.14.3
编译
org.hamcrest
汉克雷斯特岩芯
1.3
公地io
公地io
2.6
com.hp.lft
sdk
14.0.0
系统
${leanfsdk}/com.hp.lft.sdk-standalone.jar
com.hp.lft
报告
14.0.0
系统
${leanfsdk}/com.hp.lft.report.jar
com.hp.lft
单元测试
14.0.0
系统
${leanfsdk}/com.hp.lft.unittesting.jar
com.hp.lft
核实
14.0.0
系统
${leanfsdk}/com.hp.lft.verifications.jar
org.apache.maven.plugins
maven编译器插件
1.7
1.7
org.codehaus.mojo
构建助手maven插件
1.10
添加源
生成源
添加源
应用模型
maven汇编插件
test.leanfest
带有依赖项的jar
org.apache.maven.plugins
maven surefire插件
真的
要创建uber jar(如评论中所述),可以使用插件。这个插件将生成一个JAR,其中包含项目类以及依赖JAR中的所有类


注意:带有预定义的带有依赖项的
jar
的Maven assembly插件将在未分类的jar旁边生成一个带有固定分类器(
jar with dependencients
)的uber jar。似乎不可能覆盖它(除了定义自定义程序集之外)。

我的解决方案是构建一个存档(zip或其他格式),其中包含jar中的类、依赖项jar、一个包含运行时配置文件和脚本的文件夹,以启动应用程序。其作用范围是只需解压缩归档文件,即可获得一个可运行的应用程序

构建的存档内容是:

artifactId-version.zip:
<artifactId folder>
    ├─ config
    |    ├─ log4j2.xml
    ├─ lib
    |    ├─ <all dependencies jars>
    ├─ leanft.cmd
    ├─ leanft.sh
    └─ artifactId-version.jar

您需要在maven程序集插件中指定执行阶段。使用以下maven程序集插件配置

     <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
            <archive>
                <manifest>
                    <mainClass>test.LeanFTest</mainClass>
                </manifest>
            </archive>
            <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
        </configuration>
        <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
        </executions>
    </plugin>

maven汇编插件
test.leanfest
带有依赖项的jar
包裹
单一的

现在只需在project pom.xml(根目录)上运行
mvn包
,您就可以通过artifactId加上“jar with dependencies”后缀获得一个完全组装好的jar

@SagarRohankar可能重复:看起来不一样。@plaidshirt请完整描述项目结构并发布所有pom.xml文件。另外,放置控制台输出以查看何时抛出此错误消息。@catta:我更新了我的问题。@plaidshirt请将pom.xml内容和控制台输出与错误一起放置。我将Maven Shade插件添加到
pom.xml
,但在尝试使用生成的jar文件时,收到另一条错误消息:
线程“main”中的异常java.lang.NoClassDefFoundError:javax/jms/JMSException
,它似乎是JEE的一部分,并且似乎不包含在依赖项中。你可能想把它包括在内。请参阅,例如,对于我不确定的正确工件,如果缺少依赖项,为什么直接从IDE执行成功。也许IDE中的类路径设置与pom不完全匹配?e、 g.Eclipse维护一个单独的类路径定义,其中包括(如果使用Maven插件)pom中的所有DEP,仍然可以选择其他项(例如,服务器运行时,其中将包含代码JEE类)。在尝试使用jar文件后,我收到错误消息:
线程“main”中的异常java.lang.NoClassDefFoundError:javax/jms/JMSException
我使用HP TestExportTool来执行它:
java-jar-classpath:‑framework:TestNG
此代码生成了一个包含jar的单独的lib文件夹和一个包含lib命名文件夹和jar文件的zip文件。难道不可能将其生成为单个jar文件吗?@plaidshirt我必须研究是否可以使用此解决方案生成一个uber jar,但我的问题是,您为什么需要这样的解决方案?为什么所有东西都在里面的zip对您不好?我看到HP TestExportTool无法处理这个问题,这就是为什么我需要一个单一的jar解决方案。
artifactId-version.zip:
<artifactId folder>
    ├─ config
    |    ├─ log4j2.xml
    ├─ lib
    |    ├─ <all dependencies jars>
    ├─ leanft.cmd
    ├─ leanft.sh
    └─ artifactId-version.jar
<maven_module_root>
├─ src
|   ├─ main
|   |    ├─ assembly
|   |    |    ├─ leanft-assembly.xml
|   |    ├─ java
|   |    |    ├─ <your classes content>
|   |    ├─ resources
|   |    |    ├─ log4j2.xml
|   |    |    ├─ <your runtime configuration files>
|   |    ├─ scripts
|   |    |    ├─ leanft.cmd
|   |    |    ├─ leanft.sh
│   └───test
├─ pom.xml
<assembly
    xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
    <id>dist</id>
    <formats>
        <!-- <format>tar.gz</format> -->
        <format>zip</format>
    </formats>
    <includeBaseDirectory>true</includeBaseDirectory>
    <baseDirectory>${project.artifactId}</baseDirectory>
    <fileSets>
        <fileSet>
            <directory>${project.build.directory}</directory>
            <outputDirectory>/</outputDirectory>
            <includes>
                <include>${project.artifactId}-${project.version}.jar</include>
            </includes>
        </fileSet>
        <fileSet>
            <directory>${project.build.directory}/lib</directory>
            <outputDirectory>/lib</outputDirectory>
            <includes>
                <include>*.*</include>
            </includes>
        </fileSet>
        <fileSet>
            <directory>${project.build.outputDirectory}</directory>
            <outputDirectory>/config</outputDirectory>
            <includes>
                <include>log4j2.xml</include>
            </includes>
        </fileSet>
        <fileSet>
            <directory>${project.basedir}/src/main/scripts</directory>
            <outputDirectory>/</outputDirectory>
            <includes>
                <include>leanft.*</include>
            </includes>
        </fileSet>
    </fileSets>
</assembly>
    <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>
%JAVA_HOME%\bin\java %JVM_ARGS% -cp %SCRIPT_DIR%\*;%SCRIPT_DIR%\config\ test.LeanFTest
     <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
            <archive>
                <manifest>
                    <mainClass>test.LeanFTest</mainClass>
                </manifest>
            </archive>
            <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
        </configuration>
        <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
        </executions>
    </plugin>