你如何取代Maven依赖的类?

maven依赖中有一个类与Java 8不兼容。

你如何正确解决这个问题?

现在我正在做以下事情:

  1. 创建一个具有相同名称的包
  2. 在该包中创建一个具有相同名称的类
  3. 复制并粘贴代码
  4. 修复不兼容的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.03.0-patched
  • 发射maven build
  • 将生成的工件复制到存储库/ Artifactory,如果您使用它
  • 在您自己的项目中更改依赖项版本

这是一个详细的指南,描述了我的确切做法:

  1. 在Eclipse中创建新的Maven项目
  2. 配置新项目的Maven设置(重要:使用相同的组和工件ID,仅更改版本号)

      4.0.0 com.sun.xml.wss xws-security 3.0-java8-fix  UTF-8 1.8   
  3. 添加有bug的JAR的依赖项

       com.sun.xml.wss xws-security 3.0   xmldsig javax.xml.crypto   activation javax.activation     
  4. 在需要修复的同一类包中创建Java文件

     package com.sun.xml.wss.impl.apachecrypto; public class EncryptionProcessor { // The FIX goes here } 
  5. 添加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           
  6. 根据需要在其他项目中包含修补的JAR(注意:如果遇到ClassNotFoundExceptions或类似错误,请执行以下操作:右键单击项目 – >属性 – > Maven – >“从Workspace项目中解析依赖项”:false)

如果您不熟悉Maven。 这是完整的pom.xml: http : //pastebucket.com/88444

类似于Steven S.的回答,但使用了maven-dependency-plugin 。 基于这篇博文 。

我更改了修补库(不是版本)的名称,但这取决于您的需求哪些更适合您。

对原始库的依赖应标记为true 。 否则,依赖于修补库的项目也将依赖于原始库,这意味着修补版本和原始版本都将位于类路径上,这可能会导致各种问题。

如果您的项目是子项目,您仍然可以使用与父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