具有lucene实现的Apache SOLR 4.1类加载器问题

时间:2013-02-25 17:05:31

标签: tomcat solr classloader

我最近遇到了将Apache SOLR 4.1 war文件部署到我们的tomcat 6服务器的问题。在服务器库($ CATALINA_HOME / lib)中,我们为一些传统搜索应用程序提供了一个较旧的lucene实现库(2.9+)。 SOLR在其.war文件WEB-INF / lib中有较新的4.1 lucene实现jar文件。通过检查Tomcat 6文档,似乎SOLR库应该加载FIRST;但是,根据经验并非如此:如果我将其部署到正在运行的服务器,则管理仪表板会显示其加载2.9.0 lucene实现。

添加另一个转折点:如果我停止并重新启动Tomcat服务器,则转而使用4.1!正如你可能想象的那样,这导致了我的奴隶复制悲痛;因为我相信我的初始索引是通过2.9 lucene构建的,在某些时候重新启动容器,使用当时加载的4.1进行更新,并尝试复制到2.9 lucene-implementation slave,导致它们全部失败。

欢迎任何建议。我尝试从SOLR war文件中删除4.1库,但它无法加载,因为一些依赖似乎需要它们(尽管类加载器在部署后选择“公共库”lucene实现!)更新所有遗产是不可行的在这些服务器上的软件lucene 4,将涉及尽可能多的重写。知道为什么类加载器会以这种方式执行吗?

编辑:进一步使事情变得复杂,如果我在一个新启动的Tomcat上显示SOLR,显示4.1.0 lucene实现,然后RELOAD核心或通过Tomcat管理器重新加载webapp,它将返回2.9.0!这显然是不可接受的。

1 个答案:

答案 0 :(得分:0)

在给定的场景中,我会选择在另一个Web容器中运行Solr(可能是轻量级的,如jetty )。但我不确定您的架构是否具有这种灵活性,或者您可能担心这些容器的可维护性。如果您不受这些问题的影响,您可以采用这种方法。

另一个选择是让您的Tomcat使用您的WEB-INF库(WEB-INF / lib)进行Solr和服务器库($ CATALINA_HOME / lib),以便使用lucene进行遗留搜索。

您可以通过参数

在Web逻辑服务器中实现此目的
<container-descriptor>
    <prefer-web-inf-classes>true</prefer-web-inf-classes>
</container-descriptor>

在Solr web-app的“weblogic.xml”中。

希望在Tomcat中也可以选择这样做!