Maven 生成打包可执行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

项目的目录结构:

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.TestString
java -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://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>

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

(0)

相关推荐

  • Maven项目打包成可执行Jar文件步骤解析

    在使用Maven完成项目以后,如果是需要打包成可执行的Jar文件,我们通过eclipse的导出很麻烦,还得指定入口文件的位置,还得说明依赖的jar包,既然都使用Maven了,很重要的一个目的就是让这些繁琐的操作简单.我们可以通过插件完成这项工作,使用assembly插件.具体使用方式如下: 1.在项目中加入插件的依赖: <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>2.2&l

  • 用Maven打成可执行jar,包含maven依赖,本地依赖的操作

    因为今天一个朋友学习过程中用到了maven项目编写代码,到了最后打包阶段打的包不能运行,一时我也没想起来具体操作步骤,后来我百度学习了一下,特此记录下,以便后续自己查阅. maven项目中不可避免的需要用到依赖jar,实际使用中有的能从maven仓库找到,有的找不到,所以存在使用本地jar的情况,下面将对使用maven仓库中jar,以及使用本地jar不同情况下打包可运行jar进行介绍. 情景一:使用maven依赖,所有的依赖都从maven仓库查找下载,最终打包成可执行jar,需要修改pom文件如

  • Spring Boot Maven 打包可执行Jar文件的实现方法

    Maven pom.xml 必须包含 <packaging>jar</packaging> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <fork>

  • java 中使用maven shade plugin 打可执行Jar包

    java 中使用maven shade plugin 打可执行Jar包 eclipse里有一个功能叫做"打可执行(runnable) jar包", 用这个功能可以把一个工程自身和所有依赖包打成一个fat jar,并且指定Main方法,这样直接使用java jar xxx.jar就可以运行代码了. 但是在不使用eclipse的时候呢?其实,借助maven,我们很容易实现同样功能.maven提供了一个shade plugin,可以用来打fat jar, 同时也提供了指定main方法的功能.

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

    最近IDEA打可执行Jar包搞了三天,一直失败,好好学习一下Maven-assembly,在此记录一下 1. 需求 项目打包,满足以下要求: 1.整个项目打一个Zip包下面包括应用程序.应用程序依赖的jar包.说明文档 2.项目打的jar包可以执行不同类里的Main函数 3.项目源码打的jar包要与依赖的第三方jar包分开 4.项目里的执行脚本也要一块打包并进行分类 5.document目录下的readme.txt放在压缩包的根目录下,其他的还放在这个目录下 6.打的jar包去掉不需要的目录(文

  • Maven 项目用Assembly打包可执行jar包的方法

    目录 1.添加maven插件 2.mvn clean(清理下项目) 3.maven update project(用eclipse工具) 4.命令后执行命令mvn assembly:assembly -Dmaven.test.skip 5.执行 java -jar DataCollector.jar 该方法只可打包非spring项目的可执行jar包 1.添加maven插件 <build> <finalName>DataCollector</finalName> <

  • 浅谈IDEA2018打包可执行jar包的流程

    本人使用的是2018版的IDEA,发现与之前版本打包Jar包的流程略有些许差异 (如果想打包为不可执行的jar包,在打包过程中不要生成MANIFEST.MF文件即可) 一:项目结构 二:进入项目设置功能 三:点击"+"号,选择JAR,这里可以看到有两种选项 Empty:空的jar结构 From modules with dependencies:可以将项目中依赖的其他jar包或资源一并打入到我们要打包的jar包中,并且会帮我们做好项目文件的导入 两种不同的选择方式,在后面的页面选项会有

  • idea打包java可执行jar包的实现步骤

    1,在项目上鼠标右键 --> Open Module Settings 2, Artifacts --> + --> JAR --> From modules with dependencies... 3, Main Class是你这个项目(脚本)的主方法,就是要运行的类,选一个 4,如下图,设置 META-INF/MANIFEST.MF !!!!!切记,不能用默认的(起码我用默认的是不成功的)!!!!! 6,选中你这个项目的根目录,一定要放在根目录下 7,设置完是这样子的,关于

  • Maven优雅的添加第三方Jar包的方法

    在利用Maven构建项目的时候会出现某些Jar包无法下载到本地的Repository中,鉴于这种情况比较普遍存在,特归纳以下解决问题办法:以 ojdbc14-10.2.0.4.0.jar为例[其它Jar包本地安装同理] 1:下载ojdbc14-10.2.0.4.0.jar 2:在jar包目录打开cmd命令窗口执行:mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0.4.0 -Dpa

  • Linux下用java -jar运行可执行jar包的方法教程

    问题来源 一般来说,一个稍微大些的项目都会有一些依赖的Jar包,而在将项目部署到服务器的过程中,如果没有持续集成环境的话,也就是说服务器不支持在线编译及打包,那么需要自己上传依赖的Jar包,然而可能服务器上已经存在了该项目所依赖的Jar包(比如项目修复BUG,重新打包上传,而依赖不变),无需再次上传,此时只需将该项目单独打包,在运行的时候指定CLASSPATH即可. 在将Jar包部署到服务器上之后,设置CLASSPATH环境变量,运行Java -jar ...命令出现ClassNotFoundE

  • c#调用jar包的方法步骤(非常详细)

    前言 最近项目遇到一个问题,就是有一个需求是cs端数据需要加密(使用sm4的加密方法),后端接收需要解密,但是cs端是c#写的 后端是java写的,两端的加密方式 的结果都会有所不同,当然还是我们这帮菜逼对算法这块研究不深.后面找了调用中间的c语言去弄 还是没有搞好,最后找的了一种方法,就是把java代码打成jar包 然后转换成dll,供cs端调用. 步骤如下 一.将已经编译后的java中Class文件进行打包:打包命令JAR 打包:可以使用命令 也可以使用eclipse 和idea 这样的工具

  • 使用maven生成可执行的jar包的方法

    本文介绍了使用maven生成可执行的jar包的方法,分享给大家,具体如下: 从pom的xsi中可以打开描述pom的schema: 可以看到pom中,project的结构: 默认的mvn install生成的jar是不带主类入口的,需要在maven-compile-plugin中设置主类, <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSche

  • Maven pom.xml 添加本地jar包依赖以及打包方法

    Maven项目打包时,如果遇到需要添加本地jar包依赖的时候,可以选择两种方法: 1. 安装到本地仓库 第一种方法比较常规,适用于需要添加的jar包也是由maven项目导出,含有pom文件的时候.只需要将jar包安装到本地maven仓库下,然后添加依赖即可. (1)安装到本地仓库,执行以下命令(其中的-Dfile/-DgroupId/-DartifactId/-Dversion项根据pom文件内容填写): mvn install:install-file -Dfile=xxxxx.jar -Dg

随机推荐