如何替换Maven依赖项的类?

ugmeyewa  于 2023-10-17  发布在  Maven
关注(0)|答案(3)|浏览(125)

在maven依赖项中有一个类与Java 8不兼容。
如何正确解决这个问题?
现在我正在做以下事情:
1.创建具有相同名称的包
1.在该包中创建一个同名的类
1.复制并粘贴代码
1.修复不兼容的API调用
问题是这个类包含对受限类的API调用,尽管我更改了Eclipse编译器设置(窗口->首选项-> Java ->编译器->错误/错误->弃用和受限API ->禁止引用(访问规则)):Error -> Warning)来允许访问,该项目有时只会编译。如果它不能编译,我会得到一个“找不到符号”的错误。
编辑:
以下是您要求的详细信息:

// 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
pbpqsu0x

pbpqsu0x1#

下面是一个详细的指南,描述了我到底做了什么:
1.在Eclipse中创建新的Maven项目
1.配置新项目的Maven设置(重要提示:使用相同的组和工件ID,仅更改版本号)

<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.sun.xml.wss</groupId>
    <artifactId>xws-security</artifactId>
    <version>3.0-java8-fix</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
    </properties>
</project>

1.添加已安装窃听器的路由器的依赖关系

<dependencies>
    <dependency>
        <groupId>com.sun.xml.wss</groupId>
        <artifactId>xws-security</artifactId>
        <version>3.0</version>
        <exclusions>
            <exclusion>
              <artifactId>xmldsig</artifactId>
              <groupId>javax.xml.crypto</groupId>
            </exclusion>
            <exclusion>
              <artifactId>activation</artifactId>
              <groupId>javax.activation</groupId>
            </exclusion>
        </exclusions>
    </dependency>
 </dependencies>

1.在需要修复的类的同一包中创建Java文件

package com.sun.xml.wss.impl.apachecrypto;

public class EncryptionProcessor {
    // The FIX goes here
}

1.添加Maven shade构建插件来处理补丁文件的创建(这不是唯一一个处理此类任务的插件-例如。dependency:unpack)

<build>
    <plugins>
        <!-- plug in for creation of patched JAR file -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.1</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <filters>
                            <filter>
                                <artifact>com.sun.xml.wss:xws-security:3.0</artifact>
                                <includes>
                                    <include>**/*.class</include>
                                    <include>**/*.xml</include>
                                </includes>
                                <excludes>
                                    <exlude>
                            com/sun/xml/wss/impl/apachecrypto/EncryptionProcessor.class
                                    </exlude>
                                </excludes>
                            </filter>
                        </filters>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

1.根据需要在其他项目中包括已修补的服务器(注意:如果您遇到ClassNotFoundError或类似错误,请执行以下操作:右键单击项目-> Properties -> Maven ->“Resolve dependencies from Workspace projects”:false)
如果你不熟悉Maven。下面是完整的pom.xml:http://pastebucket.com/88444

k5hmc34c

k5hmc34c2#

类似于Steve S.的答案,但使用maven-dependency-plugin。基于this blog post
我更改了补丁库的名称(而不是版本),但这取决于您的需求,什么更适合您。
对原始库的依赖项应该标记为<optional>true</optional>。否则,依赖于您的补丁库的项目也将依赖于原始库,这意味着补丁和原始版本都将位于类路径上,这可能导致各种问题。
如果您的项目是子项目,您仍然可以使用与父项目完全不同的groupId和版本。不重要
您可以从解包中排除您修补的类,但这可能不是必要的,因为Maven将首先解包原始库,然后编译新版本,这意味着原始类将被覆盖。好极了!

<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0">
  <modelVersion>4.0.0</modelVersion>

  <!-- remove this if you don't have a parent pom -->
  <parent>
    <groupId>my.company</groupId>
    <artifactId>my.company</artifactId>
    <version>1.2.3</version>
    <relativePath>../pom.xml</relativePath>
  </parent>

  <groupId>com.foo</groupId>
  <artifactId>foo-bar-patched</artifactId>
  <version>4.5.6</version>

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-dependency-plugin</artifactId>
        <executions>
          <execution>
            <goals>
              <goal>unpack</goal>
            </goals>
            <configuration>
              <artifactItems>
                <artifactItem>
                  <groupId>com.foo</groupId>
                  <artifactId>foo-bar</artifactId>
                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
                  <!-- excludes are probably not necessary -->
                  <!-- <excludes>**/Foo.class,**/Bar.class</excludes> -->
                </artifactItem>
              </artifactItems>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

  <dependencies>
    <dependency>
      <groupId>com.foo</groupId>
      <artifactId>foo-bar</artifactId>
      <version>4.5.6</version>
      <optional>true</optional>
    </dependency>
  </dependencies>

</project>
yduiuuwa

yduiuuwa3#

一般溶液:

  • 下载所有项目源代码
  • 应用您的修改
    • 使用版本控制,以便不会丢失更改
  • pom.xml中更改版本,例如从3.0更改为3.0-patched
  • Launch Maven Building
  • 将生成的工件复制到您的存储库/工件工厂(如果您使用的话)
  • 在自己的项目中更改依赖项版本

相关问题