`
ren78min
  • 浏览: 43434 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

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

分析
maven打包时,将所依赖JAR包内的有用内容,按原来的包结构复制到目标包中。检查丢失的内容,物理文件存在于目标包中,判断应是配置信息丢失。
配置信息位于目标包中\META-INF\services\,内容大体是如下形式:
...
com.sun.jersey.core.impl.provider.entity.RenderedImageProvider
com.sun.jersey.core.impl.provider.entity.MimeMultipartProvider
com.sun.jersey.core.impl.provider.entity.FormProvider
com.sun.jersey.core.impl.provider.entity.FormMultivaluedMapProvider
com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$App
com.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>
								<transformer
									implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
									<mainClass>com.mren.jerseyserver.ServerMain</mainClass>
								</transformer>
								<transformer
									implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
									<resource>META-INF/services/javax.ws.rs.ext.MessageBodyWriter</resource>
								</transformer>
								<transformer
									implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
									<resource>META-INF/services/javax.ws.rs.ext.MessageBodyReader</resource>
								</transformer>
								<transformer
									implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
									<resource>META-INF/services/com.sun.jersey.spi.inject.InjectableProvider</resource>
								</transformer>
								<transformer
									implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
									<resource>META-INF/services/com.sun.jersey.spi.HeaderDelegateProvider</resource>
								</transformer>
								<transformer
									implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
									<resource>META-INF/services/com.sun.jersey.server.impl.model.method.dispatch.ResourceMethodDispatchProvider</resource>
								</transformer>
								<transformer
									implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
									<resource>META-INF/services/com.sun.jersey.spi.container.ContainerProvider</resource>
								</transformer>
								<transformer
									implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
									<resource>META-INF/services/com.sun.jersey.spi.container.ContainerRequestFilter</resource>
								</transformer>
								<transformer
									implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
									<resource>META-INF/services/com.sun.jersey.spi.container.WebApplicationProvider</resource>
								</transformer>
								<transformer
									implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
									<resource>META-INF/services/com.sun.jersey.spi.StringReaderProvider</resource>
								</transformer>
								<transformer
									implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
									<resource>META-INF/services/javax.enterprise.inject.spi.Extension</resource>
								</transformer>
								<transformer
									implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
									<resource>META-INF/services/javax.servlet.ServletContainerInitializer</resource>
								</transformer>
								<transformer
									implementation="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>
分享到:
评论

相关推荐

    解决idea导入项目出错,打包没有依赖问题.docx

    本文将详细介绍如何解决IDEA导入项目出错的问题,包括依赖丢失、项目打包不包含依赖等问题,并提供具体的步骤与建议。 #### 一、问题背景 在开发过程中,我们经常需要在不同机器之间分享项目,有时会发现项目在...

    maven-repository 包

    【maven-repository 包】是一个集合了众多Java开发所需的Maven依赖的资源库,它极大地简化了开发者在构建项目时寻找和管理依赖的过程。在Java开发中,Maven是一个广泛应用的项目管理和集成工具,它负责管理项目的...

    构建工具:maven简介

    Maven是一个广泛使用的Java项目管理和构建自动化工具,它基于项目对象模型(POM)的概念,能够管理项目的生命周期,包括编译、测试、打包、发布等。Maven使得开发者可以更加专注于代码的编写,而不是繁琐的构建过程...

    maven-3.5.0

    Maven的核心理念是通过使用一个标准的项目对象模型(Project Object Model,POM)来描述项目,并提供一套自动化构建规则。POM包含了项目的基本信息、依赖关系、构建过程和插件配置等,使得开发者能够轻松管理项目的...

    Android引用包含远程依赖库的aar(引用aar时找不到arr的远程依赖库问题)

    实在抱歉,资源分不能设置为0,浪费你1个积分。 Android引用包含远程依赖库的aar(引用aar时找不到arr的远程依赖...针对这种问题可以采用maven仓库来解决,我们可以将aar生成到本地或远程maven仓库,再引用仓库中的aar.

    SVN管理软件+Maven小项目.rar_SVN管理软件+Maven小项目_svn

    1. **Maven简介**:Maven是一个基于Java的项目管理工具,它通过使用一套标准的目录结构和项目对象模型(POM),简化了构建过程,包括编译、测试、打包、部署等。 2. **POM(Project Object Model)**:POM是Maven的...

    阿里云Maven仓库镜像.docx

    * 提高项目的可靠性:阿里云Maven仓库镜像提供了高可用的镜像,减少了依赖项的丢失和下载失败的风险,提高了项目的可靠性。 阿里云Maven仓库镜像的使用: * 在pom.xml文件中添加阿里云Maven仓库镜像的配置,例如:...

    03_重新设置maven的本地库位置

    重新设置Maven本地库的位置是为了将存储所有依赖项的本地仓库迁移到C盘以外的其他磁盘驱动器上,以避免因操作系统或程序错误导致的依赖丢失和系统问题。默认情况下,Maven将其本地仓库的位置设置在用户的家目录下的....

    SpringMVC+maven+redis

    它通过POM(Project Object Model)文件来管理项目的依赖关系,自动化构建过程,如编译、测试、打包、部署等。Maven的中央仓库包含了大量开源库,方便开发者快速引入所需依赖。此外,Maven还提供了插件机制,可以...

    Linux下利用nexus搭建maven私服

    例如,`mvn deploy`命令会自动将项目打包并上传到指定的Nexus仓库。 6. **维护与安全** - 对于生产环境,应该为Nexus设置SSL,以提供安全的HTTPS访问。 - 定期备份Nexus的数据目录,以防数据丢失。 - 根据需要,...

    基于maven install 没反应的解决方法

    它可以用来管理项目所需的各种依赖关系,并且可以执行项目的构建、测试和打包等生命周期管理工作。不过,在使用Maven时,开发者可能会遇到“maven install”命令没有反应的情况,这可能会阻碍开发的进行。针对这种...

    maven备份1111111

    【标题】"maven备份1111111"涉及的是Maven项目构建工具的备份操作,这在软件开发过程中至关重要,特别是对于大型项目,它确保了项目的可重复构建和依赖管理。Maven是Apache软件基金会的一个开源项目,主要用于Java...

    svn+maven插件(直接解压到{eclipse}\dropins即可)

    同样,将压缩包中的“maven”文件解压到Eclipse的“dropins”目录后,开发者可以在Eclipse内无缝使用Maven功能。 这两个插件的结合,使得Eclipse成为一个功能强大的开发环境,可以方便地进行版本控制和自动化构建。...

    maven私服nexus-2.11.4-01.rar

    在Maven项目中,可以通过配置pom.xml和settings.xml,将项目打包并上传到Maven私服。 2. **更新与维护** 定期检查Nexus的更新,保持版本的时效性,确保安全性和稳定性。 3. **备份与恢复** 为防止数据丢失,...

    fat jar打包插件

    Fat jar打包的主要目标是解决Java的类路径问题,尤其是在使用Maven或Gradle等构建工具时,依赖管理变得复杂。通过将所有依赖库嵌入到一个单一的JAR文件中,可以避免运行时因找不到类或资源而引发的错误。 实现fat ...

    maven Nexus私服

    Maven Nexus是一款强大的仓库管理工具,尤其在企业内部广泛用于构建私有Maven仓库,以便集中管理依赖、发布自定义构件并提高开发效率。Nexus 2.14是该工具的一个较旧版本,但仍然被许多组织使用。下面将详细介绍...

    MyEclipse10.5&10;.6_解决导出war问题

    5. **使用第三方工具**:如果MyEclipse的导出功能仍然存在问题,可以考虑使用其他工具,如Apache Maven或Gradle,它们提供了更强大的打包和依赖管理功能。 压缩包中的文件很可能是作者分享的特定版本问题的解决文件...

    repository.7z

    为了使用这个"repository.7z",你需要先用7-Zip或者类似工具解压文件,然后配置Maven的settings.xml文件,将解压后的路径添加到本地仓库的镜像配置中。这样,Maven在构建时会优先查找这个本地的"repository",找不到...

    json-lib-2.4-jdk15.jar全部JAR打包直接用

    然而,对于那些不使用这些工具或者没有自动管理依赖的项目,直接使用`json-lib-2.4-jdk15.jar`的全部JAR打包方式可以避免配置繁琐的依赖关系,简化了开发流程。 `json-lib`库提供了多种Java对象与JSON之间的转换...

    springboot+maven等做成的失物招领平台

    在本项目中,Maven负责管理项目的依赖关系,通过其强大的POM(Project Object Model)文件,可以轻松地引入并管理各种第三方库,如SpringBoot的启动器、数据库驱动等。同时,Maven还提供了构建生命周期和插件机制,...

Global site tag (gtag.js) - Google Analytics