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