Community
Participate
Working Groups
Several Batik 1.9.1 bundles (I20190731180122) have unrestricted imports of batik.util packages like: Import-Package: [...] org.apache.batik.util;resolution:= optional This causes issues like > java.lang.NoSuchMethodError: org.apache.batik.util.SoftReferenceCache.<init>(Z)V > at org.apache.batik.ext.awt.color.NamedProfileCache.<init>(NamedProfileCache.java:43) > at org.apache.batik.ext.awt.color.NamedProfileCache.<clinit>(NamedProfileCache.java:35) > at org.apache.batik.bridge.SVGColorProfileElementBridge.<init>(SVGColorProfileElementBridge.java:48) > at org.apache.batik.bridge.SVGBridgeExtension.registerTags(SVGBridgeExtension.java:101) > at org.apache.batik.bridge.BridgeContext.registerSVGBridges(BridgeContext.java:2052) > at org.apache.batik.bridge.BridgeContext.setDocument(BridgeContext.java:445) > at org.apache.batik.bridge.GVTBuilder.build(GVTBuilder.java:54) > at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:208) > at org.apache.batik.transcoder.image.ImageTranscoder.transcode(ImageTranscoder.java:92) > at org.apache.batik.transcoder.XMLAbstractTranscoder.transcode(XMLAbstractTranscoder.java:142) > at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:156) > java.lang.LinkageError: loader constraint violation: loader (instance of org/eclipse/osgi/internal/loader/EquinoxClassLoader) previously initiated loading for a different type with name "org/apache/batik/util/ParsedURL" > at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:255) > at org.apache.batik.transcoder.image.ImageTranscoder.transcode(ImageTranscoder.java:92) > at org.apache.batik.transcoder.XMLAbstractTranscoder.transcode(XMLAbstractTranscoder.java:142) > at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:156) because classes from other version of Batik are used. The bundles I checked imports batik.util as bundles, so the package imports can be simply removed (!org.apache.batik.util.*).
This seems to be every bundle except batik-util itself, batik-constants, and batik-i18n.
It seems the recipes that build the OSGi bundles (see code in git repo [1]) don't include packages in their "Import-Package" statement from required bundles, nor the bundle itself. These get added automagically added by 'bnd' (probably when it detects that those packages are used -- ignoring that they are provided via 'Require-Bundle' or contained in the same bundle itself?) For instance, those are the import statements for batik.bridge (as taken directly from [1] today). Note, there is no line specifying batik.util imports...: ###################### Import-Package: \ org.apache.batik.anim.dom;version="${batik-anim-version-range}", \ org.apache.batik.anim.timing;version="${batik-anim-version-range}", \ org.apache.batik.anim.values;version="${batik-anim-version-range}", \ org.apache.batik.anim;version="${batik-anim-version-range}", \ org.apache.batik.css.engine.value.svg12;version="${batik-css-version-range}", \ org.apache.batik.css.engine.value.svg;version="${batik-css-version-range}", \ org.apache.batik.css.engine.value;version="${batik-css-version-range}", \ org.apache.batik.css.engine;version="${batik-css-version-range}", \ org.apache.batik.dom.events;version="${batik-dom-version-range}", \ org.apache.batik.dom.svg12;version="${batik-svg-dom-version-range}", \ org.apache.batik.dom.svg;version="${batik-svg-dom-version-range}", \ org.apache.batik.dom.util;version="${batik-dom-version-range}", \ org.apache.batik.dom.xbl;version="${batik-dom-version-range}", \ org.apache.batik.dom;version="${batik-dom-version-range}", \ org.apache.batik.ext.awt.color;version="${batik-awt-util-version-range}", \ org.apache.batik.ext.awt.geom;version="${batik-awt-util-version-range}", \ org.apache.batik.ext.awt.image.renderable;version="${batik-awt-util-version-range}", \ org.apache.batik.ext.awt.image.spi;version="${batik-awt-util-version-range}", \ org.apache.batik.ext.awt.image;version="${batik-awt-util-version-range}", \ org.apache.batik.ext.awt;version="${batik-awt-util-version-range}", \ org.apache.batik.gvt.event;version="${batik-gvt-version-range}", \ org.apache.batik.gvt.filter;version="${batik-gvt-version-range}", \ org.apache.batik.gvt.flow;version="${batik-gvt-version-range}", \ org.apache.batik.gvt.font;version="${batik-gvt-version-range}", \ org.apache.batik.gvt.renderer;version="${batik-gvt-version-range}", \ org.apache.batik.gvt.text;version="${batik-gvt-version-range}", \ org.apache.batik.gvt;version="${batik-gvt-version-range}", \ org.apache.batik.i18n;version="${batik-i18n-version-range}", \ org.apache.batik.parser;version="${batik-parser-version-range}", \ org.apache.batik.script.rhino;version="${batik-script-version-range}", \ org.apache.batik.script;version="${batik-script-version-range}", \ org.apache.batik.xml;version="${batik-xml-version-range}", \ org.apache.xml.utils;version="${xalan-version}", \ org.apache.xmlgraphics.java2d.color.profile;version="${xmlgraphics-commons-version}", \ org.apache.xmlgraphics.java2d.color;version="${xmlgraphics-commons-version}", \ org.apache.xpath.objects;version="${xalan-version}", \ org.apache.xpath;version="${xalan-version}", \ org.mozilla.javascript;resolution:=optional, \ org.w3c.dom.svg;version="1.1", \ org.w3c.dom.xpath, \ org.w3c.dom.smil, \ org.w3c.dom.css, \ *;resolution:=optional ###################### However, listing the imports in the built jar file, taken from Orbit [2], shows: ###################### :~$ bnd print -i /tmp/org.apache.batik.bridge_1.9.1.v20190730-1743.jar [IMPEXP] Import-Package javax.swing.event {resolution:=optional} javax.xml.transform {resolution:=optional} org.apache.batik.anim {version=[1.9.1,1.9.2)} org.apache.batik.anim.dom {version=[1.9.1,1.9.2)} org.apache.batik.anim.timing {version=[1.9.1,1.9.2)} org.apache.batik.anim.values {version=[1.9.1,1.9.2)} org.apache.batik.css.engine {version=[1.9.1,1.9.2)} org.apache.batik.css.engine.value {version=[1.9.1,1.9.2)} org.apache.batik.css.engine.value.svg {version=[1.9.1,1.9.2)} org.apache.batik.css.engine.value.svg12 {version=[1.9.1,1.9.2)} org.apache.batik.dom {version=[1.9.1,1.9.2)} org.apache.batik.dom.events {version=[1.9.1,1.9.2)} org.apache.batik.dom.svg {version=[1.9.1,1.9.2)} org.apache.batik.dom.svg12 {version=[1.9.1,1.9.2)} org.apache.batik.dom.util {version=[1.9.1,1.9.2)} org.apache.batik.dom.xbl {version=[1.9.1,1.9.2)} org.apache.batik.ext.awt {version=[1.9.1,1.9.2)} org.apache.batik.ext.awt.color {version=[1.9.1,1.9.2)} org.apache.batik.ext.awt.geom {version=[1.9.1,1.9.2)} org.apache.batik.ext.awt.image {version=[1.9.1,1.9.2)} org.apache.batik.ext.awt.image.renderable {version=[1.9.1,1.9.2)} org.apache.batik.ext.awt.image.spi {version=[1.9.1,1.9.2)} org.apache.batik.gvt {version=[1.9.1,1.9.2)} org.apache.batik.gvt.event {version=[1.9.1,1.9.2)} org.apache.batik.gvt.filter {version=[1.9.1,1.9.2)} org.apache.batik.gvt.flow {version=[1.9.1,1.9.2)} org.apache.batik.gvt.font {version=[1.9.1,1.9.2)} org.apache.batik.gvt.renderer {version=[1.9.1,1.9.2)} org.apache.batik.gvt.text {version=[1.9.1,1.9.2)} org.apache.batik.i18n {version=[1.9.1,1.9.2)} org.apache.batik.parser {version=[1.9.1,1.9.2)} org.apache.batik.script {version=[1.9.1,1.9.2)} org.apache.batik.script.rhino {version=[1.9.1,1.9.2)} org.apache.batik.util {resolution:=optional} org.apache.batik.util.io {resolution:=optional} org.apache.batik.xml {version=[1.9.1,1.9.2)} org.apache.xml.utils {version=2.7.1} org.apache.xmlgraphics.java2d.color {version=2.2.0} org.apache.xmlgraphics.java2d.color.profile {version=2.2.0} org.apache.xpath {version=2.7.1} org.apache.xpath.objects {version=2.7.1} org.mozilla.javascript {resolution:=optional} org.w3c.dom.css org.w3c.dom.events {resolution:=optional} org.w3c.dom.smil org.w3c.dom.svg {version=1.1} org.w3c.dom.views {resolution:=optional} org.w3c.dom.xpath ###################### [1] The 'osgi.bnd' file building org.apache.batik.bridge: https://git.eclipse.org/c/orbit/orbit-recipes.git/tree/apache/batik/org.apache.batik.bridge_1.9.1/osgi.bnd#n39 [2] https://download.eclipse.org/tools/orbit/downloads/drops/R20200224183213/
Also note that this is a problem for packages defined in the bundle itself, e.g. :~$ bnd print -i /tmp/org.apache.batik.util.gui_1.9.1.v20190730-1743.jar [IMPEXP] Import-Package javax.swing {resolution:=optional} javax.swing.border {resolution:=optional} javax.swing.event {resolution:=optional} javax.swing.filechooser {resolution:=optional} javax.swing.plaf {resolution:=optional} javax.swing.plaf.basic {resolution:=optional} javax.swing.text {resolution:=optional} javax.swing.undo {resolution:=optional} org.apache.batik.util.gui.resource {resolution:=optional, version=[1.9,2)} org.apache.batik.util.resources {resolution:=optional} org.apache.batik.xml {version=[1.9.1,1.9.2)} Export-Package org.apache.batik.util.gui {version=1.9.1} org.apache.batik.util.gui.resource {version=1.9.1, imported-as=[1.9,2)} org.apache.batik.util.gui.resources {version=1.9.1} org.apache.batik.util.gui.resources.flags {version=1.9.1} org.apache.batik.util.gui.xmleditor {version=1.9.1} Note, it imports packages from the bundle itself (org.apache.batik.util.resources). This is a problem since Eclipse's BundleLoader will first load classes via 'Import-Packages', then 'Require-Bundle' and then the local bundle itself [1]. [1] https://git.eclipse.org/c/equinox/rt.equinox.framework.git/tree/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/loader/BundleLoader.java#n459 (The steps 1-5 documented in the comments are actually useful..)