【问题标题】:How to depend on two different versions of a library?如何依赖一个库的两个不同版本?
【发布时间】:2013-07-25 13:20:57
【问题描述】:

我正在使用 ElasticSearch 和 JackRabbit(或者......我也在尝试)。 JackRabbit 似乎依赖于 Lucene 3.6.x 而 ElasticSearch 依赖于 4.3.1。我正在使用 Maven 和 JBoss 7.1.1。我在类路径上获得了 Lucene 4.3.1,但是由于 JackRabbit 需要旧 Lucene 的某些东西,所以 h*** 在日志中出现了松动。

我该如何解决这个问题?

【问题讨论】:

    标签: java maven jakarta-ee jboss


    【解决方案1】:

    您需要使用您希望使用的冲突库(弹性搜索和jackrabbit)和make both into jboss as7 modules。使用 jboss 7 模块化类加载,您可以“包含”它们中的每一个,并将其作为一个单独的模块具有自己的依赖项,并且只向您的应用程序公开您使用的 api。

    它有点复杂(完整文档here),但允许您让他们每个人都使用自己的 lucene 版本 - 他们每个人都将被打包到一个包含所有理论依赖树的模块中。

    编辑 - 在jboss modules documentation 中提供了有关如何仅导出部分模块内容的更多信息。您要确保不要将 lucene 从任何模块中导出

    【讨论】:

    • 好吧,所以我应该在JBoss中安装ElasticSearch和Jackrabbit,然后我可以使用两个不同的版本?
    • 但是,如果您查看 mvnrepository.com/artifact/org.elasticsearch/elasticsearch/… 的所有依赖项,这是否意味着我也必须将它们全部安装为一个模块?
    • @LuckyLuke-您可以将弹性搜索及其所有依赖项(因此您链接的列表中的所有内容)安装为单个 jboss 模块,只会公开弹性搜索。这里有一个如何为 drools 执行此操作的示例 - samaxes.com/2012/11/…,只是为了看看他们如何列出所有 drools 的依赖项
    • @LuckyLuke - 你可以让 maven 为你做这件事。创建一个仅依赖于您需要的 ElasticSearch 库的空 maven 项目,然后绑定对 maven 依赖项插件的调用以复制您的所有依赖项 - maven.apache.org/plugins/maven-dependency-plugin/… - 它也应该包括传递性。也见这里 - stackoverflow.com/questions/11973889/…
    【解决方案2】:

    您可以创建两个自定义类加载器实例,并用其中一个加载 ElasticSearch 类,用另一个加载 JackRabbit。第一个必须从 Lucene 3.6.x jar 加载类,另一个从 v.4.3.1 jar 加载

    【讨论】:

    • 为什么不呢?他们将拥有 jboss 为应用程序提供的类加载器作为父级,他们将首先尝试查找 Lucene 类,然后委托给父级
    • 你需要将它们放在普通的 jboss 类加载找不到它们的地方,并使用设置上下文类加载器的特殊代码访问它们。如果您尝试对它们进行任何花哨的操作(例如将它们写为 jms 或 infinispan 的一部分),您将陷入痛苦的世界。 jboss 有自定义类加载。使用它。
    猜你喜欢
    • 2019-02-25
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 2014-11-17
    • 1970-01-01
    • 2014-08-18
    相关资源
    最近更新 更多