gpt4 book ai didi

java - 不使用重量级框架如何解决Jar hell?

转载 作者:行者123 更新时间:2023-12-01 09:53:25 33 4
gpt4 key购买 nike

如何避免或解决Jar hell ?不使用重量级框架,例如众所周知的OSGi框架。
假设我们有两个必需的依赖项,它们不再受支持,可以在同一库的不同版本中稳定工作?我需要所有员工一起工作。

最佳答案

我使用了 sonatype jarjar maven 插件来自动创建重命名为不同包的依赖类的副本。

这为您的库提供了其依赖项的私有(private)副本,从而防止与它可能部署的任何其他库发生版本冲突。

请记住,某些软件可能具有阻止您对其进行更改的副本的许可条件。

例如,以下一对规则创建 Apache commons-lang3 的私有(private)副本。 Apache commons-lang 通常部署在名为 org.apache.commons.lang3 的包中,但在这里我在包 com.lexicalscope.fluentreflection.internal.lang3 中创建了它的副本。该插件会自动修复我的库使用 Apache commons-lang3 链接到副本的所有位置。

<rule>
<pattern>org.apache.commons.lang3.**.*</pattern>
<result>com.lexicalscope.fluentreflection.internal.lang3.@1.$@2</result>
</rule>
<rule>
<pattern>org.apache.commons.lang3.*</pattern>
<result>com.lexicalscope.fluentreflection.internal.lang3.$@1</result>
</rule>

您可以使用相同的方法将第三方库及其依赖项的私有(private)副本重新打包。

这是完整的 Maven 构建配置示例:

<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>jarjar-maven-plugin</artifactId>
<version>1.5</version>
<executions>
<execution>
<id>jarjar-classes</id>
<phase>process-test-classes</phase>
<goals>
<goal>jarjar</goal>
</goals>
<configuration>
<overwrite>true</overwrite>
<input>{classes}</input>
</configuration>
</execution>
<execution>
<id>jarjar-testclasses</id>
<phase>process-test-classes</phase>
<goals>
<goal>jarjar</goal>
</goals>
<configuration>
<overwrite>true</overwrite>
<input>{test-classes}</input>
</configuration>
</execution>
</executions>
<configuration>
<overwrite>true</overwrite>
<includes>
<include>com.google.inject:guice</include>
<include>com.googlecode.lambdaj:lambdaj</include>
<include>org.apache.commons:commons-lang3</include>
<include>com.google.guava:guava</include>
</includes>
<rules>
<rule>
<pattern>com.google.common.**.*</pattern>
<result>com.lexicalscope.fluentreflection.internal.guava.@1.$@2</result>
</rule>
<rule>
<pattern>com.google.common.*</pattern>
<result>com.lexicalscope.fluentreflection.internal.guava.$@1</result>
</rule>
<rule>
<pattern>com.google.inject.**.*</pattern>
<result>com.lexicalscope.fluentreflection.internal.guice.@1.$@2</result>
</rule>
<rule>
<pattern>com.google.inject.*</pattern>
<result>com.lexicalscope.fluentreflection.internal.guice.$@1</result>
</rule>
<rule>
<pattern>ch.lambdaj.**.*</pattern>
<result>com.lexicalscope.fluentreflection.internal.lamdaj.@1.$@2</result>
</rule>
<rule>
<pattern>ch.lambdaj.*</pattern>
<result>com.lexicalscope.fluentreflection.internal.lamdaj.$@1</result>
</rule>
<rule>
<pattern>org.apache.commons.lang3.**.*</pattern>
<result>com.lexicalscope.fluentreflection.internal.lang3.@1.$@2</result>
</rule>
<rule>
<pattern>org.apache.commons.lang3.*</pattern>
<result>com.lexicalscope.fluentreflection.internal.lang3.$@1</result>
</rule>
</rules>
</configuration>
</plugin>

关于java - 不使用重量级框架如何解决Jar hell?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37438559/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com