你如何取代Maven依赖的类?

时间:2015-07-31 07:52:48

标签: java eclipse maven dependencies

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

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

现在我正在做以下事情:

  1. 创建一个名称相同的包
  2. 在该程序包中创建一个具有相同名称的类
  3. 复制并粘贴代码
  4. 修复不兼容的API调用
  5. 问题是这个类包含对受限类的API调用,虽然我更改了Eclipse编译器设置(Window - > Preferences - > Java - > Compiler - > Error / Warnings - >不推荐使用和限制API - >禁止引用(访问规则):错误 - >警告)允许访问项目有时只会编译。如果它没有编译我会得到一个"找不到符号"错误。

    编辑:

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

    编辑-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
    

3 个答案:

答案 0 :(得分:4)

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

  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构建插件来处理修补的JAR文件的创建(这不是处理此类任务的唯一插件 - 例如依赖:解包)

    <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或类似错误,请执行以下操作:右键单击项目 - &gt;属性 - &gt; Maven - &gt;&#34;解析依赖项来自Workspace项目&#34;:false)

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

答案 1 :(得分:2)

一般解决方案:

  • 下载所有项目资源
  • 应用您的修改
    • 使用版本控制以便不会丢失更改
  • 更改pom.xml中的版本,例如从3.0更改为3.0-patched
  • 启动maven build
  • 将生成的工件复制到存储库/ Artifactory,如果您使用一个
  • 更改您自己项目中的依赖项版本

答案 2 :(得分:2)

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

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

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

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