Maven打包可执行jar包方法大全(史上最全)

Maven打包可执行jar包方法大全(史上最全)目录打包方法方法一 使用 maven jar plugin 和 maven dependency plugin 方法二 使用 maven assembly plugin 推荐 方法三 使用 maven shade plugin 方法四 使用 onejar maven plugin 方法五 使用 spring boot maven plugin 方法六 使用 tomcat7 maven plugin 参考打包方法方法一 使用 maven jar plugin 和 maven dependenc

目录

打包方法

方法一:使用maven-jar-plugin和maven-dependency-plugin

方法二:使用maven-assembly-plugin (推荐)

方法三:使用maven-shade-plugin

方法四:使用onejar-maven-plugin

方法五:使用spring-boot-maven-plugin

方法六:使用tomcat7-maven-plugin

参考


 

打包方法

方法一:使用maven-jar-pluginmaven-dependency-plugin

首先,maven-jar-plugin的作用是配置mainClass和指定classpath。

 

 
    
    
      org.apache.maven.plugins 
     
    
      maven-jar-plugin 
     
     
      
       
       
         true 
        
       
         libs/ 
        
       
         org.baeldung.executable.ExecutableMavenJar 
        
       
      
     
    

addClasspath: 是否在manifest文件中添加classpath。默认为false。如果为true,则会在manifest文件中添加classpath,这样在启动的时候就不用再手动指定classpath了。如下所示,文件中增加了Class-Path一行

 

Manifest-Version: 1.0 Archiver-Version: Plexus Archiver Built-By: michealyang Class-Path: libs/jetty-server-9.4.7.v.jar lib/javax.servlet-api -3.1.0.jar libs/jetty-http-9.4.7.v.jar Created-By: Apache Maven 3.3.9 Build-Jdk: 1.8.0_162-ea Main-Class: com.michealyang.jetty.embeded.EmbeddedJettyServer 

classpathPrefix: classpath的前缀。如上面的manifest文件中,Class-Path的值中,每个jar包的前缀都是libs/。本质上,这个配置的值是所依赖jar包所在的文件夹。配置正确了才能找到依赖
mainClass: 指定启动时的Main Class

其次,maven-dependency-plugin会把所依赖的jar包copy到指定目录

 

 
    
    
      org.apache.maven.plugins 
     
    
      maven-dependency-plugin 
     
     
      
      
        copy-dependencies 
       
      
        prepare-package 
       
       
       
         copy-dependencies 
        
       
       
       
         ${project.build.directory}/libs 
        
       
      
     
    

executions中的配置都很重要,按照上面的配置来就行了。outputDirectory指定了要将所依赖的jar包copy到哪个目录。要与maven-jar-plugin中的classpathPrefix一致。

执行如下命令,即可打包:

mvn package

打包结果是,自己写的Class在jar包中,所依赖的jar包在libs目录中:

执行如下命令即可启动jar包:

java -jar embedded-jetty-1.0.0-SNAPSHOT.jar

优点
有诸多配置项,很自由,每个步骤都可控

缺点
打成的最终jar包中没有所依赖的jar包。依赖跟自己的代码不在一个jar包中。部署或者移动的时候,要考虑到多个文件,比较麻烦

方法二:使用maven-assembly-plugin (推荐)

maven-assembly-plugin可以将所有的东西都打包到一个jar包中。

 

 
    
    
      org.apache.maven.plugins 
     
    
      maven-assembly-plugin 
     
     
      
      
        package 
       
       
       
         single 
        
       
       
        
         
         
           com.michealyang.jetty.embeded.EmbeddedJettyServer 
          
         
        
        
        
          jar-with-dependencies 
         
        
       
      
     
    

执行mvn package后,会在target文件夹下生成两个jar包,一个是不带依赖的jar包,一个是后缀有-dependencies带有依赖的jar包,如:

启动时,直接执行即可:

java -jar embedded-jetty-1.0.0-SNAPSHOT-jar-with-dependencies.jar

优点
所有的东西都打到一个jar包中,很方便
缺点
配置项少,不自由。






方法三:使用maven-shade-plugin

maven-assembly-plugin类似,都可以将所有的东西都打包到一个jar包中。

 

 
    
    
      org.apache.maven.plugins 
     
    
      maven-shade-plugin 
     
     
      
       
       
         shade 
        
       
       
       
         true 
        
        
         
         
           com.michealyang.jetty.embeded.EmbeddedJettyServer 
          
         
        
       
      
     
    

执行mvn package后,会在target文件夹下生成两个jar包,一个是不带依赖的jar包,一个是后缀有-shaded带有依赖的jar包,如:

启动时,直接执行即可:

java -jar embedded-jetty-1.0.0-SNAPSHOT-jar-with-shaded.jar

优点
功能同maven-assembly-plugin,但比前者强大
缺点
配置起来太麻烦。当你需要高级功能的时候,更是麻烦的不要不要的。






方法四:使用onejar-maven-plugin

This provides custom classloader that knows how to load classes and resources from jars inside an archive, instead of from jars in the filesystem.

 

 
    
    
      com.jolira 
     
    
      onejar-maven-plugin 
     
     
      
       
       
         org.baeldung.executable. ExecutableMavenJar 
        
       
         true 
        
       
         ${project.build.finalName}.${project.packaging} 
        
       
       
       
         one-jar 
        
       
      
     
    

优点
clean delegation model, allows classes to be at the top-level of the One Jar, supports external jars and can support Native libraries
缺点
not actively supported since 2012






方法五:使用spring-boot-maven-plugin

需要maven版本不低于3.2

 

 
    
    
      org.springframework.boot 
     
    
      spring-boot-maven-plugin 
     
     
      
       
       
         repackage 
        
       
       
       
         spring-boot 
        
       
         org.baeldung.executable.ExecutableMavenJar 
        
       
      
     
    

两个重点:

  • goal要写成repackage
  • classifier要写成spring-boot

优点
dependencies inside a jar file, you can run it in every accessible location, advanced control of packaging your artifact, with excluding dependencies from the jar file etc., packaging of war files as well

缺点
添加了一些不必要的Spring和Spring Boot依赖

方法六:使用tomcat7-maven-plugin

可打包成一个web工程类型的jar包。其实是内嵌了一个tomcat在里面。

 

 
    
    
      org.apache.tomcat.maven 
     
    
      tomcat7-maven-plugin 
     
    
      2.0 
     
     
      
      
        tomcat-run 
       
       
       
         exec-war-only 
        
       
      
        package 
       
       
       
         / 
        
       
         false 
        
       
         webapp.jar 
        
       
         utf-8 
        
       
      
     
    

The goal is set as exec-war-only, path to your server is specified inside configuration tag, with additional properties, like finalName, charset etc. To build a jar, run man package, which will result in creating webapp.jar in your target directory. To run

To run the application, just write this in your console: java -jar target/webapp.jar and try to test it by specifying the localhost:8080/ in a browser.

优点
只有一个jar包
缺点
打包出的文件很大。因为里面内嵌了一个tomcat






参考

How to Create an Executable JAR with Maven

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/227208.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午9:41
下一篇 2026年3月16日 下午9:42


相关推荐

  • 链路层链路发现协议(LLDP)讲解「建议收藏」

    链路层链路发现协议(LLDP)讲解「建议收藏」一、LLDP协议概述 随着网络技术的发展,接入网络的设备的种类越来越多,配置越来越复杂,来自不同设备厂商的设备也往往会增加自己特有的功能,这就导致在一个网络中往往会有很多具有不同特性的、来自不同厂商的设备,为了方便对这样的网络进行管理,就需要使得不同厂商的设备能够在网络中相互发现并交互各自的系统及配置信息。 LLDP(LinkLayerDiscoveryProtocol,链路层发现协

    2022年5月5日
    46
  • JAVA:基于ARCGIS二次开发可视化开发环境搭建

    JAVA:基于ARCGIS二次开发可视化开发环境搭建这两天为了搭建这么一个基于java的ArcGIS二次开发环境可着实花了一番心血。在网上搜索各种资料,大部分都是基于C#的,关于JAVA的很少,而且很杂乱,没有一个完整的、详细的、适合新手的这么一个教程。所以,当我在奋斗两天且重装一次系统,终于安装成功之后,写下这篇文章,让用java进行基于ArcEngine二次开发的人可以少走弯路。因为ArcEngine只能在32位系统上面运行,所以当前系统为64

    2022年7月23日
    16
  • H2数据库教程_h2数据库编辑数据库

    H2数据库教程_h2数据库编辑数据库 启动和使用H2控制台H2控制台应用程序允许您使用浏览器访问数据库。这可以是H2数据库,也可以是支持JDBCAPI的其他数据库。这是一个客户端/服务器应用程序,因此需要服务器和客户端(浏览器)来运行它。根据您的平台和环境,有多种方法可以启动H2控制台:OS 开始 视窗 单击[开始],[所有程序],[H2]和[H2控制台(命令行)]  系统托盘中将添加…

    2022年10月12日
    10
  • RSA加密算法的java实现

    RSA加密算法的java实现最近有一个外部合作项目要求在数据传输过程中使用RSA加密算法对数据进行加密,所以需要编写一个加解密的工具类,因为对方不是java语言,所以是各自实现的这个工具,本文主要讨论实现以及双方调试过程中的一些插曲,希望给大家不要再次踩坑。关于加解密的核心部分,网上有很多博主都有实现过,我也是参考了一些博主的方法自己实现了一个加解密的工具。packagecom.chen.test;importorg.

    2022年5月1日
    42
  • 置换矩阵的应用:逆矩阵的对角线元素求法

    置换矩阵的应用:逆矩阵的对角线元素求法置换矩阵是一种非常实用的数学工具 其确切定义如下 一个正方矩阵 若其每一行和每一列有且仅有一个非零元素 111 则称之为置换矩阵 顾名思义 其作用是 当将某一矩阵左乘置换矩阵 相当于将矩阵的行重新排列 而右乘置换矩阵 则相当于对列重新排列 因此 当我们想对矩阵的行或列重新排列时 就可以等效地将其写为左 右乘置换矩阵的形式 插一句题外话 对某矩阵左乘一个对角阵 相当于对其每一行都分别乘上对应的对角元素 右乘一个对角阵 则相当于每一列乘上一个对角元素 因此 左乘代表对行操作 右乘代表对列

    2026年1月29日
    2
  • python stdout

    python stdoutpythonstdout

    2025年5月26日
    4

发表回复

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

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