elasticsearch lib 不能同时添加 commons-beanutils 和 commons-collections

elasticsearch lib can not add commons-beanutils and commons-collections Simultaneously

我为 elasticsearch 制作了一个原生 java 插件,并在我的插件中导入了 net.sf.json jar。所以我在 path\elasticsearch-2.0.0\lib 中添加了以下 jar:

commons-beanutils-1.8.0  
commons-collections-3.2.1  
commons-lang-2.5  
commons-logging-1.1.1  
ezmorph-1.0.6  
json-lib-2.4-jdk15 

但是当我运行./elasticsearch时,显示如下异常:

Exception in thread "main" java.lang.IllegalStateException: jar hell!  
class: org.apache.commons.collections.ArrayStack  
jar1: D:\Program Files\elasticsearch-2.0.0\lib\commons-beanutils-1.8.0.jar  
jar2: D:\Program Files\elasticsearch-2.0.0\lib\commons-collections-3.2.1.jar  
    at org.elasticsearch.bootstrap.JarHell.checkClass(JarHell.java:267)  
        at org.elasticsearch.bootstrap.JarHell.checkJarHell(JarHell.java:185)  
        at org.elasticsearch.bootstrap.JarHell.checkJarHell(JarHell.java:86)
        at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:156)  
        at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:270)  
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:35)  
Refer to the log for complete error details.

Referenced checkClass,我猜是因为 commons-beanutils-1.8.0.jarcommons-collections-3.2.1.jar 都有路径 org\apache\commons\collections

我该如何处理?
还有其他方法可以在 elasticsearch 中为插件添加额外的 jar 吗?

由于您使用的是 Maven,因此您可以在 pom.xml 中为 json-lib 工件使用 dependency exclusions

    <dependency>
        <groupId>net.sf.json-lib</groupId>
        <artifactId>json-lib</artifactId>
        <version>2.4</version>
        <classifier>jdk15</classifier>
        <exclusions>
            <exclusion>
                <groupId>commons-beanutils</groupId>
                <artifactId>commons-beanutils</artifactId>
            </exclusion>
            <exclusion>
                <groupId>commons-collections</groupId>
                <artifactId>commons-collections</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

将不会使用 json-lib 的编译时依赖项。请注意,您 运行 存在产生冲突的风险,因为您的 json-lib 版本可能取决于 commons-beanutilscommons-collections 的不同版本,但这值得一试。

更新

那么您只需要为您的直接 commons-beanutils 依赖项排除另一个:

    <dependency>
        <groupId>commons-beanutils</groupId>
        <artifactId>commons-beanutils</artifactId>
        <version>1.8.0</version>
        <exclusions>
            <exclusion>
                <groupId>commons-collections</groupId>
                <artifactId>commons-collections</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

我暂时解决这个问题的方法是删除 commons-beanutils jar 中的文件夹org.apache.commons.collections
因为我发现这个文件夹中的 class 个文件也包含在 commons-collections.
而且这种方法非常不聪明,但它有效,我只需要删除并添加到 lib 文件一次。

或者使用不包含collections forder的其他版本的commons-beanutils,比如1.9.2版本

更新
感谢@Val的思考,越多越好pom.xml:

<dependency>
    <groupId>net.sf.json-lib</groupId>
    <artifactId>json-lib</artifactId>
    <version>2.4</version>
    <classifier>jdk15</classifier>
    <exclusions>
        <exclusion>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
        </exclusion>
    </exclusions>
    </dependency>
    <dependency>
        <groupId>commons-beanutils</groupId>
        <artifactId>commons-beanutils</artifactId>
        <version>1.9.2</version>
    </dependency>