Maven 生成打包可执行jar包的方法步骤

时间:2021-05-20

最近IDEA打可执行Jar包搞了三天,一直失败,好好学习一下Maven-assembly,在此记录一下

1. 需求

项目打包,满足以下要求:

1.整个项目打一个Zip包下面包括应用程序、应用程序依赖的jar包、说明文档
2.项目打的jar包可以执行不同类里的Main函数
3.项目源码打的jar包要与依赖的第三方jar包分开
4.项目里的执行脚本也要一块打包并进行分类
5.document目录下的readme.txt放在压缩包的根目录下,其他的还放在这个目录下
6.打的jar包去掉不需要的目录(文件)

2. 开发环境

IDEA-2016 Maven3.3.9

项目的目录结构:

3. Maven打包插件介绍

assembly翻译过来就是组装、装配的意思
Maven对项目打包常用的打包插件有三种,分别是:

插件 功能 maven-jar-plugin maven 默认打包插件,用来创建 project jar maven-shade-plugin 打可执行包,executable(fat) jar maven-assembly-plugin 支持自定义打包方式

这里使用maven-jar-plugin和maven-assembly-plugin
项目目录:

每次找jar包之前先clean一下,不然的话IDEA会认为你的项目没有修改而不重新加载

另:配置文件的注释已经很详细了,这里就不另外再说明了

4. Maven使用maven-jar-plugin打可执行jar包

主要配置如下:

<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <!-- 对要打的jar包进行配置 --> <configuration> <!-- Configuration of the archiver --> <archive> <!--生成的jar中,不要包含pom.xml和pom.properties这两个文件--> <addMavenDescriptor>false</addMavenDescriptor> <!-- Manifest specific configuration --> <manifest> <!--是否要把第三方jar放到manifest的classpath中--> <addClasspath>true</addClasspath> <!--生成的manifest中classpath的前缀, 因为要把第三方jar放到lib目录下, 所以classpath的前缀是lib/--> <classpathPrefix>lib/</classpathPrefix> </manifest> </archive> <!--过滤掉不希望包含在jar中的文件--> <excludes> <!-- 排除不需要的文件夹(路径是jar包内部的路径) --> <exclude>**/assembly/</exclude> </excludes> </configuration></plugin>

完整配置见底部

5. Maven使用maven-assembly-plugin装需要打包的文件打进zip包

pom.xml下的主要配置如下:

<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.4</version> <!-- 对项目的组装进行配置 --> <configuration> <!-- 指定assembly插件的配置文件所在位置 --> <descriptors> <descriptor>src/main/resources/assembly/package.xml</descriptor> </descriptors> </configuration> <executions> <execution> <id>make-assembly</id> <!-- 将组装绑定到maven生命周期的哪一阶段 --> <phase>package</phase> <goals> <!-- 指定assembly插件的打包方式--> <goal>single</goal> </goals> </execution> </executions></plugin>

assembly插件的配置文件package.xml见底部

6. Maven生成可执行jar包及zip项目压缩包

双击执行mvn:package会生成两个包:可执行jar包和项目压缩包,因为assembly的装配配置的是绑定到这上面来的
双击执行assembly:single只生成项目压缩包

这里执行mvn:package

解压后的项目压缩包目录结构:

7. 执行jar包

解压缩生成的项目包
TestString的源码:

public class TestString { public static void main(String[] args) { String[] arr = new String[]{"aaa", "bbb", "ccc", "DDD", "EEE", "FFF"}; System.out.println(StringUtils.join(arr, "---")); }}

TestNumber的源码:

public class TestNumber { public static void main(String[] args) { Integer[] arr = new Integer[]{11, 22, 33, 44, 55, 66}; System.out.println(StringUtils.join(arr, "---")); }}

命令行运行生成的jar

java -classpath dong.jar com.dong.bigdata.TestStringjava -classpath dong.jar com.dong.bigdata.TestNumber

运行结果:

8. pom.xml配置

包含两个文件:
pom.xml整体的配置
package.xml包含在pom.xml中,用于指定assembly装配时的配置

pom.xml文件:

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://mons-lang3</artifactId> <version>3.4</version> </dependency> </dependencies> <build> <finalName>dong</finalName> <plugins> <!-- The configuration of maven-jar-plugin --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <!-- 对要打的jar包进行配置 --> <configuration> <!-- Configuration of the archiver --> <archive> <!--生成的jar中,不要包含pom.xml和pom.properties这两个文件--> <addMavenDescriptor>false</addMavenDescriptor> <!-- Manifest specific configuration --> <manifest> <!--是否要把第三方jar放到manifest的classpath中--> <addClasspath>true</addClasspath> <!-- 生成的manifest中classpath的前缀, 因为要把第三方jar放到lib目录下, 所以classpath的前缀是lib/ --> <classpathPrefix>lib/</classpathPrefix> </manifest> </archive> <!--过滤掉不希望包含在jar中的文件--> <excludes> <!-- 排除不需要的文件夹(路径是jar包内部的路径) --> <exclude>**/assembly/</exclude> </excludes> </configuration> </plugin> <!-- The configuration of maven-assembly-plugin --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.4</version> <!-- 对项目的组装进行配置 --> <configuration> <!-- 指定assembly插件的配置文件所在位置 --> <descriptors> <descriptor>src/main/resources/assembly/package.xml</descriptor> </descriptors> </configuration> <executions> <execution> <id>make-assembly</id> <!-- 将组装绑定到maven生命周期的哪一阶段 --> <!--<phase>package</phase>--> <goals> <!-- 指定assembly插件的打包方式--> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build></project>

9. package.xml文件

<?xml version="1.0" encoding="UTF-8"?><assembly> <id>full</id> <!-- 最终打包成一个用于发布的zip文件 --> <formats> <format>zip</format> </formats> <!-- 把依赖jar包打包进Zip压缩文件的lib目录下 --> <dependencySets> <dependencySet> <!--不使用项目的artifact,第三方jar不要解压,打包进zip文件的lib目录--> <useProjectArtifact>false</useProjectArtifact> <!-- 第三方jar打包进Zip文件的lib目录下, --> <!-- 注意此目录要与maven-jar-plugin中classpathPrefix指定的目录相同, --> <!-- 不然这些依赖的jar包加载到ClassPath的时候会找不到--> <outputDirectory>lib</outputDirectory> <!-- 第三方jar不要解压--> <!--<unpack>false</unpack>--> </dependencySet> </dependencySets> <!-- 文件设置,你想把哪些文件包含进去,或者把某些文件排除掉,都是在这里配置--> <fileSets> <!-- 把项目自己编译出来的可执行jar,打包进zip文件的根目录 --> <fileSet> <directory>${project.build.directory}</directory> <outputDirectory></outputDirectory> <includes> <include>*.jar</include> </includes> </fileSet> <!-- 把项目readme说明文档,打包进zip文件根目录下 (这里针对目录document/readme.txt文件) ${projet.document.directory}是pom.xml中自己配置的 --> <fileSet> <directoryl>${projet.document.directory}</directoryl> <outputDirectory></outputDirectory> <includes> <include>readme.*</include> </includes> </fileSet> <!-- 把项目相关的说明文档(除了readme文档), 打包进zip文件根目录下的document目录 (这里针对document/exclode.txt文件) ${project.document.directory}是在pom.xml中自己配置的 --> <fileSet> <directory>${project.document.directory}</directory> <outputDirectory>document</outputDirectory> <excludes> <exclude>readme.*</exclude> </excludes> </fileSet> <!-- 把项目的脚本文件目录(src/main/scripts )中的启动脚本文件, 打包进zip文件的根目录 (这里针对的是src/scripts/execute/include-file.sh文件) ${project.script.execute.directory} --> <fileSet> <directory>${project.script.execute.directory}</directory> <outputDirectory></outputDirectory> <includes> <include>*</include> </includes> </fileSet> </fileSets></assembly>

到此这篇关于Maven 生成打包可执行jar包的方法步骤的文章就介绍到这了,更多相关Maven 生成可执行jar 内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章