前半部分轉自: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>
上面配置文件中有一段定義:
上面這段配置意思是把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緣由相似,記錄。方便下次查找。