1

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

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

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

编辑:更复杂的是,如果我在新启动的 Tomcat 上有 SOLR,显示 4.1.0 lucene 实现,然后重新加载核心或通过 Tomcat 管理器重新加载 webapp,它会回到 2.9.0!这显然是不可接受的。

4

1 回答 1

0

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

另一种选择是要求您的 Tomcat 使用您的 WEB-INF 库 (WEB-INF/lib) 来进行 Solr 和服务器库 ($CATALINA_HOME/lib) 使用 lucene 进行遗留搜索。

您可以通过参数在 Web-logic Server 中实现这一点,

<container-descriptor>
    <prefer-web-inf-classes>true</prefer-web-inf-classes>
</container-descriptor>

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

希望也有在 Tomcat 中执行此操作的选项!

于 2013-02-27T13:43:43.040 回答