In my java project, I need to use neo4j-1.9.3 that depends on lucene-3.6.2, and ElasticSearch which depends on lucene-4.4.0. I know that if I want to use two versions of lucene directly, I can use ClassLoader to load different classes from the lucenes.
But the problem is that I won't use lucene's apis directly now. Is there any way that lucene-3.6.2 can be loaded when neo4j's apis are running, and lucene-4.4.0 can be loaded while running elasticsearch's apis. The two versions of lucene conflict now, and I need to run neo4j and elasticsearch in one project. How could I solve the dependency problem?
Thanks in advance.
If this is a desktop application, you should have no problem, because you can include just the correct jar in the app. If this is a web app that needs to access both versions, and you can't separate it into two web apps, then -yes- you would need to use classloaders to separate the two namespaces from each other.
One of the new features that Java 9 brings us is the capability to build Multi-Release JARs (MRJAR). As the JDK Enhancement Proposal says, this allows us to have different Java release-specific versions of a class in the same JAR.
Adding jars to a single jar is done using the jar command. Suppose you have jarA, jarB and jarC. For your deployment you would need a manifest file too. The manifest would specify the external jars' full path.
Jar files can contain only one Main-Class attribute in the manifest, which means a jar can contain only one mainClassName.
You could still use a ClassLoader solution, but that is a nasty business where it is easy to make mistakes.
You could also use different JVM's.
But the solution I would personally choose is either (or both) of the following:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With