问题
项目用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导入项目出错的问题,包括依赖丢失、项目打包不包含依赖等问题,并提供具体的步骤与建议。 #### 一、问题背景 在开发过程中,我们经常需要在不同机器之间分享项目,有时会发现项目在...
在Java开发中,Maven是广泛使用的构建工具,它帮助管理项目的依赖关系,自动化构建流程。然而,有时候在运行Maven项目时,可能会遇到找不到特定jar包的问题,比如本例中的`tools-1.8.0.jar`。这个问题通常表明Maven...
【maven-repository 包】是一个集合了众多Java开发所需的Maven依赖的资源库,它极大地简化了开发者在构建项目时寻找和管理依赖的过程。在Java开发中,Maven是一个广泛应用的项目管理和集成工具,它负责管理项目的...
Maven是一个广泛使用的Java项目管理和构建自动化工具,它基于项目对象模型(POM)的概念,能够管理项目的生命周期,包括编译、测试、打包、发布等。Maven使得开发者可以更加专注于代码的编写,而不是繁琐的构建过程...
Maven的核心理念是通过使用一个标准的项目对象模型(Project Object Model,POM)来描述项目,并提供一套自动化构建规则。POM包含了项目的基本信息、依赖关系、构建过程和插件配置等,使得开发者能够轻松管理项目的...
1. **Maven简介**:Maven是一个基于Java的项目管理工具,它通过使用一套标准的目录结构和项目对象模型(POM),简化了构建过程,包括编译、测试、打包、部署等。 2. **POM(Project Object Model)**:POM是Maven的...
实在抱歉,资源分不能设置为0,浪费你1个积分。 Android引用包含远程依赖库的aar(引用aar时找不到arr的远程依赖...针对这种问题可以采用maven仓库来解决,我们可以将aar生成到本地或远程maven仓库,再引用仓库中的aar.
* 提高项目的可靠性:阿里云Maven仓库镜像提供了高可用的镜像,减少了依赖项的丢失和下载失败的风险,提高了项目的可靠性。 阿里云Maven仓库镜像的使用: * 在pom.xml文件中添加阿里云Maven仓库镜像的配置,例如:...
重新设置Maven本地库的位置是为了将存储所有依赖项的本地仓库迁移到C盘以外的其他磁盘驱动器上,以避免因操作系统或程序错误导致的依赖丢失和系统问题。默认情况下,Maven将其本地仓库的位置设置在用户的家目录下的....
它通过POM(Project Object Model)文件来管理项目的依赖关系,自动化构建过程,如编译、测试、打包、部署等。Maven的中央仓库包含了大量开源库,方便开发者快速引入所需依赖。此外,Maven还提供了插件机制,可以...
例如,`mvn deploy`命令会自动将项目打包并上传到指定的Nexus仓库。 6. **维护与安全** - 对于生产环境,应该为Nexus设置SSL,以提供安全的HTTPS访问。 - 定期备份Nexus的数据目录,以防数据丢失。 - 根据需要,...
它可以用来管理项目所需的各种依赖关系,并且可以执行项目的构建、测试和打包等生命周期管理工作。不过,在使用Maven时,开发者可能会遇到“maven install”命令没有反应的情况,这可能会阻碍开发的进行。针对这种...
【标题】"maven备份1111111"涉及的是Maven项目构建工具的备份操作,这在软件开发过程中至关重要,特别是对于大型项目,它确保了项目的可重复构建和依赖管理。Maven是Apache软件基金会的一个开源项目,主要用于Java...
同样,将压缩包中的“maven”文件解压到Eclipse的“dropins”目录后,开发者可以在Eclipse内无缝使用Maven功能。 这两个插件的结合,使得Eclipse成为一个功能强大的开发环境,可以方便地进行版本控制和自动化构建。...
在Maven项目中,可以通过配置pom.xml和settings.xml,将项目打包并上传到Maven私服。 2. **更新与维护** 定期检查Nexus的更新,保持版本的时效性,确保安全性和稳定性。 3. **备份与恢复** 为防止数据丢失,...
Fat jar打包的主要目标是解决Java的类路径问题,尤其是在使用Maven或Gradle等构建工具时,依赖管理变得复杂。通过将所有依赖库嵌入到一个单一的JAR文件中,可以避免运行时因找不到类或资源而引发的错误。 实现fat ...
Maven Nexus是一款强大的仓库管理工具,尤其在企业内部广泛用于构建私有Maven仓库,以便集中管理依赖、发布自定义构件并提高开发效率。Nexus 2.14是该工具的一个较旧版本,但仍然被许多组织使用。下面将详细介绍...
5. **使用第三方工具**:如果MyEclipse的导出功能仍然存在问题,可以考虑使用其他工具,如Apache Maven或Gradle,它们提供了更强大的打包和依赖管理功能。 压缩包中的文件很可能是作者分享的特定版本问题的解决文件...
为了使用这个"repository.7z",你需要先用7-Zip或者类似工具解压文件,然后配置Maven的settings.xml文件,将解压后的路径添加到本地仓库的镜像配置中。这样,Maven在构建时会优先查找这个本地的"repository",找不到...
然而,对于那些不使用这些工具或者没有自动管理依赖的项目,直接使用`json-lib-2.4-jdk15.jar`的全部JAR打包方式可以避免配置繁琐的依赖关系,简化了开发流程。 `json-lib`库提供了多种Java对象与JSON之间的转换...