开始使用以下代码进行打包java
<build> <!-- mvn assembly:assembly -Dmaven.test.skip=true --> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>2.2-beta-5</version> <configuration> <appendAssemblyId>false</appendAssemblyId> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>com.fxc.rpc.impl.member.MemberProvider</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>assembly</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
结果出现spring命名空间没法找到的错误,spring
org.xml.sax.SAXParseException: schema_reference.4: 没法读取方案文档 'http://www.springframework.org/schema/beans/spring-beans.xsd', 缘由为 1) 没法找到文档; 2) 没法读取文档; 3) 文档的根元素不是 <xsd:schema>。
据查是因为spring-core,spring-aop每个jar中都包含了一套spring.handlers,spring.schemas文件,以致于在打包过程当中发生了覆盖,网上没有搜到使用maven-assembly-plugin插件如何解决此问题,大多数人建议使用maven-shade-plugin插件,修改后pom代码以下apache
<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.fxc.rpc.impl.member.MemberProvider</mainClass> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/spring.schemas</resource> </transformer> </transformers> </configuration> </execution> </executions> </plugin>
再次打包,出现文件签名不合法的问题app
Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributes
再查,原来是因为某些包的重复引用,以致于打包以后的META-INF的目录下多出了一些*.SF,*.DSA,*.RSA文件所致(听说解压jar包,而后删掉这些文件再次打包错误就会消失,未确认),再次修改pom.xml,最终使用以下配置文件,运行eclipse
mvn clean install -Dmaven.test.skip=true
打包成功maven
<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.AppendingTransformer"> <resource>META-INF/spring.handlers</resource> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.fxc.rpc.impl.member.MemberProvider</mainClass> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/spring.schemas</resource> </transformer> </transformers> </configuration> </execution> </executions> </plugin>
此时查看target目录下会发现xxx.jar 和original-xxx.jar,后一个不包含引用的jar包,直接运行前一个便可ide
java -jar target/xxx.jar
成功!ui
PS:项目中使用了几个公司本身的jar,在公有库里没有,在eclipse里运行的时候我都是修改scope为system,调用的本地jar,可是在打包的过程当中scope=system的jar是不会本身打进去的,非常让我郁闷,我只好讲这些jar安装进入本地资源库spa
mvn install:install-file -Dfile=my-jar.jar -DgroupId=org.richard -DartifactId=my-jar -Dversion=1.0 -Dpackaging=jar