Maven 生成打包可执行jar包

Maven 生成打包可执行jar包文章目录1.需求2.开发环境3.Maven打包插件介绍4.Maven使用maven-jar-plugin打可执行jar包5.Maven使用maven-assembly-plugin装需要打包的文件打进zip包6.Maven生成可执行jar包及zip项目压缩包7.执行jar包8.pom.xml配置9.package.xml文件最近IDEA打可执行Jar包搞了三天,一直失败,好好学…

大家好,又见面了,我是你们的朋友全栈君。

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

主要配置如下:

<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只生成项目压缩包
02_Maven打可执行jar包和项目压缩包.jpg

这里执行mvn:package
03_Maven生成的可执行jar包和项目压缩包.jpg

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

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

运行结果:
运行可执行jar包.jpg

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://javaforall.net/139318.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 卷积与转置卷积

    卷积与转置卷积当正向卷积步长不为1时(常常可能为2),转置卷积步长为: 转置卷积填充由正向卷积的卷积核和填充决定:  转置卷积的核和正向卷积一样:转置卷积的输出公式:     转置卷积又称微步卷积(“微步”的含义指:新的步长为1,而之前的步长为2,使得转置卷积的滑窗处理相比较卷积的“小”。),可以视作传统卷积操作的一种“逆向”传递过程;并且,转置卷积受“正向”卷积的参数约束,即步长stride和零填充…

    2022年6月21日
    31
  • 毕业论文管理系统_本科毕业论文网

    毕业论文管理系统_本科毕业论文网毕业论文管理系统1.首先是个简约的登录页面,登录页面分为三个角色,分别是学生,老师和管理员系统的登录界面2.接下来是用户模块,分别为两个模块教师和学生的,管理员可以进行教师和学生添加和修改。3.系部管理4.文件管理,学生上传的论文,管理员和教师都可以进行下载和查看5.学生模块,学生选题,教师发布的题目学生可以进行选择。学生也可以自己申请题目6.学生申请课题7.论文初稿,学生上传论文初稿,等指导老师通过后才能进行最后的终稿8.学生上传论文,指导老师可以提建议,学生可以查看指导老师的建议9.

    2025年6月28日
    6
  • iOS开发-用户定位获取-CoreLocation的实际应用-CLLocationManger获取定位权限-CLLocation详细使用方式

    iOS开发-用户定位获取-CoreLocation的实际应用-CLLocationManger获取定位权限-CLLocation详细使用方式iOS提供了两个框架用来定位以及地图显示。CoreLocation框架包含的类可以帮助设备确定位置和航向以及使用基于位置的有效信息。MapKit框架未定位提供了户用页面的支持(地图显示),里面包含了地图视图、卫星地图视图以及2D、3D混合视图,并且能够让开发人员管理地图标注和地图覆盖层,前者用于标注地点(常见的地图大头针),后者用来突出某区域或者路线等。本期内容:CLLocationMan…

    2022年7月26日
    4
  • clientWidth、offsetWidth等介绍[通俗易懂]

    clientWidth、offsetWidth等介绍[通俗易懂]网页可见区域宽:document.body.clientWidth网页可见区域高:document.body.clientHeight网页可见区域宽:document.body.offsetWidth(包括边线的宽)网页可见区域高:document.body.offsetHeight(包括边线的宽)网页正文全文宽:document.body.scrollWidth网页正文全文高:do…

    2022年7月22日
    16
  • java executeupdate,Java线程安全中的executeUpdate方法[通俗易懂]

    java executeupdate,Java线程安全中的executeUpdate方法[通俗易懂]IhavemultiplethreadstryingtoupdateaMySQLdatabase?isexecuteUpdatemethodthread-safetouse?解决方案No,itisnotthread-safetouse.Infact,ifsomeotherthreadusesastatement,andthenanot…

    2022年10月20日
    3
  • intellij idea安装步骤2019.3_intellij idea安装教程

    intellij idea安装步骤2019.3_intellij idea安装教程IntelliJIDEA2022.1保姆级安装教程

    2022年9月28日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号