maven插件(4) - 项目打包插件

1. maven-assembly-plugin

参考maven-assembly-plugin, maven-assembly-plugin这个插件可用来打可发布可独立运行的jar包, 也就是说它可以将项目中所有依赖打进包。

使用插件
在pom中加入:

<plugins>
<plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                   <!--这个插件会输出多个包,原始包不包含任何依赖,
                   以及一个或者多个包含所有依赖的包,这些包以<descriptorRef>中的value为后缀。 这里可以配置n个<descriptorRef>,就会多生成n个包含所有依赖的包-->
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <executions>
                    <execution>
                        <!--这里将single这个goal绑定在package这个phase上-->
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                       <!--<configuration>-->
                            <!--<archive>-->
                                <!--<manifest>-->
                                    <!--<mainClass>me.test.sparktest.WordCount</mainClass>-->
                                <!--</manifest>-->
                            <!--</archive>-->
                        <!--</configuration>-->
                    </execution>
                </executions>
            </plugin>
</plugins>

使用命令:

mvn assembly:single 

** 生成可运行的包**
去掉上面配置中<configuration></configuration>的注释,<mainClass>这个元素指定了MANIFEST.MF中的Main-Class。

2. maven-shade-plugin

这个插件功能介绍如下:

This plugin provides the capability to package the artifact in an uber-jar.
关于什么是uber-jar可以参考stackoverflow上的回答what-is-an-uber-jar

和assembly插件一样它也可以将所有依赖打到包中,同时也可以打可执行的jar包。

参考官方文档:maven-shade-plugin

1. 使用插件
在pom中加入配置:

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.1.0</version>
        <configuration>
          <!-- put your configurations here -->
        </configuration>
        <executions>
          <execution>
            <!--将shade 这个goal绑定到package这个phase上-->
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
          </execution>
        </executions>
</plugin>

运行命令mvn package(将shade绑定在package这个phase上,不然会出错)

2. 可执行jar包
加入如下配置:

<plugin>
...
<configuration>
           <transformers>
                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                  <!--指定main所在的class-->
                   <mainClass>me.test.sparktest.WordCount</mainClass>
         
                </transformer>
          </transformers>
</configuration>
...
</pluigin>

3. 改变MANIFEST.MF
依然是2中的配置, 如下:

<plugin>
...
<executions>
  ...
   <execution>
   ...
     <configuration>
           <transformers>
                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                   <manifestEntries>
                        <!--按照key: value 的形式在MANIFEST.MF中加入配置-->
                        <Main-Class>me.test.sparktest.WordCount</Main-Class>
                        <JdkSourceVersion>1.7</JdkSourceVersion>
                   </manifestEntries>
                </transformer>
          </transformers>
      </configuration>
   ...
   </execution>
...
</executions>

加入:<Main-Class>me.test.sparktest.WordCount</Main-Class>会在MANIFEST.MF中加入Main-Class: me.test.sparktest.WordCount这样的信息
加入:<JdkSourceVersion>1.7</JdkSourceVersion>会在生成的MANIFEST.MF中加入JdkSourceVersion: 1.7这样一行。

参考setting manifest entry
4. 合并资源文件
当项目中有很多同名的资源文件是,默认的行为是覆盖,比如spring项目的很多模块里都有META-INF/spring.handlers这个文件(spring依靠这些文件去解析spring xml文件里面的元素), 如果采用默认的覆盖行为显然会导致错误,加入如下配置:

<plugin>
...
<executions>
       <execution>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <transformers>
             <!--AppendingTransformer会将相同的资源文件合并成一个,这里将META-INF/spring.handlers合并成一个-->
                <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>

参考merging resource

    原文作者:aaron1993
    原文地址: https://www.jianshu.com/p/aeff58ce1534
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞