3

我正在尝试将包从“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 不断添加对原始杰克逊(“mypackage.com.fasterxml.jackson”)的依赖,而不是新的。

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

当我尝试在 Jar X 中使用 Jackson 的 ObjectMapper 时,Eclipse 一直引用原始的 jackson。

我会感谢你的帮助!

4

1 回答 1

3

最后,我使用了 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”文件。文件的内容应该是(注意'@'字符之前的句点):rule com.fasterxml.jackson.** io.kuku.dependencies.com.fasterxml.jackson.@1

  2. 运行以下命令: java -jar jarjar-1.4.jar process 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>
<!-- ================================================== -->
<!-- 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>

于 2016-01-13T13:45:53.620 回答