我已经在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
看起来您正在使用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>
最后说明:虽然可以使用