Maven 生成打包可执行jar包

分手后的思念是犯贱 2021-06-10 20:38 645阅读 0赞

最近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
项目的目录结构:

70

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包

主要配置如下:

  1. <plugin>
  2. <groupId>org.apache.maven.plugins</groupId>
  3. <artifactId>maven-jar-plugin</artifactId>
  4. <version>2.4</version>
  5. <!-- 对要打的jar包进行配置 -->
  6. <configuration>
  7. <!-- Configuration of the archiver -->
  8. <archive>
  9. <!--生成的jar中,不要包含pom.xml和pom.properties这两个文件-->
  10. <addMavenDescriptor>false</addMavenDescriptor>
  11. <!-- Manifest specific configuration -->
  12. <manifest>
  13. <!--是否要把第三方jar放到manifest的classpath中-->
  14. <addClasspath>true</addClasspath>
  15. <!--生成的manifest中classpath的前缀,
  16. 因为要把第三方jar放到lib目录下,
  17. 所以classpath的前缀是lib/-->
  18. <classpathPrefix>lib/</classpathPrefix>
  19. </manifest>
  20. </archive>
  21. <!--过滤掉不希望包含在jar中的文件-->
  22. <excludes>
  23. <!-- 排除不需要的文件夹(路径是jar包内部的路径) -->
  24. <exclude>**/assembly/</exclude>
  25. </excludes>
  26. </configuration>
  27. </plugin>

完整配置见底部

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

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

  1. <plugin>
  2. <groupId>org.apache.maven.plugins</groupId>
  3. <artifactId>maven-assembly-plugin</artifactId>
  4. <version>2.4</version>
  5. <!-- 对项目的组装进行配置 -->
  6. <configuration>
  7. <!-- 指定assembly插件的配置文件所在位置 -->
  8. <descriptors>
  9. <descriptor>src/main/resources/assembly/package.xml</descriptor>
  10. </descriptors>
  11. </configuration>
  12. <executions>
  13. <execution>
  14. <id>make-assembly</id>
  15. <!-- 将组装绑定到maven生命周期的哪一阶段 -->
  16. <phase>package</phase>
  17. <goals>
  18. <!-- 指定assembly插件的打包方式-->
  19. <goal>single</goal>
  20. </goals>
  21. </execution>
  22. </executions>
  23. </plugin>

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

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

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

02\_Maven打可执行jar包和项目压缩包.jpg

这里执行mvn:package

03\_Maven生成的可执行jar包和项目压缩包.jpg

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

04\_解压后的项目压缩包目录结构.jpg

7. 执行jar包

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

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

TestNumber的源码:

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

命令行运行生成的jar

  1. java -classpath dong.jar com.dong.bigdata.TestString
  2. java -classpath dong.jar com.dong.bigdata.TestNumber

运行结果:

运行可执行jar包.jpg

8. pom.xml配置

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

pom.xml文件:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <!-- ####################### 基础设置 ###################### -->
  7. <!--groupId:项目或者组织的唯一标志,并且配置时生成路径也是由此生成,如org.myproject.mojo生成的相对路径为:/org/myproject/mojo-->
  8. <groupId>com.dong</groupId>
  9. <!--项目的通用名称-->
  10. <artifactId>bigdata</artifactId>
  11. <!--打包机制,如pom,jar,maven-plugin,ejb,war,ear,rar,par-->
  12. <packaging>jar</packaging>
  13. <!--项目的版本-->
  14. <version>1.0-SNAPSHOT</version>
  15. <!-- ####################### 项目信息 ###################### -->
  16. <!--用户描述项目的名称,无关紧要的东西-->
  17. <name>bigdata</name>
  18. <!--写明开发团队的网站,无关紧要-->
  19. <url>http://http://www.dong.com/.com</url>
  20. <!-- ####################### 环境设置 ###################### -->
  21. <properties>
  22. <!-- 项目执行脚本目录 -->
  23. <project.script.execute.directory>src/main/scripts/execute</project.script.execute.directory>
  24. <!-- 项目说明文档目录 -->
  25. <project.document.directory>document</project.document.directory>
  26. <!-- 项目配置文件目录 -->
  27. <project.config.directory>src/main/resources</project.config.directory>
  28. <!-- 项目编码 -->
  29. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  30. <!-- 本地编译JDK版本 -->
  31. <maven.compiler.source>1.8</maven.compiler.source>
  32. <!-- 项目部署JDK版本 -->
  33. <maven.compiler.target>1.8</maven.compiler.target>
  34. </properties>
  35. <!--
  36. 配置Maven的仓库, 在此处配置的仓库会优先于setting.xml里配置的仓库,
  37. 建议哪个仓库快,哪个配置在前面, 然后如果Maven在前面配置的仓库找不到的话会去后面的仓库找,
  38. 如果后面的仓库都找不到,会去setting.xml中央仓库里找
  39. -->
  40. <repositories>
  41. <!-- 阿里云仓库,配置Maven仓库,速度快配置在最前面 -->
  42. <repository>
  43. <id>aliyun</id>
  44. <url>http://maven.aliyun.com/nexus/content/groups/public</url>
  45. </repository>
  46. <!-- 国内备选仓库 -->
  47. <repository>
  48. <id>repo2</id>
  49. <url>http://repo2.maven.org/maven2/</url>
  50. </repository>
  51. <!-- Cloudera仓库,如果在阿里云仓库里找不到去Cloudera的仓库里找,主要是CDH版本Hadoop依赖的jar -->
  52. <repository>
  53. <id>cloudera</id>
  54. <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
  55. </repository>
  56. <!-- Scala仓库,如果前面两个都找不到来仓库找,如果此仓库也找不到,去中央仓库找 -->
  57. <repository>
  58. <id>scala-tools.org</id>
  59. <name>Scala-Tools Maven2 Repository</name>
  60. <url>http://scala-tools.org/repo-releases</url>
  61. </repository>
  62. </repositories>
  63. <dependencies>
  64. <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
  65. <dependency>
  66. <groupId>org.apache.commons</groupId>
  67. <artifactId>commons-lang3</artifactId>
  68. <version>3.4</version>
  69. </dependency>
  70. </dependencies>
  71. <build>
  72. <finalName>dong</finalName>
  73. <plugins>
  74. <!-- The configuration of maven-jar-plugin -->
  75. <plugin>
  76. <groupId>org.apache.maven.plugins</groupId>
  77. <artifactId>maven-jar-plugin</artifactId>
  78. <version>2.4</version>
  79. <!-- 对要打的jar包进行配置 -->
  80. <configuration>
  81. <!-- Configuration of the archiver -->
  82. <archive>
  83. <!--生成的jar中,不要包含pom.xml和pom.properties这两个文件-->
  84. <addMavenDescriptor>false</addMavenDescriptor>
  85. <!-- Manifest specific configuration -->
  86. <manifest>
  87. <!--是否要把第三方jar放到manifest的classpath中-->
  88. <addClasspath>true</addClasspath>
  89. <!--
  90. 生成的manifest中classpath的前缀,
  91. 因为要把第三方jar放到lib目录下,
  92. 所以classpath的前缀是lib/
  93. -->
  94. <classpathPrefix>lib/</classpathPrefix>
  95. </manifest>
  96. </archive>
  97. <!--过滤掉不希望包含在jar中的文件-->
  98. <excludes>
  99. <!-- 排除不需要的文件夹(路径是jar包内部的路径) -->
  100. <exclude>**/assembly/</exclude>
  101. </excludes>
  102. </configuration>
  103. </plugin>
  104. <!-- The configuration of maven-assembly-plugin -->
  105. <plugin>
  106. <groupId>org.apache.maven.plugins</groupId>
  107. <artifactId>maven-assembly-plugin</artifactId>
  108. <version>2.4</version>
  109. <!-- 对项目的组装进行配置 -->
  110. <configuration>
  111. <!-- 指定assembly插件的配置文件所在位置 -->
  112. <descriptors>
  113. <descriptor>src/main/resources/assembly/package.xml</descriptor>
  114. </descriptors>
  115. </configuration>
  116. <executions>
  117. <execution>
  118. <id>make-assembly</id>
  119. <!-- 将组装绑定到maven生命周期的哪一阶段 -->
  120. <!--<phase>package</phase>-->
  121. <goals>
  122. <!-- 指定assembly插件的打包方式-->
  123. <goal>single</goal>
  124. </goals>
  125. </execution>
  126. </executions>
  127. </plugin>
  128. </plugins>
  129. </build>
  130. </project>

9. package.xml文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <assembly>
  3. <id>full</id>
  4. <!-- 最终打包成一个用于发布的zip文件 -->
  5. <formats>
  6. <format>zip</format>
  7. </formats>
  8. <!-- 把依赖jar包打包进Zip压缩文件的lib目录下 -->
  9. <dependencySets>
  10. <dependencySet>
  11. <!--不使用项目的artifact,第三方jar不要解压,打包进zip文件的lib目录-->
  12. <useProjectArtifact>false</useProjectArtifact>
  13. <!-- 第三方jar打包进Zip文件的lib目录下, -->
  14. <!-- 注意此目录要与maven-jar-plugin中classpathPrefix指定的目录相同, -->
  15. <!-- 不然这些依赖的jar包加载到ClassPath的时候会找不到-->
  16. <outputDirectory>lib</outputDirectory>
  17. <!-- 第三方jar不要解压-->
  18. <!--<unpack>false</unpack>-->
  19. </dependencySet>
  20. </dependencySets>
  21. <!-- 文件设置,你想把哪些文件包含进去,或者把某些文件排除掉,都是在这里配置-->
  22. <fileSets>
  23. <!-- 把项目自己编译出来的可执行jar,打包进zip文件的根目录 -->
  24. <fileSet>
  25. <directory>${project.build.directory}</directory>
  26. <outputDirectory></outputDirectory>
  27. <includes>
  28. <include>*.jar</include>
  29. </includes>
  30. </fileSet>
  31. <!--
  32. 把项目readme说明文档,打包进zip文件根目录下
  33. (这里针对目录document/readme.txt文件)
  34. ${projet.document.directory}是pom.xml中自己配置的
  35. -->
  36. <fileSet>
  37. <directoryl>${projet.document.directory}</directoryl>
  38. <outputDirectory></outputDirectory>
  39. <includes>
  40. <include>readme.*</include>
  41. </includes>
  42. </fileSet>
  43. <!--
  44. 把项目相关的说明文档(除了readme文档),
  45. 打包进zip文件根目录下的document目录
  46. (这里针对document/exclode.txt文件)
  47. ${project.document.directory}是在pom.xml中自己配置的
  48. -->
  49. <fileSet>
  50. <directory>${project.document.directory}</directory>
  51. <outputDirectory>document</outputDirectory>
  52. <excludes>
  53. <exclude>readme.*</exclude>
  54. </excludes>
  55. </fileSet>
  56. <!--
  57. 把项目的脚本文件目录(src/main/scripts )中的启动脚本文件,
  58. 打包进zip文件的根目录
  59. (这里针对的是src/scripts/execute/include-file.sh文件)
  60. ${project.script.execute.directory}
  61. -->
  62. <fileSet>
  63. <directory>${project.script.execute.directory}</directory>
  64. <outputDirectory></outputDirectory>
  65. <includes>
  66. <include>*</include>
  67. </includes>
  68. </fileSet>
  69. </fileSets>
  70. </assembly>

发表评论

表情:
评论列表 (有 0 条评论,645人围观)

还没有评论,来说两句吧...

相关阅读