项目中用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。到此完美解决问题。

posted on 2015-10-15 17:30  ghost_man  阅读(2680)  评论(0)    收藏  举报