Thanks Shawn,
I am now pointing solrHomeFolder to lucene-solr-master\solr\server\solr which
contains the correct solr.xml file.
Tried the following two ways to create an EmbeddedSolrServer:
1. CoreContainer corecon =
CoreContainer.createAndLoad(Paths.get(solrHomeFolder));
corecon.load();
SolrClient svr = new EmbeddedSolrServer(corecon, corename);
2. SolrClient svr = new EmbeddedSolrServer(Paths.get(solrHomeFolder),
corename);
They both throws the same exception (java.lang.NoClassDefFoundError: Could not
initialize class org.apache.solr.servlet.SolrRequestParsers).
org.apache.solr.servlet.SolrRequestParsers class is present in the
solr-core-7.0.0-SNAPSHOT.jar and this jar is present in the WEB-INF\lib folder
(in solr server) and also included as a dependency jar in the pom.xml of the
test project.
Here is the full stack trace of the exception:
java.lang.NoClassDefFoundError: Could not initialize class
org.apache.solr.servlet.SolrRequestParsers
at
org.apache.solr.client.solrj.embedded.EmbeddedSolrServer.<init>(EmbeddedSolrServer.java:112)
at
org.apache.solr.client.solrj.embedded.EmbeddedSolrServer.<init>(EmbeddedSolrServer.java:70)
at
com.gossinteractive.solr.DocPhraseUpdateProcessorTest.createEmbeddedSolrServer(DocPhraseUpdateProcessorTest.java:141)
at
com.gossinteractive.solr.DocPhraseUpdateProcessorTest.setUp(DocPhraseUpdateProcessorTest.java:99)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at
org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at
org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at
org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
at
org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:73)
at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:46)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41)
at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173)
at
org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at
org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.ParentRunner.run(ParentRunner.java:220)
at
org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at
org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
I have debugged this a bit and found that this exception is thrown on the
following line in EmbeddedServer.class
_parser = new SolrRequestParsers(null);
Also, the coreContainer object has no cores at this point.
Wonder if I should update my code from master (it is now about two weeks old).
Thanks for any help.
Rohana
-----Original Message-----
From: Shawn Heisey [mailto:[email protected]]
Sent: 08 April 2016 16:46
To: [email protected]
Subject: Re: EmbeddedSolr for unit tests in Solr 6
On 4/8/2016 7:51 AM, Rohana Rajapakse wrote:
> Thanks. I know it exists, but don't know how to use it.
>
> I am trying to use EmbeddedSolrServer(Path solrHome, String
> defaultCoreName)
>
> What should be the "solrHome"? Should it be the actual solr home (i.e.
> lucene-solr-master\solr\server\solr) in the solr server, or can it be any
> temporary folder?
>
> I create it with: new EmbeddedSolrServer((new
> File("testdata/solr")).toPath(), "tmpcore"); and get the following Exception
> (I use solr-Solr-7.0.0):
>
> org.apache.solr.common.SolrException: Should not have found
> solr/@persistent . Please upgrade your solr.xml:
> https://cwiki.apache.org/confluence/display/solr/Format+of+solr.xml
> at
> org.apache.solr.core.SolrXmlConfig.failIfFound(SolrXmlConfig.java:167)
> at
> org.apache.solr.core.SolrXmlConfig.checkForIllegalConfig(SolrXmlConfig.java:149)
> at org.apache.solr.core.SolrXmlConfig.fromConfig(SolrXmlConfig.java:61)
> at
> org.apache.solr.core.SolrXmlConfig.fromInputStream(SolrXmlConfig.java:129)
> at org.apache.solr.core.SolrXmlConfig.fromFile(SolrXmlConfig.java:111)
> at
> org.apache.solr.core.SolrXmlConfig.fromSolrHome(SolrXmlConfig.java:139)
> at
> org.apache.solr.core.SolrXmlConfig.fromSolrHome(SolrXmlConfig.java:144)
> at
> org.apache.solr.client.solrj.embedded.EmbeddedSolrServer.<init>(EmbeddedSolrServer.java:70)
> at
> com.gossinteractive.solr.DocPhraseUpdateProcessorTest.createEmbeddedSolrServer(DocPhraseUpdateProcessorTest.java:140)
> at
> com.gossinteractive.solr.DocPhraseUpdateProcessorTest.setUp(DocPhraseU
> pdateProcessorTest.java:98)
You said you were using EmbeddedSolrServer with 4.x, so I assumed you knew what
you were doing.
You are getting that Exception because the solr home you pointed to contains a
solr.xml file in the old solr.xml format. This format is supported by all of
4.x, but support was dropped in 5.0. The message is pretty clear -- it says
that you need to upgrade your solr.xml, and even points at some documentation.
Here's a wiki page about the old format, with a link to another page about the
new format:
http://wiki.apache.org/solr/Solr.xml%20%28supported%20through%204.x%29
Suggestion: Rather than create a File object and convert it to a Path, use NIO2
methods directly:
Paths.get("testdata/solr")
Thanks,
Shawn
Registered Office: 24 Darklake View, Estover, Plymouth, PL6 7TL.
Company Registration No: 3553908
This email contains proprietary information, some or all of which may be
legally privileged. It is for the intended recipient only. If an addressing or
transmission error has misdirected this email, please notify the author by
replying to this email. If you are not the intended recipient you may not use,
disclose, distribute, copy, print or rely on this email.
Email transmission cannot be guaranteed to be secure or error free, as
information may be intercepted, corrupted, lost, destroyed, arrive late or
incomplete or contain viruses. This email and any files attached to it have
been checked with virus detection software before transmission. You should
nonetheless carry out your own virus check before opening any attachment. GOSS
Interactive Ltd accepts no liability for any loss or damage that may be caused
by software viruses.