maven的5种打包方式小结

 更新时间:2024年06月03日 11:45:05   作者:​​​​​​​ 健康平安的活着  
本文主要介绍了maven的5种打包方式小结,主要是几种插件打包,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一 问题阐述

1.1 概述 

在讲打包方式之前,首先来说最近踩到的坑,在idea新建的maven项目,在pom文件中会自动生成一段插件的管理器:

2.我使用maven打包插件maven-assembly-plugin,将其配置添加到<plugManagement><plugs>.. ..</plugs></plugManagement>中间。

3.执行maven 打包后:报没有主清单,如下图所示:

将网上查找了个遍,痛苦到怀疑人生,也没有发现什么端倪,感觉配置的很正确,并且在eclipse中都在项目中用过。

1.2 原因

先来了解一下pluginManagement:

pluginManagement是表示插件声明,即你在项目中的pluginManagement下声明了插件,Maven不会加载该插件,pluginManagement声明可以被继承。

pluginManagement一般是用来在父POM中定义,提供给子POM使用,子POM也可以覆盖这个定义,而且你在父POM中定义了版本之后,子模块中直接应用groupId和artifactId,而不用指定版本,同时也方便统一管理;而在父POM中的pluginManagement并不会介入到Maven的生命周期。

plugins就是直接引入一个plugin,而且可以绑定到Maven相关的生命周期上。

pluginManagement主要是为了统一管理插件,确保所有子POM使用的插件版本保持一致,类似dependencies和dependencyManagement。

总结一句话:pluginManagement标签中声名的plug插件不参与maven的生命周期,不会被加载,但可以通过子类继承后,子类应用来使用。

这就是为何在plugManagemnet中配置maven-assembly-plugin插件后不起作用,找不到主类的原因。

https://www.jb51.net/program/322128g7x.htm

1.3 解决办法

1.将plugManagement标签里内容清空,自定义的的打包插件配置在</plugmanagement>标签之外。

2.重新打包,执行jar包

执行成功ok!

二 Maven常用打包插件

2.1 maven-assembly-plugin插件打包

作用:将自己项目中的代码和资源,还包含了所有依赖包的内容打成一个jar包。

1.pom文件的配置:如果有plugManagemnet则在其外面添加如下代码

<!--自定义打包方式-->
<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.5.5</version>
    <configuration>
      <archive>
        <manifest>
          <mainClass>com.ljf.test.Ha</mainClass>
        </manifest>
      </archive>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
    </configuration>
    <executions>
      <execution>
        <id>make-assembly</id>
        <phase>package</phase>
        <goals>
          <goal>single</goal>
        </goals>
      </execution>
    </executions>
  </plugin>
</plugins>

2.截图如下: 

2.生成jar包的结构

打包后会在target目录下生成一个xxx-jar-with-dependencies.jar文件,这个文件不但包含了自己项目中的代码和资源,还包含了所有依赖包的内容。所以可以直接通过java -jar来运行。

2.2 maven-shade-plugin插件打包

作用:和maven-assembly-plugin插件的作用一样,将自己项目的代码资源以及依赖第三方的资源一起打成一个jar包,不过如果项目中用到spring Framework,用maven-assembly-plugin这种方式打出来的包运行时会出错,使用maven-shade-plugin插件可以处理这个问题

1.pom文件的配置:如果有plugManagemnet则在标签外,添加如下代码

<!--自定义打包方式-->
<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>2.4.1</version>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>shade</goal>
        </goals>
        <configuration>
          <transformers>
            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
              <mainClass>com.ljf.test.Ha</mainClass>
            </transformer>
          </transformers>
        </configuration>
      </execution>
    </executions>
  </plugin>
</plugins>

2..执行jar包后的结构

3.执行打包后在target目录下会生成两个jar包,注意不是original-xxx.jar文件,而是另外一个。和maven-assembly-plugin一样,生成的jar文件包含了所有依赖,所以可以直接运行。

2.3 maven-jar-plugin和maven-dependency-plugin插件打包

作用:将执行jar包和依赖包分开(依赖包放在lib目录下),且位于同一级目录

2.3.1 插件功能介绍

1.maven-jar-plugin用于生成META-INF/MANIFEST.MF文件的部分内容,<mainClass>com.xxg.Main</mainClass>指定MANIFEST.MF中的Main-Class,<addClasspath>true</addClasspath>会在MANIFEST.MF加上Class-Path项并配置依赖包,<classpathPrefix>lib/</classpathPrefix>指定依赖包所在目录。

2.maven-dependency-plugin插件:maven-jar-plugin用于生成META-INF/MANIFEST.MF文件的部分内容,只是生成MANIFEST.MF文件还不够,maven-dependency-plugin插件用于将依赖包拷贝到<outputDirectory>${project.build.directory}/lib</outputDirectory>指定的位置,即lib目录下

2.3.2 pom文件的配置

1.pom文件的配置:如果有plugManagemnet标签,则在标签后面添加如下代码

<!--自定义打包方式-->
<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.6</version>
    <configuration>
      <archive>
        <manifest>
          <addClasspath>true</addClasspath>
          <classpathPrefix>lib/</classpathPrefix>
          <mainClass>com.ljf.test.Ha</mainClass>
        </manifest>
      </archive>
    </configuration>
  </plugin>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.10</version>
    <executions>
      <execution>
        <id>copy-dependencies</id>
        <phase>package</phase>
        <goals>
          <goal>copy-dependencies</goal>
        </goals>
        <configuration>
          <outputDirectory>${project.build.directory}/lib</outputDirectory>
        </configuration>
      </execution>
    </executions>
  </plugin>
</plugins>

注意:${project.build.directory}/lib 这个配置不需要修改,拿来即用。这个地方是配置依赖包存储的位置。“${project.build.directory}“ maven内置的设置无需理会。

2.执行jar包后的结构:执行jar包后会在target目录下生成jar包,并将依赖包拷贝到target/lib目录下

3. 指定了Main-Class,有了依赖包,那么就可以直接通过java -jar xxx.jar运行jar包。

2.4 appassembler-maven-plugin插件打包 

作用: 利用Maven的appassembler-maven-plugin插件,就可以实现自动打包成可运行的脚本,还可以跨平台。(Windows/linux)

1.pom文件的配置

<plugins>
  <!-- 支持java1.8 -->
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
      <source>1.8</source>
      <target>1.8</target>
    </configuration>
  </plugin>
  <!-- -使用UTF-8编码处理资源文件 -->
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <configuration>
      <encoding>UTF-8</encoding>
    </configuration>
  </plugin>
  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>appassembler-maven-plugin</artifactId>
    <version>1.2</version>
    <executions>
      <execution>
        <id>make-assembly</id>
        <phase>package</phase>
        <goals>
          <goal>assemble</goal>
        </goals>
      </execution>
    </executions>
    <configuration>
      <repositoryLayout>flat</repositoryLayout>
      <configurationDirectory>conf</configurationDirectory>
      <configurationSourceDirectory>src/main/resources</configurationSourceDirectory>
      <copyConfigurationDirectory>true</copyConfigurationDirectory>
      <includeConfigurationDirectoryInClasspath>true</includeConfigurationDirectoryInClasspath>
      <assembleDirectory>${project.build.directory}/${projectname}</assembleDirectory>
      <extraJvmArguments>-Xms256m -Xmx1024m -Xss1024k -XX:PermSize=128M
        -XX:MaxNewSize=256m -XX:MaxPermSize=128m</extraJvmArguments>
      <binFileExtensions>
        <unix>.sh</unix>
      </binFileExtensions>
      <platforms>
        <platform>windows</platform>
        <platform>unix</platform>
      </platforms>
      <repositoryName>lib</repositoryName>
      <programs>
        <program>
          <mainClass>${mainfunction}</mainClass>
          <name>startup</name>
        </program>
      </programs>
    </configuration>
  </plugin>
</plugins>

2.执行mave package操作

3. 查看打包结果:

4.进入bin目录下

5.Windows 下执行startup.bat,linux下执行startup.sh,如下图:

6.执行脚本时候 后面可以添加参数。

2.5 Springboot+Maven:spring-boot-maven-plugin

 针对springboot和maven集成的项目,打成jar包,则需要使用springboot和maven集成好的打包插件:spring-boot-maven-plugin,例如特别是含有@SpringBootApplication注解的入口启动程序。截图如下:

2.pom文件的配置

<plugins>
  <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>1.3.5.RELEASE</version>
    <configuration>
      <mainClass>com.springboot.data.es.App</mainClass>
    </configuration>
    <executions>
      <execution>
        <goals>
          <goal>repackage</goal>
        </goals>
      </execution>
    </executions>
  </plugin>
</plugins>

3.截图

 4.使用maven打成jar包:mvn clean package

5.打成jar包的结构,如下

6.执行jar包:

参考网址:   https://www.jb51.net/article/197968.htm

2.6 总结

不管通过何种方式打成jar包执行,要想jar包能直接通过java -jar xxx.jar运行,需要满足:

1、在jar包中的META-INF/MANIFEST.MF中指定Main-Class,这样才能确定程序的入口在哪里;

2、要能加载到依赖包。

到此这篇关于maven的5种打包方式小结的文章就介绍到这了,更多相关maven 打包 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 微信小程序 springboot后台如何获取用户的openid

    微信小程序 springboot后台如何获取用户的openid

    这篇文章主要介绍了微信小程序 springboot后台如何获取用户的openid,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • 如何用java编写微信小程序消息提醒推送

    如何用java编写微信小程序消息提醒推送

    最近参与开发的项目有用到微信模板消息推送,在这离记录一下,下面这篇文章主要给大家介绍了关于如何用java编写微信小程序消息提醒推送的相关资料,需要的朋友可以参考下
    2023-11-11
  • 一篇文章带你入门Java Script

    一篇文章带你入门Java Script

    这篇文章主要介绍了新手入门JavaScript的的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2021-08-08
  • Spring Boot 中的默认异常处理机制解析(如 /error 接口)

    Spring Boot 中的默认异常处理机制解析(如 /error 接口)

    SpringBoot通过/error接口默认处理异常,使用BasicErrorController返回结构化JSON或HTML错误页面,支持自定义ErrorAttributes、ControllerAdvice及错误模板,配置项可调整错误路径和格式,本文给大家介绍Spring Boot 中的默认异常处理机制解析,感兴趣的朋友一起看看吧
    2025-07-07
  • Maven Plugins报错的正确解决方案

    Maven Plugins报错的正确解决方案

    文章介绍了如何解决Maven插件报错的问题,建议在本地Maven仓库目录中删除报错的插件文件,然后在IDEA中刷新Maven以重新加载,同时,作者还提到了一个无效的方法,即通过修改Maven的setting.xml文件添加镜像源
    2026-03-03
  • spring集成mybatis实现mysql数据库读写分离

    spring集成mybatis实现mysql数据库读写分离

    本文通过实例代码给大家介绍了spring集成mybatis实现mysql数据库读写分离,需要的朋友可以参考下
    2017-08-08
  • SpringBoot中Filter bean如何添加到Servlet容器

    SpringBoot中Filter bean如何添加到Servlet容器

    这篇文章主要介绍了SpringBoot中Filter bean是怎么被添加到Servlet容器中的,本文分步骤结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • Java中object类常用方法及应用场景详解

    Java中object类常用方法及应用场景详解

    这篇文章主要介绍了Java中object类常用方法及应用场景的相关资料,正确重写这些方法是面向对象设计的基本要求,有助于避免踩坑并提高代码质量,需要的朋友可以参考下
    2025-04-04
  • Java中泛型总结(推荐)

    Java中泛型总结(推荐)

    这篇文章主要介绍了Java中泛型总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • MyBatis版本升级导致OffsetDateTime入参解析异常问题复盘

    MyBatis版本升级导致OffsetDateTime入参解析异常问题复盘

    这篇文章主要介绍了MyBatis版本升级导致OffsetDateTime入参解析异常问题复盘,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08

最新评论