MAVEN的三种打包方式
MAVEN的三种打包方式
Maven可以使用mvn package指令对项目进行打包,如果使用Java -jar xxx.jar执行运行jar文件,会出现"no main manifest attribute, in xxx.jar"(没有设置Main-Class)、ClassNotFoundException(找不到依赖包)等错误。
要想jar包能直接通过java -jar xxx.jar运行,需要满足:
1、在jar包中的META-INF/MANIFEST.MF中指定Main-Class,这样才能确定程序的入口在哪里;
2、要能加载到依赖包。
使用Maven有以下几种方法可以生成能直接运行的jar包,可以根据需要选择一种合适的方法。
方法一:使用maven-jar-plugin和maven-dependency-plugin插件打包
在pom.xml中配置,注意标签使用pluginManagement配置plugins和直接配置plugins是不同的。
区别是:
- pluginManagement是一种在项目的多个模块中共享相同插件配置的方法, 它旨在配置可以被其它模块继承的插件信息,即是对插件的声明,在pluginManagement中配置plugins,执行maven命令时,不会被maven加载。
pluginManagement中声明的插件可以被当前pom或子pom中引用,比如你在项目的父pom中使用pluginManagement声明插件,那么在子pom中可以继承该插件,只需要在plugins节点中配置 groupId 和 artifactId就可以完成插件的引用。 - plugins才是插件的实际调用,它可以自己定义plugin,也可以从父pom的pluginManagement中继承。
以下是直接在标签配置plugins。
<build> <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.xxg.Main</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>
</build>
maven-jar-plugin用于生成META-INF/MANIFEST.MF文件的部分内容,com.xxg.Main指定MANIFEST.MF中的Main-Class,true会在MANIFEST.MF加上Class-Path项并配置依赖包,lib/指定依赖包所在目录。
例如下面是一个通过maven-jar-plugin插件生成的MANIFEST.MF文件片段:
Class-Path: lib/json-lib-2.4-jdk15.jar lib/commons-beanutils-1.8.0.jar lib/commons-collections-3.2.1.jar lib/commons-lang-2.5.jar lib/commons-logging-1.1.1.jar lib/ezmorph-1.0.6.jar lib/httpclient-4.5.12.jar lib/httpcore-4.4.13.jar lib/commons-codec-1.11.jar lib/mysql-connector-java-8.0.24.jar lib/protobuf-java-3.11.4.jar
Main-Class: com.crland.App
只是生成MANIFEST.MF文件还不够,maven-dependency-plugin插件用于将依赖包拷贝到${project.build.directory}/lib指定的位置,即lib目录下。
配置完成后,通过mvn package指令打包,会在target目录下生成jar包,并将依赖包拷贝到target/lib目录下,目录结构如下:
指定了Main-Class,有了依赖包,那么就可以直接通过java -jar xxx.jar运行jar包。
这种方式生成jar包有个缺点,就是生成的jar包太多不便于管理,下面两种方式只生成一个jar文件,包含项目本身的代码、资源以及所有的依赖包。
方法二:使用maven-assembly-plugin插件打包
在pom.xml的中配置:
<plugin><artifactId>maven-assembly-plugin</artifactId><version>2.4</version><configuration><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs><archive><manifest><mainClass>${mainClass}</mainClass></manifest></archive></configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions>
</plugin>
打包方式:
mvn clean install assembly:assembly -DdescriptorId=jar-with-dependencies -DskipTests
其中package、single即表示在执行package打包时,执行assembly:single,所以可以直接使用mvn package打包。
不过,如果项目中用到Spring Framework,用这种方式打出来的包运行时会出错,使用下面的方法三可以处理。
方法三:使用maven-shade-plugin插件打包
在pom.xml中配置:
<build><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.xxg.Main</mainClass></transformer></transformers></configuration></execution></executions></plugin></plugins>
</build>
配置完成后,执行mvn package即可打包。在target目录下会生成两个jar包,注意不是original-xxx.jar文件,而是另外一个。和maven-assembly-plugin一样,生成的jar文件包含了所有依赖,所以可以直接运行。
如果项目中用到了Spring Framework,将依赖打到一个jar包中,运行时会出现读取XML schema文件出错。原因是Spring Framework的多个jar包中包含相同的文件spring.handlers和spring.schemas,如果生成一个jar包会互相覆盖。为了避免互相影响,可以使用AppendingTransformer来对文件内容追加合并:
<build><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.xxg.Main</mainClass></transformer><transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>META-INF/spring.handlers</resource></transformer><transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>META-INF/spring.schemas</resource></transformer></transformers></configuration></execution></executions></plugin></plugins>
</build>
参考文章:https://blog.csdn.net/xiao__gui/article/details/47341385#
MAVEN的三种打包方式相关推荐
- Maven的三种打包方式(jar、shade、assembly)
文章目录 01 引言 02 assembly打包 2.1 介绍 2.2 使用 2.3 字段解析 03 jar打包 3.1 介绍 3.2 使用 3.3 字段解析 04 shade打包 4.1 介绍 4. ...
- Maven的三种packaging方式(pom、jar、war)
Maven的三种packaging方式(pom.jar.war) pom是maven依赖文件 jar是java普通项目打包 war是java web项目打包 pom:打出来可以作为其他项目的m ...
- python中if brthon环境安装包_Ant、Gradle、Python三种打包方式的介绍
今天谈一下Androdi三种打包方式,Ant.Gradle.Python. 当然最开始打包用Ant 很方便,后来转Studio开发,自带很多Gradle插件就用了它,然后随着打包数量越多,打包时间成了 ...
- Spring Boot项目(Maven\Gradle)三种启动方式及后台运行详解
Spring Boot项目三种启动方式及后台运行详解 1 Spring Boot项目三种启动方法 运行Application.java类中的Main方法 项目管理工具启动 Maven项目:mvn sp ...
- maven三种打包方式详解
目录 maven常用打包命令 1 方法一:使用maven-jar-plugin和maven-dependency-plugin插件打包 2 方法二:使用maven-assembly-plugin插件打 ...
- maven的三种packaging方式
pom是maven依赖文件 jar是java普通项目打包 war是java web项目打包 pom:打出来可以作为其他项目的maven依赖,在工程A中添加工程B的pom,A就可以使用B中的类.用在父级 ...
- jenkins部署三种构建方式的详细步骤
部署背景: jenkins: CentOS 7.4C IP:172.16.3.74 gitlab-11.5.3: Cen ...
- vue.js三种安装方式
Vue.js(读音 /vjuː/, 类似于 view)是一个构建数据驱动的 web 界面的渐进式框架.Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件.它不仅易于上手 ...
- spring入门之Spring 常用的三种注入方式
Spring 常用的三种注入方式 Spring 通过 DI(依赖注入)实现 IOC(控制反转),常用的注入方式主要有三种:构造方法注入,set 方法注入,基于注解的注入. 一.通过构造方法注入 先简单 ...
最新文章
- docker 建mysql
- 2019牛客暑期多校训练营(第一场) A	Equivalent Prefixes ( st 表 + 二分+分治)
- 再赠邓超明(帮别人名字作诗)
- 光栅图形学算法基础其三 (消隐算法)
- android获取服务器时间格式,Android 获取服务器与客户端时差的实例代码
- 南大电子机器人入驻云南_园区优秀企业| 中科恒清清淤机器人,以智能科技为水环境治理保驾护航...
- 怎么能更好地利用好大数据分析
- php static 关键字
- mac本 安装淘宝镜像
- 前端工程化之FaaS SSR方案​
- Jdk11下载及idea演示
- lilypond 符号_LilyPond演奏优美的音乐
- Android解决Could not find manifest-merger.jar问题
- kali mysql安装教程_MySQL 安装教程(windows版)
- Hadoop之——计算机网络端口的定义
- Efficient Parameter-free Clustering Using First Neighbor Relations
- 太空动作游戏《Phobos Vector Prime》创作经验分享
- 从程序员的角度设计一个Java的神经网络
- js 正则解决密码必须包含数字+特殊字符+英文字母大小写
- UML中各种图形的关系和用法