使用 maven 插件 maven-shade-plugin 對可執行 java 工程及其所有依賴

前半部分轉自:http://www.xuebuyuan.com/1500726.html html

如今基本上都是採用maven來進行開發管理,我有一個需求是須要把經過maven管理的java工程打成可執行的jar包,這樣也就是說必需把工程依賴的jar包也一塊兒打包。而使用maven默認的package命令構建的jar包中只包括了工程自身的class文件,並無包括依賴的jar包。咱們能夠經過配置插件來對工程進行打包,pom具體配置以下: java

maven-assembly-plugin (使用此插件會有一些問題) spring


<plugin>  
     <artifactId>maven-assembly-plugin</artifactId>  
     <configuration>  
         <appendAssemblyId>false</appendAssemblyId>  
         <descriptorRefs>  
             <descriptorRef>jar-with-dependencies</descriptorRef>  
         </descriptorRefs>  
         <archive>  
             <manifest>  
                 <mainClass>com.chenzhou.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.chenzhou.examples.Main。配置完pom後能夠經過執行mvn assembly:assembly命令來啓動插件進行構建。構建成功後會生成jar包,這樣咱們就能夠在命令行中經過java -jar XXX.jar來運行jar件了。  apache

 

不過使用此插件會有一些問題:我在工程中依賴了spring框架的jar包,我打包成功後使用命令來調用jar包時報錯以下(內網環境): app

org.xml.sax.SAXParseException: schema_reference.4: Failed to read schema document 'http://www.springframework.org/schema/beans/spring-beans-3.0.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.


關於此問題報錯的緣由,我在網上找到一篇文章對此有比較詳細的解釋:http://blog.csdn.net/bluishglc/article/details/7596118 簡單來講就是spring在啓動時會加載xsd文件,它首先會到本地查找xsd文件(通常都會包含在spring的jar包中),若是找不到則會到xml頭部定義的url指定路徑下中去尋找xsd,若是找不到則會報錯。 框架

附:在spring jar包下的META-INF文件夾中都會包含一個spring.schemas文件,其中就包含了對xsd文件的路徑定義,具體以下圖所示: maven

圖:spring-aop.jar包下META-INF文件夾下的內容 ui

圖:spring.schemas文件內容 url


因爲個人工程是在內網,因此經過url路徑去尋找確定是找不到的,可是比較奇怪的是既然spring的jar包中都會包含,那爲何仍是找不到呢? spa

 原來這是assembly插件的一個bug,具體狀況參見:http://jira.codehaus.org/browse/MASSEMBLY-360

該bug產生的緣由以下:工程通常依賴了不少的jar包,而被依賴的jar又會依賴其餘的jar包,這樣,當工程中依賴到不一樣的版本的spring時,在使用assembly進行打包時,只能將某一個版本jar包下的spring.schemas文件放入最終打出的jar包裏,這就有可能遺漏了一些版本的xsd的本地映射,因此會報錯。

因此通常推薦使用另外的一個插件來進行打包,插件名稱爲:maven-shade-plugin,shade插件打包時在對spring.schemas文件處理上,它可以將全部jar裏的spring.schemas文件進行合併,在最終生成的單一jar包裏,spring.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.chenzhou.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>


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

  1. <transformer  
  2.     implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">  
  3.    
    < resource>META-INF/spring.handlers</resource>  
  4. </transformer>  
  5. <transformer  
  6.    implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">  
  7.   
    < resource>META-INF/spring.schemas</resource> 
  8. </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包就能夠了。

參考資料:

http://hi.baidu.com/yuzhi2217/item/2c1714363f25c4f62684f442

http://blog.csdn.net/bluishglc/article/details/7596118

http://jira.codehaus.org/browse/MASSEMBLY-360


我此次是因爲把dubbo-admin改爲一個jar 可執行型遇到打成的jar 加載spring 文件時找不到文件,因此。這個shade這個插件,仍是咱們另外的開發把咱們的另外一個項目用的這種打包方式,因此纔給我改了一下,我也單獨使用過shade 這個卑件打包,一樣報的是打不到spring文件,因此,我讓他給我給找找緣由,找到了這篇,因此,我須要記錄一下。

同時把我打包的xml發出來。


<build>
	    <finalName>bbupdate</finalName>
<!-- 	    <filters> -->
<!-- 	    	<filter>src/main/resources/filter/${env}.properties</filter> -->
<!-- 	    </filters> -->
	    <resources>
	      	<resource>
	           <directory>src/main/resources</directory>
	           <filtering>true</filtering>
	       </resource>
	    </resources>
		<plugins>
		    <plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.6</source>
					<target>1.6</target>
				</configuration>
			</plugin>
			<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>
							<filters>
								<filter>
									<artifact>*:*</artifact>
									<excludes>
										<exclude>META-INF/*.SF</exclude>
										<exclude>META-INF/*.DSA</exclude>
										<exclude>META-INF/*.RSA</exclude>
									</excludes>
								</filter>
							</filters>
							<transformers>
								<transformer
									implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
									<mainClass>com.bbpay.bbupdate.main.Bbupdate</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>
		</plugins>
	</build>


個人問題和他的問題不同,他報的是找不到XSD,而我報的是找不到spring的xml配置文件,可是配置文件確實在,因此,可是我用了這個以後,確實能夠了。

無語,感受和他這個找不到XSD緣由相似,記錄。方便下次查找。

相關文章
相關標籤/搜索