将 fastxml.jackson 类 重定位到 my.package.fastxml.jackson

Relocating fastxml.jackson classes to my.package.fastxml.jackson

我正在尝试将 "com.fasterxml.jackson" 中的包重新定位到我自己的包中(即 "mypackage.com.fasterxml.jackson"),然后在我拥有的另一个 JAR 中使用它。

我已经设法 运行 使用此配置的 maven-shade 插件来完成它:

<plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <shadedArtifactAttached>false</shadedArtifactAttached>
                        <createDependencyReducedPom>true</createDependencyReducedPom>
                        <relocations>
                            <relocation>
                                <pattern>com.fasterxml.jackson</pattern>
                                <shadedPattern>mypackage.com.fasterxml.jackson</shadedPattern>
                            </relocation>
                        </relocations>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>

我面临的问题是当我尝试使用它时,出于某种原因,Eclipse 不断向原始 jackson ("mypackage.com.fasterxml.jackson") 添加依赖项,而不是新的。

为了清楚起见,我的设置是: - Jar X 依赖于 ThirdPartyArtifcats。 - ThirdPartyArtifcats 引用 Jackson 和 运行 maven-shade 插件,因此它包含 Jackson (mypackage.com.fasterxml.jackson) 的修改版本。

当我尝试在 Jar X 中使用 Jackson 的 ObjectMapper 时,Eclipse 不断提供对原始 jackson 的引用。

非常感谢你的帮助!

最后我使用了 JarJar 并创建了一个修改后的 JAR。然后我在我的代码中添加了一个依赖项并手动更新它,所以它现在与修改后的包相关而不是原始包。

下面是描述我所做工作的程序:


如何使用 JarJar 将 类 个 JAR 从一个包转移到另一个包

在此示例中,我们将把包从 "com.fasterxml.jackson" 更改为 "io.kuku.dependencies.com.fasterxml.jackson"。 - 源 JAR 称为 "jackson-databind-2.6.4.jar",新修改的(目标)JAR 称为 "kuku-jackson-databind-2.6.4.jar"。 - "jarjar" JAR 文件的版本是 1.4

  1. 创建一个 "rules.txt" 文件。该文件的内容应该是(注意“@”字符之前的句点): 规则 com.fasterxml.jackson.** io.kuku.dependencies.com.fasterxml.jackson.@1

  2. 运行命令如下: java -jar jarjar-1.4.jar 进程 rules.txt jackson-databind-2.6.4.jar kuku-jackson-databind-2.6.4.jar


正在将修改后的 JAR 安装到本地存储库

在这种情况下,我将安装位于 "c:\my-jars\" 文件夹中的 3 个文件。

mvn install:install-file -Dfile=C:\my-jars\kuku-jackson-annotations-2.6.4.jar -DgroupId=io.kuku.dependencies -DartifactId=kuku-jackson-annotations -Dversion= 2.6.4 -Dpackaging=jar

mvn install:install-file -Dfile=C:\my-jars\kuku-jackson-core-2.6.4.jar -DgroupId=io.kuku.dependencies -DartifactId=kuku-jackson-core -Dversion= 2.6.4 -Dpackaging=jar

mvn install:install-file -Dfile=C:\my-jars\kuku-jackson-databind-2.6.4.jar -DgroupId=io.kuku.dependencies -DartifactId=kuku-jackson-annotations -Dversion= 2.6.4 -Dpackaging=jar


在项目的 pom 中使用修改后的 JAR

在此示例中,这是项目 pom 中的 "dependencies" 元素:

<dependencies>
<!-- ================================================== -->
<!-- kuku JARs -->
<!-- ================================================== -->
<dependency>
    <groupId>io.kuku.dependencies</groupId>
    <artifactId>kuku-jackson-annotations</artifactId>
    <version>2.6.4</version>
</dependency>
<dependency>
    <groupId>io.kuku.dependencies</groupId>
    <artifactId>kuku-jackson-core</artifactId>
    <version>2.6.4</version>
</dependency>
<dependency>
    <groupId>io.kuku.dependencies</groupId>
    <artifactId>kuku-jackson-databind</artifactId>
    <version>2.6.4</version>
</dependency>