Java/Maven项目中如何让指定依赖使用其所需的旧版jackson-databind
依赖版本冲突解决方案
以下是几种可行的处理方式,其中包隔离方案可以实现你需要的「全局保留高版本jackson、单个依赖单独使用旧版本jackson」的需求:
方案1:Maven Shade包隔离(最优推荐)
通过重命名依赖包的方式完全隔离两个版本的jackson,互不干扰,实现步骤如下:
- 第一步:在主项目的
pom.xml中引入jrs-rest-java-client时,排除其自带的所有jackson传递依赖
<dependency> <groupId>com.jaspersoft</groupId> <artifactId>jrs-rest-java-client</artifactId> <version>你使用的客户端版本号</version> <exclusions> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency>
- 第二步:新建一个独立的Maven子模块,仅用于封装
jrs-rest-java-client,在该子模块的pom.xml中单独引入你需要的旧版本jackson-databind,同时配置maven-shade-plugin插件对旧版jackson做包重定向:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.5.0</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <relocations> <!-- 把旧版jackson的包路径重命名,避免和全局版本冲突 --> <relocation> <pattern>com.fasterxml.jackson</pattern> <shadedPattern>legacy.com.fasterxml.jackson</shadedPattern> </relocation> </relocations> </configuration> </execution> </executions> </plugin> </plugins> </build>
- 第三步:子模块打包后,主项目直接依赖该shade打包后的子模块即可。
jrs-rest-java-client会自动调用重命名后的旧版jackson类,和全局的2.9.0版本完全隔离,不会出现方法冲突。
方案2:适配客户端源码
如果不想做包隔离,可自行修改jrs-rest-java-client源码中调用旧版jackson独有方法的逻辑,替换为jackson 2.9.0支持的等效实现,自行编译后上传到私有Maven仓库引入使用。
方案3:类加载器隔离
也可以通过OSGi框架、自定义类加载器等方式实现不同依赖的类加载隔离,不过该方案复杂度较高,非必要不建议使用。
以上方案中shade包隔离的实现成本最低,对现有项目侵入性最小,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Genku
相关产品推荐
相关产品推荐

