maven的5种打包方式,终有一款适合你1

26 篇文章 3 订阅

一 问题阐述

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://blog.csdn.net/qq_15266291/article/details/77198073

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来运行。

https://blog.csdn.net/daiyutage/article/details/53739452

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包。

https://blog.csdn.net/daiyutage/article/details/53739452

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.执行脚本时候 后面可以添加参数。

http://www.coin163.com/d/open/maven/10.html

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://blog.csdn.net/m0_37984852/article/details/79663132 

2.6 总结

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

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

2、要能加载到依赖包。

3.文档见百度网盘:

  • 14
    点赞
  • 101
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: org.apache.maven.plugins:maven 是 Apache Maven 的一个插件。Maven 是一个项目管理和构建工具,它通过使用插件来执行各任务,如编译代码、测试、打包和部署。org.apache.maven.plugins:maven 插件是 Maven 的核心插件,它包含了 Maven 的基本功能。 ### 回答2: org.apache.maven.plugins:maven是一组Maven插件的集合,它们可以帮助开发人员在Maven构建过程中完成各任务。这些插件由Apache Maven项目开发和维护,是Maven工具的重要组成部分。 Maven是一个流行的Java项目构建工具,它使用构建文件(pom.xml)来定义项目的依赖关系、插件和构建阶段。在构建过程中,Maven将执行一系列的构建任务,例如编译源代码、运行测试、打包应用程序等。 org.apache.maven.plugins:maven插件为开发人员提供了一独立于构建工具之外的方式来扩展Maven的功能,可以用它来完成更多的构建任务。 这些插件包括: - 编译插件:用于编译Java源代码编译成可执行的Java字节码文件。 - 清理插件:清理目标目录下的所有文件,包括编译结果。 - 打包插件:用于打包应用程序,例如将Java类文件打包成JAR文件。 - 安装插件:将项目构建结果安装到本地仓库中,以便之后可以在其他Maven项目中引用。 - 部署插件:将项目构建结果安装到远程Maven仓库中,以便其他开发人员可以使用。 - Surefire插件:运行测试用例,可以在构建时进行自动化测试。 - Jacoco插件:生成代码覆盖率报告,以便开发人员可以了解测试脚本的覆盖率情况。 除了上述插件,org.apache.maven.plugins:maven中还包含了许多其他有用的插件。通过这些插件,开发人员可以更容易地扩展Maven的功能,实现自动化构建和测试。 ### 回答3: org.apache.maven.plugins:maven是一个非常重要的Maven插件集合,它包含了很多常用的功能,可以帮助开发人员更加高效地管理和构建项目。 首先,org.apache.maven.plugins:maven中包含了很多用于编译、测试、打包等操作的插件,如maven-compiler-plugin、maven-surefire-plugin、maven-jar-plugin等。这些插件提供了非常方便的命令行接口,可以快速地执行对应的任务,而且通常都具有很好的扩展性和定制性,可以根据实际需要进行配置和调整。 其次,org.apache.maven.plugins:maven还包含了很多用于代码分析、质量管理等方面的插件,如maven-checkstyle-plugin、maven-pmd-plugin、maven-findbugs-plugin等。这些插件可以帮助开发人员发现潜在的代码问题,提高代码质量和可维护性,同时也可以帮助项目管理者更好地掌握项目状态和进度,及时发现并解决问题。 除此之外,org.apache.maven.plugins:maven还包含了很多用于部署、发布等方面的插件,如maven-deploy-plugin、maven-release-plugin等。这些插件可以帮助开发人员快速地将项目部署到服务器上,并进行版本管理和发布,提高开发和运维的效率。 综上所述,org.apache.maven.plugins:maven是一个非常强大、丰富的插件集合,可以帮助开发人员更加高效地管理和构建项目,同时也可以提高代码质量和可维护性,保证项目的高质量和可靠性。如果你需要使用Maven进行项目管理和构建,那么不妨尝试一下org.apache.maven.plugins:maven插件集合,相信你一定会感受到它的强大和便利。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值