Maven 依赖冲突
Maven dependency conflicts
我在使用以下依赖项时尝试解决依赖项版本冲突。
我遇到的最糟糕的是 zucchini
项目支持从 1.4 到最新版本的 apache commons-io
版本。它不支持版本
低于 1.4
同时pagerduty-client
支持commons-io
个1.4以下的版本。
所以不可能指定这个依赖的通用版本(依赖管理)
它支持 zucchini 和 pager-duty 客户端(都是第三方库)。
在这种特殊情况下,我找不到解决此问题的可能方法。任何帮助将不胜感激。
<dependency>
<groupId>com.comcast.zucchini</groupId>
<artifactId>zucchini</artifactId>
<version>[2.2.5,)</version>
</dependency>
<dependency>
<groupId>com.github.dikhan</groupId>
<artifactId>pagerduty-client</artifactId>
<version>3.0.2</version>
</dependency>
由于您的 commons-io 是问题所在,您必须进一步查看。这意味着要么将 pagerduty-client 升级到使用 Cucumber 喜欢的较新版本的 commons-io 的版本,要么将 zucchini 降级为需要与 pagerduty-client 一起工作的 Cucumber 版本。
这是一些 jakarta commons 包的常见问题,他们在某个时候决定在不更改包名称的情况下大量更改 public 接口,从而给用户造成这样的冲突。
你可能很幸运,我曾经在一个项目中工作,我们不得不重写数千行代码,这样我们就可以 link 到一个我们迫切需要的库,它依赖于更新版本的 commons -io 比我们一直使用的那个。
可能性 1
如果旧的和新的 commons-io package/class 名称足够匹配,从 pagerduty-client
中排除旧的依赖项可能会起作用。
https://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html
<dependency>
<groupId>com.github.dikhan</groupId>
<artifactId>pagerduty-client</artifactId>
<version>3.0.2</version>
<exclusions>
<exclusion>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
</exclusion>
</exclusions>
</dependency>
这依赖于版本 1.3.2 和 2.x 之间的 commons-io 的二进制 API 足够相似。
好像有很多重叠,看每个版本的代码:
- https://github.com/apache/commons-io/tree/commons-io-1.3.2/src/java/org/apache/commons/io
- https://github.com/apache/commons-io/tree/commons-io-2.5/src/main/java/org/apache/commons/io
可能性2
拆分您的应用程序,使 commons-io 依赖项不共享且不冲突。
您的应用程序的 pagerduty-client
和 zucchini
部分可能不需要 'bundled' 在一起,所以将它们分开。
如果他们 需要一起工作,那么您仍然可以有两个 apps/processes 并在他们之间发送消息。
备注
我克隆了 pagerduty-client
repo 并将 commons-io 依赖项从 org.apache.commons:commons-io:1.3.2
更改为 commons-io:commons-io:2.5
并且测试有效,所以也许你可以向项目提出建议所有者他们升级了 commons-io。
并且查看代码似乎几乎没有使用 commons-io(一个地方,HttpApiServiceImpl.java
):
\pagerduty-client>findstr /s /c:"commons" *.java
src\main\java\com\github\dikhan\pagerduty\client\events\domain\AcknowledgeIncident.java:import org.apache.commons.lang3.StringUtils;
src\main\java\com\github\dikhan\pagerduty\client\events\domain\Incident.java:import org.apache.commons.lang3.StringUtils;
src\main\java\com\github\dikhan\pagerduty\client\events\domain\Incident.java:import org.apache.commons.lang3.builder.Builder;
src\main\java\com\github\dikhan\pagerduty\client\events\domain\Payload.java:import org.apache.commons.lang3.StringUtils;
src\main\java\com\github\dikhan\pagerduty\client\events\domain\ResolveIncident.java:import org.apache.commons.lang3.StringUtils;
src\main\java\com\github\dikhan\pagerduty\client\events\HttpApiServiceImpl.java:import org.apache.commons.io.IOUtils;
src\main\java\com\github\dikhan\pagerduty\client\events\PagerDutyEventsClient.java:import org.apache.commons.lang3.StringUtils;
src\main\java\com\github\dikhan\pagerduty\client\events\utils\FakePagerDutyEventsClient.java:import org.apache.commons.lang3.StringUtils;
我在使用以下依赖项时尝试解决依赖项版本冲突。
我遇到的最糟糕的是 zucchini
项目支持从 1.4 到最新版本的 apache commons-io
版本。它不支持版本
低于 1.4
同时pagerduty-client
支持commons-io
个1.4以下的版本。
所以不可能指定这个依赖的通用版本(依赖管理)
它支持 zucchini 和 pager-duty 客户端(都是第三方库)。
在这种特殊情况下,我找不到解决此问题的可能方法。任何帮助将不胜感激。
<dependency>
<groupId>com.comcast.zucchini</groupId>
<artifactId>zucchini</artifactId>
<version>[2.2.5,)</version>
</dependency>
<dependency>
<groupId>com.github.dikhan</groupId>
<artifactId>pagerduty-client</artifactId>
<version>3.0.2</version>
</dependency>
由于您的 commons-io 是问题所在,您必须进一步查看。这意味着要么将 pagerduty-client 升级到使用 Cucumber 喜欢的较新版本的 commons-io 的版本,要么将 zucchini 降级为需要与 pagerduty-client 一起工作的 Cucumber 版本。
这是一些 jakarta commons 包的常见问题,他们在某个时候决定在不更改包名称的情况下大量更改 public 接口,从而给用户造成这样的冲突。
你可能很幸运,我曾经在一个项目中工作,我们不得不重写数千行代码,这样我们就可以 link 到一个我们迫切需要的库,它依赖于更新版本的 commons -io 比我们一直使用的那个。
可能性 1
如果旧的和新的 commons-io package/class 名称足够匹配,从 pagerduty-client
中排除旧的依赖项可能会起作用。
https://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html
<dependency>
<groupId>com.github.dikhan</groupId>
<artifactId>pagerduty-client</artifactId>
<version>3.0.2</version>
<exclusions>
<exclusion>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
</exclusion>
</exclusions>
</dependency>
这依赖于版本 1.3.2 和 2.x 之间的 commons-io 的二进制 API 足够相似。
好像有很多重叠,看每个版本的代码:
- https://github.com/apache/commons-io/tree/commons-io-1.3.2/src/java/org/apache/commons/io
- https://github.com/apache/commons-io/tree/commons-io-2.5/src/main/java/org/apache/commons/io
可能性2
拆分您的应用程序,使 commons-io 依赖项不共享且不冲突。
您的应用程序的 pagerduty-client
和 zucchini
部分可能不需要 'bundled' 在一起,所以将它们分开。
如果他们 需要一起工作,那么您仍然可以有两个 apps/processes 并在他们之间发送消息。
备注
我克隆了 pagerduty-client
repo 并将 commons-io 依赖项从 org.apache.commons:commons-io:1.3.2
更改为 commons-io:commons-io:2.5
并且测试有效,所以也许你可以向项目提出建议所有者他们升级了 commons-io。
并且查看代码似乎几乎没有使用 commons-io(一个地方,HttpApiServiceImpl.java
):
\pagerduty-client>findstr /s /c:"commons" *.java
src\main\java\com\github\dikhan\pagerduty\client\events\domain\AcknowledgeIncident.java:import org.apache.commons.lang3.StringUtils;
src\main\java\com\github\dikhan\pagerduty\client\events\domain\Incident.java:import org.apache.commons.lang3.StringUtils;
src\main\java\com\github\dikhan\pagerduty\client\events\domain\Incident.java:import org.apache.commons.lang3.builder.Builder;
src\main\java\com\github\dikhan\pagerduty\client\events\domain\Payload.java:import org.apache.commons.lang3.StringUtils;
src\main\java\com\github\dikhan\pagerduty\client\events\domain\ResolveIncident.java:import org.apache.commons.lang3.StringUtils;
src\main\java\com\github\dikhan\pagerduty\client\events\HttpApiServiceImpl.java:import org.apache.commons.io.IOUtils;
src\main\java\com\github\dikhan\pagerduty\client\events\PagerDutyEventsClient.java:import org.apache.commons.lang3.StringUtils;
src\main\java\com\github\dikhan\pagerduty\client\events\utils\FakePagerDutyEventsClient.java:import org.apache.commons.lang3.StringUtils;