首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

项目用maven封装后,依赖内部资源丢失的解决

2012-07-01 
项目用maven打包后,依赖内部资源丢失的解决问题项目用maven打包后,运行时显示无法找到服务资源,而丢失的资

项目用maven打包后,依赖内部资源丢失的解决
问题
项目用maven打包后,运行时显示无法找到服务资源,而丢失的资源来自于项目所依赖的JAR包。

分析
maven打包时,将所依赖JAR包内的有用内容,按原来的包结构复制到目标包中。检查丢失的内容,物理文件存在于目标包中,判断应是配置信息丢失。
配置信息位于目标包中\META-INF\services\,内容大体是如下形式:

...com.sun.jersey.core.impl.provider.entity.RenderedImageProvidercom.sun.jersey.core.impl.provider.entity.MimeMultipartProvidercom.sun.jersey.core.impl.provider.entity.FormProvidercom.sun.jersey.core.impl.provider.entity.FormMultivaluedMapProvidercom.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$Appcom.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$Text...

所丢失的内容在相应配置文件中找不到。查看所依赖的JAR包,发现多个同名配置文件出现在不同依赖包中。maven打包时进行了覆盖而不是续写,所以出现配置内容丢失问题。

解决
maven为该问题提供了Resource Transformers插件,用以指定需要续写的文件名,以防配置信息丢失。链接http://maven.apache.org/plugins/maven-shade-plugin/examples/resource-transformers.html。

pom完整配置如下,供参考:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.mren</groupId><artifactId>simplejerseyserver</artifactId><packaging>jar</packaging><version>0.0.1-SNAPSHOT</version><name>jerseyserver</name><properties><jersey-version>1.9.1</jersey-version></properties><dependencies><dependency><groupId>com.sun.jersey</groupId><artifactId>jersey-server</artifactId><version>${jersey-version}</version></dependency><dependency><groupId>com.sun.jersey</groupId><artifactId>jersey-grizzly</artifactId><version>${jersey-version}</version></dependency><dependency><groupId>com.sun.jersey</groupId><artifactId>jersey-json</artifactId><version>${jersey-version}</version></dependency><dependency><groupId>com.sun.jersey.contribs</groupId><artifactId>jersey-multipart</artifactId><version>${jersey-version}</version></dependency><dependency><groupId>com.sun.jersey.jersey-test-framework</groupId><artifactId>jersey-test-framework-grizzly</artifactId><version>${jersey-version}</version><scope>test</scope></dependency><dependency><groupId>com.sun.jersey</groupId><artifactId>jersey-client</artifactId><version>${jersey-version}</version><scope>test</scope></dependency><dependency><groupId>com.sun.grizzly</groupId><artifactId>grizzly-servlet-webserver</artifactId><version>1.9.18-i</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.16</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><inherited>true</inherited><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><transformers><transformerimplementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"><mainClass>com.mren.jerseyserver.ServerMain</mainClass></transformer><transformerimplementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>META-INF/services/javax.ws.rs.ext.MessageBodyWriter</resource></transformer><transformerimplementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>META-INF/services/javax.ws.rs.ext.MessageBodyReader</resource></transformer><transformerimplementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>META-INF/services/com.sun.jersey.spi.inject.InjectableProvider</resource></transformer><transformerimplementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>META-INF/services/com.sun.jersey.spi.HeaderDelegateProvider</resource></transformer><transformerimplementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>META-INF/services/com.sun.jersey.server.impl.model.method.dispatch.ResourceMethodDispatchProvider</resource></transformer><transformerimplementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>META-INF/services/com.sun.jersey.spi.container.ContainerProvider</resource></transformer><transformerimplementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>META-INF/services/com.sun.jersey.spi.container.ContainerRequestFilter</resource></transformer><transformerimplementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>META-INF/services/com.sun.jersey.spi.container.WebApplicationProvider</resource></transformer><transformerimplementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>META-INF/services/com.sun.jersey.spi.StringReaderProvider</resource></transformer><transformerimplementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>META-INF/services/javax.enterprise.inject.spi.Extension</resource></transformer><transformerimplementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>META-INF/services/javax.servlet.ServletContainerInitializer</resource></transformer><transformerimplementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>META-INF/services/javax.ws.rs.ext.RuntimeDelegate</resource></transformer></transformers></configuration></execution></executions></plugin></plugins></build><repositories><repository><id>maven2-repository.java.net</id><name>Java.net Repository for Maven</name><url>http://download.java.net/maven/2/</url><layout>default</layout></repository><repository><id>maven-repository.java.net</id><name>Java.net Maven 1 Repository (legacy)</name><url>http://download.java.net/maven/1</url><layout>legacy</layout></repository></repositories></project>

热点排行