文章目录

最近 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
项目的目录结构:
01_项目目录结构说明.jpg

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>

分类: web

标签:   maven