提问者:小点点

雄猫上的两个版本的 SolR


我已经在Tomcat 6,1.3和4.7上安装了两个版本的solr,每个版本都可以访问,但是在tomcat配置的选项卡中Java -Dsolr.solr.home=C:\Solr\solr,其中此路径是1.3的路径但是,我在E:\new-solr上有4.7。

当我尝试创建新核心时,它创建得很好,但在重新启动 Tomcat 后它消失了。我相信缺少正确的Solr家是原因。那么,有没有办法在Tomcat的Java属性中设置多个solr家呢?

编辑:当我使用 -Dsolr.solr.home=C:\Solr\solr 运行 Tomcat 时,我遇到了有关 Solr 4.7 版本中缺少内核的错误,这些内核在 Solr 1.3 中工作正常。

SolrCore 初始化失败存档:org.apache.solr.common.SolrException:org.apache.solr.common.SolrException:无法加载配置文件 c:\solr\solr\archive\solrconfig.xml


共2个答案

匿名用户

看起来您正在使用JAVA_OPTS传递 solr 家的价值。您需要编辑服务器.xml并将适当的 Solr 主页添加到上下文中。以下示例来自Solrwiki上的SolrTomcat页面。

<Context docBase="/opt/solr/example/solr/solr.war" debug="0" crossContext="true">
  <Environment name="solr/home" type="java.lang.String" value="/opt/solr/example/solr" override="true"/>
</Context>

匿名用户

Solr的SolrResourceLoader#locateSolrHome首先尝试JNDI,然后尝试系统属性以查找其设置。由于 -D 系统属性在单个 Tomcat 实例中的所有应用程序之间共享,因此这些属性不能用于配置多个 Solr 实例。

如果由于某种原因无法使用 JNDI(例如

这肯定是一个黑客攻击,并且依赖于Tomcat不并行启动应用程序,并且Solr仅在启动时读取系统属性。我已经测试了它以很好地工作,但它仍然可能只适合测试目的。

同样,这首先需要将Solr包装到自己的应用程序中。接下来,创建一个文件夹 /some/config,其中包含每个实例的子文件夹,与其上下文名称匹配。在每个子文件夹中创建一个自定义属性文件:

# This file /some/config/[servlet-context-name]/custom.properties is used
# if Tomcat is started with:
#   -Dcustom.config.dir=/some/config
# ...and then (temporarily) overwrites any system properties specified below:

solr.solr.home=/some/other/folder/conf
solr.data.dir=/some/other/folder/data

要根据属性文件中的某些键值合并系统属性,请执行以下操作:

/**
 * Tries to find the given file and merges its properties into the existing
 * system properties.
 *
 * @param configFile
 *            full path of a property file
 * @return {@code true} if the file was found and merged; {@code false}
 *         otherwise
 */
private boolean mergeSystemProperties(final String configFile) {

    try (final FileInputStream is = new FileInputStream(configFile)) {

        final Properties custom = new Properties();
        custom.load(is);

        for (final Map.Entry<Object, Object> prop : custom.entrySet()) {
            LOG.info("Setting {}={}", prop.getKey(), prop.getValue());
            System.setProperty((String)prop.getKey(), (String)prop.getValue());
        }

        return true;

    } catch (final FileNotFoundException e) {
        LOG.info("Could not find custom properties: {}", configFile);
    } catch (final IOException e) {
        LOG.error("Failed to read custom properties: " + configFile, e);
    }
    return false;
}

这可以在侦听器中使用:

public class TestConfigContextListener implements ServletContextListener {
    private static final Logger LOG = ...
    private static final String PROP_DIR = "custom.config.dir";
    private static final String FILE_NAME = "custom.properties";

    @Override
    public void contextInitialized(final ServletContextEvent event) {

        final String configDir = System.getProperty(PROP_DIR);    
        if (configDir == null) {
            LOG.info("No value for -D{}; not reading custom config", PROP_DIR);
        } else {
            LOG.info("Custom config dir: -D{}={}", PROP_DIR, configDir);
            final ServletContext context = event.getServletContext();

            // Either "" for the root, or "/some-path" otherwise
            final String contextPath = context.getContextPath();
            if (!contextPath.isEmpty()) {
                if (mergeSystemProperties(configDir + File.separator
                  + contextPath.substring(1, contextPath.length())
                  + File.separator + FILE_NAME)) {
                    // We found the configuration in a subfolder matching the
                    // specific contextPath; done.
                    return;
                }
            }

            // Root context, or no configuration in a subfolder matching the
            // specific contextPath; try to load from configDir itself:
            mergeSystemProperties(configDir + File.separator + FILE_NAME);
        }
    }
    ...
}

...在 Web 中.xml

 <!-- 
   Tries to read a property file to set/override system properties just before
   Solr is initialized, sort of allowing to run multiple instances with
   different settings, IF THEY ARE NOT STARTED SIMULTANEOUSLY.
 -->
 <listener>
   <listener-class>net.example.TestConfigContextListener</listener-class>
 </listener>

最后说明:虽然可以使用