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-pluginmaven-dependency-plugin

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

 

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>libs/</classpathPrefix>
                <mainClass>
                    org.baeldung.executable.ExecutableMavenJar
                </mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

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.v20170914.jar lib/javax.servlet-api
 -3.1.0.jar libs/jetty-http-9.4.7.v20170914.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到指定目录

 

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>prepare-package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>
                    ${project.build.directory}/libs
                </outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

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

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

mvn package

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

├── embedded-jetty-1.0.0-SNAPSHOT.jar
├── lib
│ ├── jetty-server-9.4.7.v20170914.jar
│ ├── jetty-http-9.4.7.v20170914.jar

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

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

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

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

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

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

 

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
            <configuration>
                <archive>
                <manifest>
                    <mainClass>
                        com.michealyang.jetty.embeded.EmbeddedJettyServer
                    </mainClass>
                </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
        </execution>
    </executions>
</plugin>

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

May 31 16:42 embedded-jetty-1.0.0-SNAPSHOT-jar-with-dependencies.jar
May 31 16:42 embedded-jetty-1.0.0-SNAPSHOT.jar

启动时,直接执行即可:

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

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

方法三:使用maven-shade-plugin

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

 

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <executions>
        <execution>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <shadedArtifactAttached>true</shadedArtifactAttached>
                <transformers>
                    <transformer implementation=
                      "org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>com.michealyang.jetty.embeded.EmbeddedJettyServer</mainClass>
                </transformer>
            </transformers>
        </configuration>
        </execution>
    </executions>
</plugin>

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

May 31 16:53 embedded-jetty-1.0.0-SNAPSHOT-shaded.jar
May 31 16:53 embedded-jetty-1.0.0-SNAPSHOT.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.

 

<plugin>
    <groupId>com.jolira</groupId>
    <artifactId>onejar-maven-plugin</artifactId>
    <executions>
        <execution>
            <configuration>
                <mainClass>org.baeldung.executable.
                  ExecutableMavenJar</mainClass>
                <attachToBuild>true</attachToBuild>
                <filename>
                  ${project.build.finalName}.${project.packaging}
                </filename>
            </configuration>
            <goals>
                <goal>one-jar</goal>
            </goals>
        </execution>
    </executions>
</plugin>

优点
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

能同时打可执行jar包和war包
This allows to package executable jar or war archives and run an application “in-place”.

需要maven版本不低于3.2

 

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
            <configuration>
                <classifier>spring-boot</classifier>
                <mainClass>
                  org.baeldung.executable.ExecutableMavenJar
                </mainClass>
            </configuration>
        </execution>
    </executions>
</plugin>

两个重点:

  • 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在里面。

 

<plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <version>2.0</version>
    <executions>
        <execution>
            <id>tomcat-run</id>
            <goals>
                <goal>exec-war-only</goal>
            </goals>
            <phase>package</phase>
            <configuration>
                <path>/</path>
                <enableNaming>false</enableNaming>
                <finalName>webapp.jar</finalName>
                <charset>utf-8</charset>
            </configuration>
        </execution>
    </executions>
</plugin>

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

内容概要:本文针对T型三电平逆变器在电网电压跌落条件下的低电压穿越(LVRT)问题,提出了一种结合改进电流解耦控制与直流侧中点电位平衡的综合控制策略。通过建立逆变器的数学模型,采用双二阶广义积分器(DSOGI)实现电网电压正负序分量的精确分离,并在此基础上设计自适应无功支撑与故障电流限幅控制,以满足LVRT对无功补偿和电流安全性的要求。为提升不对称故障下的动态性能,引入改进的正负序解耦电流控制方法,有效克服传统PI控制器在耦合干扰下的控制滞后问题。同时,结合零序电压注入法对中点电位进行主动调控,抑制中点电压漂移,保障系统长期稳定运行。整个控制方案在Simulink平台上完成建模与仿真验证,结果表明该方法在电网故障期间具有优良的动态响应特性、稳定的中点电位控制能力和可靠的并网运行性能。; 适合人群:具备电力电子、自动控制或新能源并网技术背景,从事逆变器控制算法开发、微电网系统集成或可再生能源发电系统研究的工程技术人员及高校研究生。; 使用场景及目标:①用于提升T型三电平逆变器在电网故障条件下的并网可靠性与电能质量;②为高比例新能源接入场景下的LVRT控制策略设计提供理论支撑与技术路径;③适用于需要实现高性能电流控制与中点电位稳定的工业级变流器控制系统开发。; 阅读建议:建议结合提供的Simulink仿真模型进行学习,重点剖析正负序分离、改进电流解耦控制环设计及中点电位平衡模块的协同工作机制,可通过设置不同类型的电网故障(如单相短路、两相短路)和调节控制参数开展对比实验,深入掌握各模块对系统整体性能的影响规律。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术园地

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值