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.jar
和 commons-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-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>
我暂时解决这个问题的方法是删除 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>
我为 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.jar
和 commons-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-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>
我暂时解决这个问题的方法是删除 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>