【问题标题】:How do you replace the class of a Maven dependency?如何替换 Maven 依赖项的类?
【发布时间】:2015-10-22 19:44:55
【问题描述】:

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

您如何正确解决该问题?

现在我正在做以下事情:

  1. 创建同名包
  2. 在该包中创建一个同名的类
  3. 复制粘贴代码
  4. 修复不兼容的 API 调用

问题是这个类包含对受限类的 API 调用,尽管我更改了 Eclipse 编译器设置(Window -> Preferences -> Java -> Compiler -> Error/Warnings -> Deprecated and restricted API -> Forbidden reference (访问规则):错误->警告)允许访问该项目有时只会编译。如果它没有编译,我会得到一个“找不到符号”的错误。

编辑:

以下是您要求的详细信息:

Edit-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

【问题讨论】:

  • 包含不兼容的依赖项是你自己的还是你公司的项目?请给我们一些代码和错误信息
  • 类是通过类路径后面的类加载器加载的。在 web 应用程序中,您可以将补丁类放在 WEB-INF/classes 中——这些是最重要的。如果不在 webapp 中,请使用该类创建一个 jar 并将其首先传递给 java 进程: java -cp my-patch.jar:original.jar - 修补东西有点臭,因为它难以维护和部署应用程序,例如这。人们经常忘记补丁和它的用途等等。如果该类的源可用,我宁愿根据它们创建一个修补过的工件。

标签: java eclipse maven dependencies


【解决方案1】:

一般解决方案:

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

【讨论】:

  • 很遗憾,我无法下载该项目的完整源代码。但我做了类似的事情。我创建了一个新的 maven 项目“xws-security-java8-patch”,包含 xws-security-3.0 作为依赖项,只添加了损坏的类并修复了错误。现在我包含 xws-security-java8-patch 而不是 xws-security-3.0,它就像一个魅力。
  • 我在单独的答案中添加了对我执行的步骤的详细说明。
【解决方案2】:

这是一个详细的指南,描述了我所做的事情:

  1. 在 Eclipse 中创建新的 Maven 项目
  2. 配置新项目的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>
    
  3. 添加错误 JAR 的依赖项

    <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>  
    
  4. 在需要修复的类的同一个包中创建Java文件

    package com.sun.xml.wss.impl.apachecrypto;
    
    public class EncryptionProcessor {
        // The FIX goes here
    }
    
  5. 添加 Maven shade build 插件以处理修补 JAR 文件的创建(这不是处理此类任务的唯一插件 - 例如依赖项: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>
    
  6. 根据需要在其他项目中包含已修补的 JAR(注意:如果遇到 ClassNotFoundExceptions 或类似错误,请执行以下操作:右键单击项目 -> 属性 -> Maven ->“解决来自工作区项目的依赖项”:false )

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

【讨论】:

    【解决方案3】:

    类似于 Steven S. 的回答,但使用 maven-dependency-plugin。基于this blog post

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

    对原始库的依赖应标记为&lt;optional&gt;true&lt;/optional&gt;。否则,依赖于你打补丁的库的项目也将依赖原库,这意味着打补丁的版本和原始版本都会在类路径中,这可能会导致各种问题。

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

    【讨论】:

      猜你喜欢
      • 2014-05-11
      • 2011-01-15
      • 2019-01-30
      • 2012-03-02
      • 1970-01-01
      • 2012-10-03
      • 2016-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多