-
<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命名空间无法找到的错误,
-
-
org.xml.sax.SAXParseException: schema_reference.4: 无法读取方案文档 '', 原因为 1) 无法找到文档; 2) 无法读取文档; 3) 文档的根元素不是 <xsd:schema>。
-
-
据查是由于spring-core,spring-aop每一个jar中都包含了一套spring.handlers,spring.schemas文件,以至于在打包过程中发生了覆盖,网上没有搜到使用maven-assembly-plugin插件如何解决此问题,大多数人建议使用maven-shade-plugin插件,修改后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.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>
再次打包,出现文件签名不合法的问题
Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributes
再查,原来是由于某些包的重复引用,以至于打包之后的META-INF的目录下多出了一些*.SF,*.DSA,*.RSA文件所致(据说解压jar包,然后删掉这些文件再次打包错误就会消失,未确认),再次修改pom.xml,最终使用如下配置文件,运行
mvn clean install -Dmaven.test.skip=true
-
<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包,直接运行前一个即可
成功!
PS:项目中使用了几个公司自己的jar,在公有库里没有,在eclipse里运行的时候我都是修改scope为system,调用的本地jar,但是在打包的过程中scope=system的jar是不会自己打进去的,很是让我郁闷,我只好讲这些jar安装进入本地资源库
mvn install:install-file -Dfile=my-jar.jar -DgroupId=org.richard -DartifactId=my-jar -Dversion=1.0 -Dpackaging=jar
阅读(1002) | 评论(0) | 转发(0) |