与 batik-transcoder 和 java 17 的依赖冲突

问题描述 投票:0回答:1

我正在尝试使用 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 svg dependencies javax.imageio batik
1个回答
0
投票

与 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;
© www.soinside.com 2019 - 2024. All rights reserved.