Maven打包——maven-shade-plugin插件打可执行jar包

背景:

现在基本上都是采用maven来进行开发管理,我有一个需求是需要把通过maven管理的java工程打成可执行的jar包,这样也就是说必需把工程依赖的jar包也一起打包。而使用maven默认的package命令构建的jar包中只包括了工程自身的class文件,并没有包括依赖的jar包。所以根本不能执行。但我们可以通过配置插件来对工程进行打包。

步骤:

1、通过maven-assembly-plugin插件打包会出现一些问题,在此不讨论,参见:http://chenzhou123520.iteye.com/blog/1706242

我们推荐使用maven-shade-plugin,shade插件打包时在对spring.schemas文件处理上,它能够将所有jar里的spring.schemas文件进行合并,在最终生成的单一jar包里,spring.schemas包含了所有出现过的版本的集合,要使用shade插件,必须在pom进行如下配置,在<project>下面添加:

<build>  
    <resources>  
        <resource>  
            <directory>src/main/resources</directory>  
        </resource>  
    </resources>  
    <plugins>  
        <plugin>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-shade-plugin</artifactId>  
            <executions>  
                <execution>  
                    <phase>package</phase>  
                    <goals>  
                        <goal>shade</goal>  
                    </goals>  
                    <configuration>  
                        <transformers>  
                            <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>  
                        <filters>  
                            <filter>  
                                <artifact>*:*</artifact>  
                                <excludes>  
                                    <exclude>META-INF/*.SF</exclude>  
                                    <exclude>META-INF/*.DSA</exclude>  
                                    <exclude>META-INF/*.RSA</exclude>  
                                </excludes>  
                            </filter>  
                        </filters>  
                    </configuration>  
                </execution>  
            </executions>  
        </plugin>  
    </plugins>  
</build>  
其中类似于下面这段,意思是把spring.handlers文件以append方式加入到构建的jar包中,spring.schemas同理,这样就不会存在出现xsd找不到的情况。

<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
     <resource>META-INF/spring.handlers</resource>
</transformer>


其中<filters>里面的配置项意思是在构建jar包时将META-INF目录下的SF、DSA、RSA文件排除在外,即不会包含在jar包里面。


2、配置完pom后,调用mvn clean install命令进行构建,构建成功后打开工程target目录,发现生成了2个jar包,一个为:original-XXX-0.0.1-SNAPSHOT.jar,另一个为:XXX-0.0.1-SNAPSHOT.jar,其中original...jar里只包含了工程自己的class文件,而另外的一个jar包则包含了工程本身以及所有依赖的jar包的class文件。我们只需要使用第二个jar包就可以了。

默认打包生成的jar是不能直接运行的,因为带有main方法的信息不会添加到mainfest中,需要借助maven-shade-plugin

<project>  
  ...  
  <build>  
    <plugins>  
      <plugin>  
        <groupId>org.apache.maven.plugins</groupId>  
        <artifactId>maven-shade-plugin</artifactId>  
        <version>2.0</version>  
        <configuration>  
          <transformers>  
         <transformer implementation = "org.apache.maven.plugins.shade.resource.MainifestResourceTransformer">  
         <mainClass>com.xun.pf.sayHello.HelloWorld</mainClass>  
         </transformer>  
      </transformers>  
        </configuration>  
        <executions>  
          <execution>  
            <phase>package</phase>  
            <goals>  
              <goal>shade</goal>  
            </goals>  
          </execution>  
        </executions>  
      </plugin>  
    </plugins>  
  </build>  
  ...  
</project> 
com.xun.pf.sayHello.HelloWorld为包含main方法的class就可以使用Java -jar xxx.jar执行了参考:徐晓斌


猜你喜欢

转载自blog.csdn.net/weixin_39246787/article/details/80577694