我正在尝试使用 DecemberMonkeys 和 Batik 在 Java 中处理 svg 文件。
<!-- https://mvnrepository.com/artifact/com.twelvemonkeys.imageio/imageio-batik -->
<dependency>
<groupId>com.twelvemonkeys.imageio</groupId>
<artifactId>imageio-batik</artifactId>
<version>3.9.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.xmlgraphics/batik-transcoder -->
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-transcoder</artifactId>
<version>1.16</version>
</dependency>
问题是,在我的 pom 中包含这个库会导致以下错误:
The package org.w3c.dom is accessible from more than one module: <unnamed>, java.xml
SAXException cannot be resolved to a type
我已经尝试了以下排除来修复上述错误,但在运行时我现在收到一个 classnotfound 错误:
<!-- https://mvnrepository.com/artifact/org.apache.xmlgraphics/batik-transcoder -->
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-transcoder</artifactId>
<version>1.16</version>
<exclusions>
<exclusion>
<groupId>xml-apis</groupId>
<artifactId>xml-apis-ext</artifactId>
</exclusion>
<exclusion>
<groupId>xml-apis</groupId>
<artifactId>xml-apis</artifactId>
</exclusion>
</exclusions>
</dependency>
[m java.lang.ClassNotFoundException: org.w3c.dom.svg.SVGDocument
at jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) ~[?:?]
at jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) ~[?:?]
at java.lang.ClassLoader.loadClass(ClassLoader.java:520) ~[?:?]
at java.lang.ClassLoader.defineClass1(Native Method) ~[?:?]
at java.lang.ClassLoader.defineClass(ClassLoader.java:1012) ~[?:?]
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150) ~[?:?]
at jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862) ~[?:?]
at jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760) ~[?:?]
at jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681) ~[?:?]
at jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639) ~[?:?]
at jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) ~[?:?]
at java.lang.ClassLoader.loadClass(ClassLoader.java:520) ~[?:?]
at org.apache.batik.anim.dom.SVGDOMImplementation.createDocument(SVGDOMImplementation.java:140) ~[batik-anim-1.16.jar:?]
at org.apache.batik.dom.util.SAXDocumentFactory.startElement(SAXDocumentFactory.java:641) ~[batik-dom-1.16.jar:?]
与 Java 模块化项目中的 Gradle 相同的问题:
implementation 'org.apache.xmlgraphics:batik-transcoder:1.17'
结果
the unnamed module reads package javax.xml from both xml.apis and java.xml
这是正确的,因为 batik-transcoder jar 中的 pom 文件声明了对
xml-apis
的依赖,这会导致冲突。
幸运的是,我们可以告诉依赖解析器不要包含
xml-apis
:
implementation 'org.apache.xmlgraphics:batik-transcoder:1.17', {
exclude group: "xml-apis", module: "xml-apis"
}
但是当我们尝试解析 SVG 图像时遇到了运行时问题:
Caused by: java.lang.ClassNotFoundException: org.w3c.dom.css.DOMImplementationCSS
这又是正确的,因为我们还没有声明我们想要使用
jdk.xml.dom
模块中的代码。这是通过在 module-info.java
: 中声明它来修复的
requires jdk.xml.dom;