【问题标题】:elasticsearch lib can not add commons-beanutils and commons-collections Simultaneouslyelasticsearch lib不能同时添加commons-beanutils和commons-collections
【发布时间】:2016-03-04 21:11:03
【问题描述】:

我为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.

引用的 checkClass,我猜是因为 commons-beanutils-1.8.0.jar 和 commons-collections-3.2.1.jar 都有路径 org\apache\commons\collections。

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

【问题讨论】:

  • 您是否使用 Maven 来构建和管理依赖项?
  • 是的,我这样管理依赖项:<dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</artifactId> <version>2.4</version> <classifier>jdk15</classifier> </dependency>

标签: java json elasticsearch jar elasticsearch-plugin


【解决方案1】:

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

    <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-beanutils 和 commons-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>

【讨论】:

  • 还是不行。 "caused_by" : { "type" : "no_class_def_found_error", "reason" : "org/apache/commons/collections/map/ListOrderedMap"}。临时工作的方法在my answer,也很不聪明。
  • 不,收藏文件夹仍在commons.beanutils jar 中。查看我的更新,感谢您的排除思维。
【解决方案2】:

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

或者使用其他不包含collection 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> 

【讨论】:

    猜你喜欢
    • 2013-01-02
    • 2013-01-24
    • 2018-01-02
    • 2012-01-12
    • 2011-04-25
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    • 2015-11-19
    相关资源
    最近更新 更多