前半部分转自: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缘由相似,记录。方便下次查找。