Maven学习之打包插件

maven的打包插件主要有maven-shade-plugin 和maven-assembly-plugin两种,两种插件的主要差别如下

(1) maven-assembly-plugin

<plugin>  
    <artifactId>maven-assembly-plugin</artifactId>  
    <configuration>  
        <appendAssemblyId>false</appendAssemblyId>  
        <descriptorRefs>  
            <descriptorRef>jar-with-dependencies</descriptorRef>  
        </descriptorRefs>  
        <archive>  
            <manifest>  
                <mainClass>com.examples.Main</mainClass>  
            </manifest>  
        </archive>  
    </configuration>  
    <executions>  
        <execution>  
            <id>make-assembly</id>  
            <phase>package</phase>  
            <goals>  
                <goal>assembly</goal>  
            </goals>  
        </execution>  
    </executions>  
</plugin>  

    其中 <mainClass></mainClass> 的值表示此工程的入口类,也就是包含 main 方法的类,在我的例子中就是 com.examples.Main。配置完 pom 后可以通过执行 mvn assembly:assembly 命令来启动插件进行构建。构建成功后会生成 jar 包,这样我们就可以在命令行中通过 java -jar XXX.jar 来运行 jar 文件了。

    但是该插件有一些bug , 详细见:http://jira.codehaus.org/browse/MASSEMBLY-360 ,该 bug 产生的原因如下:工程一般依赖了很多的 jar 包,而被依赖的 jar 又会依赖其他的 jar 包,这样,当工程中依赖到不同的版本的jar时,在使用 assembly 进行打包时,只能将某一个版本 jar 包下的 schemas 文件放入最终打出的jar包里,这就有可能遗漏了一些版本的 xsd 的本地映射,所以会报错。

(2)maven-shade-plugin

    shade 插件打包时在对某一框架的 schemas 文件处理上,它能够将所有该框架jar里的 schemas 文件进行合并,在最终生成的单一jar包里,schemas 包含了所有出现过的版本的集合,要使用 shade 插件,必须在 pom 进行如下配置:

<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.AppendingTransformer">  
                        <resource>META-INF/spring.handlers</resource>  
                    </transformer> 
                    <transformer  
                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">  
                        <mainClass>com.examples.Main</mainClass>  
                    </transformer>  
                    <transformer  
                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">  
                        <resource>META-INF/spring.schemas</resource>  
                    </transformer>  
                </transformers>  
            </configuration>  
        </execution>  
    </executions>  
</plugin>  

上面配置文件中有一段定义:

<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>

上面这段配置意思是把 spring.handlers 和 spring.schemas 文件以 append 方式加入到构建的 jar 包中,这样就不会出现 xsd 找不到的情况。

配置完 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 包就可以了。

转自:https://blog.csdn.net/lisheng19870305/article/details/88300951

posted @ 2020-02-15 10:38  天~宇~翱~翔  阅读(2626)  评论(0编辑  收藏  举报