我为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吗?
发布于 2015-12-01 06:26:45
我暂时解决这个问题的方法是删除-beanutils jar中的文件夹org.apache.commons.collections。
因为我发现这个文件夹中的类文件也包含在公共集合中。
而且这种方法非常不明智,它可以工作,我只需要删除并添加一次lib文件。
或者使用不包含集合forder的commons的其他版本,如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> 发布于 2015-12-01 05:52:40
由于您使用的是Maven,所以可以在您的受抚养人除外中为json-lib工件使用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>https://stackoverflow.com/questions/34012050
复制相似问题