Description of problem:
It is currently impossible to have both lucene 4 and lucene 5 in the same OSGi runtime, due to the require-bundle directives being too relaxed in lucene 4. For example, I am seeing java.lang.VerifyErrors in Eclipse when I try this. Here is an example of such an error:
Exception Details:
Location:
org/eclipse/epp/internal/logging/aeri/ide/server/mars/ServerProblemsHistory.createInitialIndex(Lorg/apache/lucene/store/Directory;)V @14: invokespecial
Reason:
Type 'org/apache/lucene/analysis/core/KeywordAnalyzer' (current frame, stack[3]) is not assignable to 'org/apache/lucene/analysis/Analyzer'
Current Frame:
bci: @14
flags: { }
locals: { 'org/eclipse/epp/internal/logging/aeri/ide/server/mars/ServerProblemsHistory', 'org/apache/lucene/store/Directory' }
stack: { uninitialized 0, uninitialized 0, 'org/apache/lucene/util/Version', 'org/apache/lucene/analysis/core/KeywordAnalyzer' }
Bytecode:
0x0000000: bb00 6959 b200 6bbb 0071 59b7 0073 b700
0x0000010: 744d 2cb2 0077 b600 7d57 014e 013a 04bb
0x0000020: 0081 592b 2cb7 0083 3a05 bb00 8659 b700
0x0000030: 883a 0619 06bb 0089 5912 0812 0bb2 008b
0x0000040: b200 91b7 0097 b600 9a19 0519 06b6 009e
0x0000050: 1905 b600 a219 05c6 0032 1905 b600 a5a7
0x0000060: 002a 4e19 05c6 0008 1905 b600 a52d bf3a
0x0000070: 042d c700 0919 044e a700 0f2d 1904 a500
0x0000080: 092d 1904 b600 a82d bfb1
Exception Handler Table:
bci [42, 85] => handler: 98
bci [31, 111] => handler: 111
Stackmap Table:
full_frame(@98,{Object[#1],Object[#180],Object[#105],Object[#169],Object[#169],Object[#129]},{Object[#169]})
chop_frame(@109,1)
same_locals_1_stack_item_frame(@111,Object[#169])
same_frame(@123)
same_frame(@135)
chop_frame(@137,2)
The problem is that the OSGi runtime is not wiring the expected version of lucene.core as a dependency of lucene.analysis. When you debug the OSGi runtime, you can see that it wires the newest possible version of org.apache.lucene.core as a dependency of org.apache.lucene.analysis_4.8.0
Requirement: osgi.wiring.bundle; filter:="(&(osgi.wiring.bundle=org.apache.lucene.core)(bundle-version>=4.8.0))"
Provider: osgi.identity; osgi.identity="org.apache.lucene.core"; type="osgi.bundle"; version:Version="5.4.1"
While this is correct from an OSGi POV, it's this Lucene version mis-match that causes the above java.lang.VerifyError
When I fix the OSGi metadata in lucene 4 to make the require-bundle directive more strict, this error goes away and OSGi wires the dependencies as expected.
(In reply to Mat Booth from comment #1)
> Created attachment 1221155[details]
> Proposed Patch
With this patch applied, debugging the runtime now shows the correct wiring:
Requirement: osgi.wiring.bundle; filter:="(&(osgi.wiring.bundle=org.apache.lucene.core)(&(bundle-version>=4.8.0)(!(bundle-version>=5.0.0))))"
Provider: osgi.identity; osgi.identity="org.apache.lucene.core"; type="osgi.bundle"; version:Version="4.8.0"
Since the problem described in this bug report should be
resolved in a recent advisory, it has been closed with a
resolution of ERRATA.
For information on the advisory, and where to find the updated
files, follow the link below.
If the solution does not work for you, open a new bug report.
https://access.redhat.com/errata/RHBA-2017:1152
Description of problem: It is currently impossible to have both lucene 4 and lucene 5 in the same OSGi runtime, due to the require-bundle directives being too relaxed in lucene 4. For example, I am seeing java.lang.VerifyErrors in Eclipse when I try this. Here is an example of such an error: Exception Details: Location: org/eclipse/epp/internal/logging/aeri/ide/server/mars/ServerProblemsHistory.createInitialIndex(Lorg/apache/lucene/store/Directory;)V @14: invokespecial Reason: Type 'org/apache/lucene/analysis/core/KeywordAnalyzer' (current frame, stack[3]) is not assignable to 'org/apache/lucene/analysis/Analyzer' Current Frame: bci: @14 flags: { } locals: { 'org/eclipse/epp/internal/logging/aeri/ide/server/mars/ServerProblemsHistory', 'org/apache/lucene/store/Directory' } stack: { uninitialized 0, uninitialized 0, 'org/apache/lucene/util/Version', 'org/apache/lucene/analysis/core/KeywordAnalyzer' } Bytecode: 0x0000000: bb00 6959 b200 6bbb 0071 59b7 0073 b700 0x0000010: 744d 2cb2 0077 b600 7d57 014e 013a 04bb 0x0000020: 0081 592b 2cb7 0083 3a05 bb00 8659 b700 0x0000030: 883a 0619 06bb 0089 5912 0812 0bb2 008b 0x0000040: b200 91b7 0097 b600 9a19 0519 06b6 009e 0x0000050: 1905 b600 a219 05c6 0032 1905 b600 a5a7 0x0000060: 002a 4e19 05c6 0008 1905 b600 a52d bf3a 0x0000070: 042d c700 0919 044e a700 0f2d 1904 a500 0x0000080: 092d 1904 b600 a82d bfb1 Exception Handler Table: bci [42, 85] => handler: 98 bci [31, 111] => handler: 111 Stackmap Table: full_frame(@98,{Object[#1],Object[#180],Object[#105],Object[#169],Object[#169],Object[#129]},{Object[#169]}) chop_frame(@109,1) same_locals_1_stack_item_frame(@111,Object[#169]) same_frame(@123) same_frame(@135) chop_frame(@137,2) The problem is that the OSGi runtime is not wiring the expected version of lucene.core as a dependency of lucene.analysis. When you debug the OSGi runtime, you can see that it wires the newest possible version of org.apache.lucene.core as a dependency of org.apache.lucene.analysis_4.8.0 Requirement: osgi.wiring.bundle; filter:="(&(osgi.wiring.bundle=org.apache.lucene.core)(bundle-version>=4.8.0))" Provider: osgi.identity; osgi.identity="org.apache.lucene.core"; type="osgi.bundle"; version:Version="5.4.1" While this is correct from an OSGi POV, it's this Lucene version mis-match that causes the above java.lang.VerifyError When I fix the OSGi metadata in lucene 4 to make the require-bundle directive more strict, this error goes away and OSGi wires the dependencies as expected.