项目中用maven来进行项目管理,现在有一个需求就是要把项目打包成可执行的jar文件,先试了一下 mvn package 命令,结果发现只能生成自己代码的class文件,依赖的jar包不能够加包进去。然后去搜索了mvn的一个插件 maven-assembly-plugin 可以实现一起打包,并且直接可以加入入口类。1、修改pom.xml文件加入assembly 支持
1 <plugin> 2 <artifactId>maven-assembly-plugin</artifactId> 3 <version>2.2</version> 4 <configuration> 5 <archive> 6 <manifest> 7 <mainClass>com.公司名.入口类</mainClass> 8 </manifest> 9 </archive> 10 <descriptorRefs> 11 <descriptorRef> 12 jar-with-dependencies 13 </descriptorRef> 14 </descriptorRefs> 15 <descriptors> <!--描述文件路径 --> 16 <descriptor>src/main/resources/assembly.xml</descriptor> 17 </descriptors> 18 </configuration> 19 </plugin>
其中 mainClass 就是你要之行的入口类,也就是包含Main函数的那个类。
assembly.xml 文件如下
<?xml version="1.0" encoding="UTF-8"?> <assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd"> <id>distribution</id> <formats> <format>jar</format> </formats> <includeBaseDirectory>false</includeBaseDirectory> <fileSets> <fileSet> <directory>${project.basedir}\src\main\resources</directory> <outputDirectory>\</outputDirectory> </fileSet> <fileSet> <directory>${project.basedir}\target\classes</directory> <outputDirectory>\</outputDirectory> </fileSet> </fileSets> <dependencySets> <dependencySet> <useProjectArtifact>false</useProjectArtifact> <outputDirectory>lib</outputDirectory> <unpack>false</unpack> <!-- 将scope为runtime的依赖包打包到lib目录下。 --> <scope>runtime</scope> </dependencySet> </dependencySets> </assembly>
配置完之后就可以执行 mvn assembly:assembly 来进行打包,会默认把所依赖的jar包打包进去。但是发现一个问题,就是基于spring的项目在执行jar的时候回报错
Offending resource: class path resource [applicationContext.xml]
这是spring 启动的时候会加载xsd文件,每一个spring的jar包的都有spring.schemas 其中包含了对xsd文件的路径定义。但是我们在打包的jar中的spring.schemas 没有对应报错的对应的xsd文件。经过查看一些blog发现,这是assembly插件的一个bug,对于多个spring包,spring.schemas文件会被后面加载的spring包中文件所覆盖,造成找不到对应xsd情况。
又经过一段网上的搜索,找到一个完美解决这个问题的插件 maven-shade-plugin shade插件在处理spring.schemas文件的时候采用的是追加的方式,而不是覆盖。
pom.xml修改如下
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>1.4</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.公司名称.入口类</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>
这样配置完之后,就可以直接执行mvn package 进行打包操作,到target 目录下会生成两个jar包,一个是original开头的jar,这个jar是项目自身代码编译的jar,另一个就是包含所有依赖jar的jar文件了。
通过 java -jar xxx.jar 参数 来执行此jar。到此完美解决问题。
浙公网安备 33010602011771号