你如何取代Maven依赖的类?
maven依赖中有一个类与Java 8不兼容。
你如何正确解决这个问题?
现在我正在做以下事情:
- 创建一个具有相同名称的包
- 在该包中创建一个具有相同名称的类
- 复制并粘贴代码
- 修复不兼容的API调用
问题是这个类包含对受限类的API调用,虽然我更改了Eclipse编译器设置(Window – > Preferences – > Java – > Compiler – > Error / Warnings – > Deprecated and restricted API – > Forbidden reference(access rule) :错误 – >警告)允许访问项目有时只会编译。 如果它没有编译我会得到一个“找不到符号”的错误。
编辑:
以下是您要求的详细信息:
-
依赖性: http : //mvnrepository.com/artifact/com.sun.xml.wss/xws-security/3.0
-
类:EncryptionProcessor
-
必要的变化:
// Change line 1053 FROM: // _dataEncryptor = XMLCipher.getInstance(dataEncAlgo, _dataCipher); // TO: _dataEncryptor = XMLCipher.getInstance(dataEncAlgo);
编辑-2:
Maven构建错误:
[ERROR] symbol: class XMLCipher [ERROR] location: class com.sun.xml.wss.impl.apachecrypto.EncryptionProcessor [ERROR] /C:/Users/{name}/development/eclipse_workspace/git/xws-security/src/main/java/com/sun/xml/wss/impl/apachecrypto/EncryptionProcessor.java:[1482,98] cannot find symbol
一般解决方案
- 下载所有项目源
- 申请你的修改
-
- 使用版本控制,以便不会丢失更改
- 更改
pom.xml
版本,例如从3.0
到3.0-patched
- 发射maven build
- 将生成的工件复制到存储库/ Artifactory,如果您使用它
- 在您自己的项目中更改依赖项版本
这是一个详细的指南,描述了我的确切做法:
- 在Eclipse中创建新的Maven项目
-
配置新项目的Maven设置(重要:使用相同的组和工件ID,仅更改版本号)
4.0.0 com.sun.xml.wss xws-security 3.0-java8-fix UTF-8 1.8 -
添加有bug的JAR的依赖项
com.sun.xml.wss xws-security 3.0 xmldsig javax.xml.crypto activation javax.activation -
在需要修复的同一类包中创建Java文件
package com.sun.xml.wss.impl.apachecrypto; public class EncryptionProcessor { // The FIX goes here }
-
添加Maven shade构建插件来处理修补的JAR文件的创建(这不是处理这种任务的唯一插件 – 例如依赖:unpack)
org.apache.maven.plugins maven-shade-plugin 2.1 package shade com.sun.xml.wss:xws-security:3.0 **/*.class **/*.xml com/sun/xml/wss/impl/apachecrypto/EncryptionProcessor.class -
根据需要在其他项目中包含修补的JAR(注意:如果遇到ClassNotFoundExceptions或类似错误,请执行以下操作:右键单击项目 – >属性 – > Maven – >“从Workspace项目中解析依赖项”:false)
如果您不熟悉Maven。 这是完整的pom.xml: http : //pastebucket.com/88444
类似于Steven S.的回答,但使用了maven-dependency-plugin 。 基于这篇博文 。
我更改了修补库(不是版本)的名称,但这取决于您的需求哪些更适合您。
对原始库的依赖应标记为
。 否则,依赖于修补库的项目也将依赖于原始库,这意味着修补版本和原始版本都将位于类路径上,这可能会导致各种问题。
如果您的项目是子项目,您仍然可以使用与父pom完全不同的groupId和版本。 无所谓。
你可以从解包中排除你修补的类,但它可能没有必要,因为Maven将首先解压缩原始库然后编译你的新版本,这意味着原始类被覆盖。 太好了!
4.0.0 my.company my.company 1.2.3 ../pom.xml com.foo foo-bar-patched 4.5.6 maven-dependency-plugin unpack com.foo foo-bar ${project.build.directory}/classes com.foo foo-bar 4.5.6 true