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

作者:荒野雄兵 时间:2023-01-02 14:53:15 

最近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

项目的目录结构:

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

3. Maven打包插件介绍

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

插件功能
maven-jar-pluginmaven 默认打包插件,用来创建 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只生成项目压缩包

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

这里执行mvn:package

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

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

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

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.TestString
java -classpath dong.jar com.dong.bigdata.TestNumber

运行结果:

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

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://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:项目或者组织的唯一标志,并且配置时生成路径也是由此生成,如org.myproject.mojo生成的相对路径为:/org/myproject/mojo-->
 <groupId>com.dong</groupId>
 <!--项目的通用名称-->
 <artifactId>bigdata</artifactId>
 <!--打包机制,如pom,jar,maven-plugin,ejb,war,ear,rar,par-->
 <packaging>jar</packaging>
 <!--项目的版本-->
 <version>1.0-SNAPSHOT</version>

<!-- ####################### 项目信息 ###################### -->
 <!--用户描述项目的名称,无关紧要的东西-->
 <name>bigdata</name>
 <!--写明开发团队的网站,无关紧要-->
 <url>http://http://www.dong.com/.com</url>

<!-- ####################### 环境设置 ###################### -->
 <properties>
   <!-- 项目执行脚本目录 -->
   <project.script.execute.directory>src/main/scripts/execute</project.script.execute.directory>
   <!-- 项目说明文档目录 -->
   <project.document.directory>document</project.document.directory>
   <!-- 项目配置文件目录 -->
   <project.config.directory>src/main/resources</project.config.directory>
   <!-- 项目编码 -->
   <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<!-- 本地编译JDK版本 -->
   <maven.compiler.source>1.8</maven.compiler.source>
   <!-- 项目部署JDK版本 -->
   <maven.compiler.target>1.8</maven.compiler.target>
 </properties>

<!--
  配置Maven的仓库, 在此处配置的仓库会优先于setting.xml里配置的仓库,
  建议哪个仓库快,哪个配置在前面, 然后如果Maven在前面配置的仓库找不到的话会去后面的仓库找,
  如果后面的仓库都找不到,会去setting.xml中央仓库里找
  -->
 <repositories>
   <!-- 阿里云仓库,配置Maven仓库,速度快配置在最前面 -->
   <repository>
     <id>aliyun</id>
     <url>http://maven.aliyun.com/nexus/content/groups/public</url>
   </repository>
   <!-- 国内备选仓库 -->
   <repository>
     <id>repo2</id>
     <url>http://repo2.maven.org/maven2/</url>
   </repository>

<!-- Cloudera仓库,如果在阿里云仓库里找不到去Cloudera的仓库里找,主要是CDH版本Hadoop依赖的jar -->
   <repository>
     <id>cloudera</id>
     <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
   </repository>

<!-- Scala仓库,如果前面两个都找不到来仓库找,如果此仓库也找不到, * 仓库找 -->
   <repository>
     <id>scala-tools.org</id>
     <name>Scala-Tools Maven2 Repository</name>
     <url>http://scala-tools.org/repo-releases</url>
   </repository>
 </repositories>

<dependencies>
   <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
   <dependency>
     <groupId>org.apache.commons</groupId>
     <artifactId>commons-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>

来源:https://blog.csdn.net/daerzei/article/details/82883472

标签:Maven,可执行jar
0
投稿

猜你喜欢

  • Spring5源码解析之Spring中的异步和计划任务

    2022-09-06 02:14:04
  • 详解Spring Boot中MyBatis的使用方法

    2023-08-22 17:25:01
  • C#实现Array,List,Dictionary相互转换

    2022-10-09 13:51:39
  • while和for可以相互转换的例子分享

    2023-08-23 02:17:46
  • android使用 ScrollerView 实现 可上下滚动的分类栏实例

    2022-11-03 16:38:57
  • Java 实现并发的几种方式小结

    2022-10-23 02:54:46
  • Java集合定义与用法实例总结【Set、List与Map】

    2023-11-21 08:26:40
  • Spring在多线程下@Resource注入为null的问题

    2022-09-11 07:41:18
  • Android 显示GIF图片实例详解

    2023-08-06 09:11:52
  • Java源码解析HashMap的keySet()方法

    2023-11-11 06:33:05
  • 详解Java单元测试之JUnit篇

    2023-06-12 16:42:13
  • WPF+DiffPlex实现文本比对工具

    2022-04-20 21:32:07
  • Java面试题冲刺第二十三天--分布式

    2023-09-24 07:30:43
  • 解决android studio卡顿,提升studio运行速度的方法

    2021-11-19 01:25:05
  • mybatis-plus自动填充插入更新时间有8小时时差

    2021-07-26 07:18:40
  • 带你一文了解C#中的Expression

    2023-04-20 04:37:57
  • c#扫描图片去黑边(扫描仪去黑边)

    2022-11-06 11:45:55
  • Java实现世界上最快的排序算法Timsort的示例代码

    2021-12-14 17:57:27
  • C#结束进程及子进程

    2021-06-22 15:18:10
  • 剑指Offer之Java算法习题精讲链表与字符串及数组

    2022-10-03 19:10:17
  • asp之家 软件编程 m.aspxhome.com