17

Apache 的两个 Maven 工件中有四个重复的类:commons-beanutils:commons-beanutils:1.8.3commons-collections:commons-collections:3.2.1

org.apache.commons.collections.ArrayStack
org.apache.commons.collections.Buffer
org.apache.commons.collections.BufferUnderflowException
org.apache.commons.collections.FastHashMap

是否可以用其他工件替换其中一个以避免这种重复?我试图谷歌但没有找到任何解决方案。比较烦人的问题。

4

4 回答 4

17

在这种情况下,问题不是 maven 或排除(这通常是问题),但您很可能使用了错误版本的 beanutils。

有一个包含 bean 集合的 beanutils jar 版本和一个不包含 bean 集合的版本。带有 bean 集合的 beanutils 的 maven 依赖项包括 commons 集合。如果您自己使用公共集合,请使用核心版本并将公共集合包含在 maven 依赖项中。

这是解释一下的地方: http: //commons.apache.org/beanutils/

该页面是这样说的:

commons-beanutils.jar - contains everything
commons-beanutils-core.jar - excludes Bean Collections classes
commons-beanutils-bean-collections.jar - only Bean Collections classes

The main commons-beanutils.jar has an optional dependency on Commons Collections
于 2013-01-18T16:23:20.510 回答
1

看看这篇文章链接它告诉使用排除标签

更新

看看这个链接2

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>2.0</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <artifactSet>
                <excludes>
                  <exclude>classworlds:classworlds</exclude>
                  <exclude>junit:junit</exclude>
                  <exclude>jmock:*</exclude>
                  <exclude>*:xml-apis</exclude>
                  <exclude>org.apache.maven:lib:tests</exclude>
                  <exclude>log4j:log4j:jar:</exclude>
                </excludes>
              </artifactSet>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  ...
</project>
于 2013-01-18T16:08:10.577 回答
0

所以基本上发生的事情是你从一个配置错误的 jar 中拉入两个版本(拉入两个版本,这是多余的),或者从多个依赖项中拉入一个版本,另一个拉入另一个版本,冲突!我将其称为 commons-beanutils 的“奇怪的发布系统”问题,因为 maven 无法轻松处理该模式……对我来说,一个解决方法是增加我的依赖版本,它同时包含版本(在我的情况下为“commons-configuration”),或手动指定特定版本commons-configuration

所以这个mvn dependency:tree

[INFO] +- commons-configuration:commons-configuration:jar:1.6:compile
[INFO] |  +- commons-collections:commons-collections:jar:3.2.1:compile (version managed from 3.2)
[INFO] |  +- commons-digester:commons-digester:jar:1.8:compile
[INFO] |  \- commons-beanutils:commons-beanutils:jar:1.7.0:compile
[INFO] |  \- commons-beanutils:commons-beanutils-core:jar:1.8.0:compile

变成了这样:

[INFO] +- commons-configuration:commons-configuration:jar:1.7:compile
[INFO] |  +- commons-collections:commons-collections:jar:3.2.1:compile
[INFO] |  +- commons-lang:commons-lang:jar:2.6:compile
[INFO] |  +- commons-logging:commons-logging:jar:1.1.1:compile
[INFO] |  +- commons-digester:commons-digester:jar:1.8.1:compile
[INFO] |  \- commons-beanutils:commons-beanutils:jar:1.8.3:compile

尽管根据对另一个答案的评论,将“某物”撞到使用 commons-beanutil 1.9+ 的版本也可以。

于 2019-03-11T17:54:42.853 回答
-1

从 beanutils JAR 中排除集合包,它对我有用:)

于 2013-05-15T21:42:48.927 回答