一 问题阐述
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插件后不起作用,找不到主类的原因。
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包:
参考网址:
2.6 总结
不管通过何种方式打成jar包执行,要想jar包能直接通过java -jar xxx.jar运行,需要满足:
1、在jar包中的meta-inf/manifest.mf中指定main-class,这样才能确定程序的入口在哪里;
2、要能加载到依赖包。
到此这篇关于maven的5种打包方式小结的文章就介绍到这了,更多相关maven 打包 内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论