解析方法“javax/imageio/metadata/IIOMetadata.getAsTree(Ljava/lang/String;)Lorg/w3c/dom/Node

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

我正在 Websphere ND 9.0.5.13 上使用 Apahce Pdfbox 2.0.30,该版本在 Java 8 上运行 应用程序类加载器设置为Parent Last

我的POM文件如下:

<dependencies>
    
   <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
            <exclusion>
                <artifactId>logback-classic</artifactId>
                <groupId>ch.qos.logback</groupId>
            </exclusion>
            <exclusion>
                <artifactId>log4j-to-slf4j</artifactId>
                <groupId>org.slf4j</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>
    

    
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
    
    <dependency>
        <groupId>xerces</groupId>
        <artifactId>xercesImpl</artifactId>
        <version>2.11.0</version>
    </dependency>
    
    
    
    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-data-jdbc</artifactId>
    </dependency>
    
    <dependency>
        <groupId>org.springdoc</groupId>
        <artifactId>springdoc-openapi-ui</artifactId>
        <version>${springdoc.version}</version>
    </dependency>
    

    <dependency>
        <groupId>com.microsoft.sqlserver</groupId>
        <artifactId>mssql-jdbc</artifactId>
        <scope>runtime</scope>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
    </dependency>

    
    <dependency>
        <groupId>com.oracle.jdbc</groupId>
        <artifactId>ojdbc14</artifactId>
        <version>1.4</version>
    </dependency>


    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
    </dependency>
    
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
    </dependency>
    
    <dependency>
        <groupId>net.sf.flexjson</groupId>
        <artifactId>flexjson</artifactId>
        <version>3.3</version>
    </dependency>
    
    <dependency>
        <groupId>javax.jws</groupId>
        <artifactId>javax.jws-api</artifactId>
        <version>1.1</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    
    <dependency>
        <groupId>javax.activation</groupId>
        <artifactId>javax.activation-api</artifactId>
    </dependency>


    
    <dependency>
        <groupId>com.sun.mail</groupId>
        <artifactId>javax.mail</artifactId>
        <version>1.6.2</version>
    </dependency>
    
    
    <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcprov-jdk15</artifactId>
        <version>1.46</version>
    </dependency>



    
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.11.0</version>
    </dependency>
    
    <dependency>
        <groupId>com.github.mlaccetti</groupId>
        <artifactId>javapns</artifactId>
        <version>2.3.2</version>
    </dependency>
    
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itextpdf</artifactId>
        <version>5.5.6</version>
    </dependency>
    
    <dependency>
        <groupId>org.apache.xmlgraphics</groupId>
        <artifactId>xmlgraphics-commons</artifactId>
        <version>1.5</version>
    </dependency>
    
    <dependency>
        <groupId>org.apache.xmlbeans</groupId>
        <artifactId>xmlbeans</artifactId>
        <version>3.0.1</version>
    </dependency>
    
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>4.0.0</version>
    </dependency>
    
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml-schemas</artifactId>
        <version>4.0.0</version>
    </dependency>
            
    <dependency>
        <groupId>net.sf.jasperreports</groupId>
        <artifactId>jasperreports</artifactId>
        <version>6.11.0</version>
    </dependency>
    
    <!-- 
    <dependency>
        <groupId>net.sf.jasperreports</groupId>
        <artifactId>jasperreports-fonts</artifactId>
        <version>6.11.0</version>
    </dependency>
    -->
    
    
    <dependency>
        <groupId>jasperreports-fonts</groupId>
        <artifactId>jasperreports-fonts</artifactId>
        <version>0.6.11.0</version>
    </dependency>
    

    <dependency>
        <groupId>com.lowagie</groupId>
        <artifactId>itext</artifactId>
        <version>2.1.7</version>
    </dependency>
    
    <dependency>
        <groupId>net.sf.barcode4j</groupId>
        <artifactId>barcode4j</artifactId>
        <version>2.1</version>
    </dependency>
    
    <dependency>
        <groupId>org.apache.xmlgraphics</groupId>
        <artifactId>batik-all</artifactId>
        <version>1.11</version>
        <type>pom</type>
    </dependency>
    
    <dependency>
        <groupId>com.google.zxing</groupId>
        <artifactId>core</artifactId>
        <version>2.2</version>
    </dependency>
    
    <dependency>
        <groupId>com.google.zxing</groupId>
        <artifactId>javase</artifactId>
        <version>2.2</version>
    </dependency>

    <dependency>
        <groupId>javax.xml</groupId>
        <artifactId>jaxrpc-api</artifactId>
        <version>1.1</version>
    </dependency>
    
    <dependency>
        <groupId>axis</groupId>
        <artifactId>axis</artifactId>
        <version>1.3</version>
    </dependency>
    
    <dependency>
        <groupId>com.ibm.websphere.appserver.api</groupId>
        <artifactId>com.ibm.websphere.appserver.api.json</artifactId>
        <version>1.0.22</version>
    </dependency>
    
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-core-asl</artifactId>
        <version>1.9.13</version>
    </dependency>

    
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.13</version>
    </dependency>

    
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>4.0.0</version>
    </dependency>

    
    <dependency>
        <groupId>com.itextpdf.tool</groupId>
        <artifactId>xmlworker</artifactId>
        <version>5.5.7</version>
    </dependency>

    
    <dependency>
        <groupId>commons-lang</groupId>
        <artifactId>commons-lang</artifactId>
        <version>2.6</version>
    </dependency>
    
    <dependency>
        <groupId>org.apache.pdfbox</groupId>
        <artifactId>pdfbox</artifactId>
        <!-- <version>2.0.25</version> -->
        <version>2.0.30</version>
    </dependency>
    
    <dependency>
        <groupId>com.google.gcm</groupId>
        <artifactId>gcm-server</artifactId>
        <version>1.0.0</version>
    </dependency>
    
    <dependency>
        <groupId>org.quartz-scheduler</groupId>
        <artifactId>quartz</artifactId>
    </dependency>
    
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.30</version>
        <scope>provided</scope>
    </dependency>
    
    <dependency>
        <groupId>com.ibm.filenet</groupId>
        <artifactId>filenet-jace</artifactId>
        <version>1.0</version>
    </dependency>

    <dependency>
        <groupId>com.ibm.filenet</groupId>
        <artifactId>filenet-pe</artifactId>
        <version>1.0</version>
    </dependency>

    <dependency>
        <groupId>com.ibm.filenet</groupId>
        <artifactId>filenet-pe-resources</artifactId>
        <version>1.0</version>
    </dependency>
    
    <dependency>
        <groupId>com.ibm.filenet</groupId>
        <artifactId>filenet-java-api</artifactId>
        <version>1.0</version>
    </dependency>

    <dependency>
        <groupId>com.ibm.applicationservices</groupId>
        <artifactId>application.services</artifactId>
        <version>1.0</version>
    </dependency>

    
    
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>log4j-over-slf4j</artifactId>
    </dependency>
    
</dependencies>

当尝试获取缓冲图像时,如下所示:

public BufferedImage generateJasperReportPDF(JasperPrint jasperPrint, String fontName, String fontPath)
            throws IOException {
        JRPdfExporter exporter = new JRPdfExporter();
        BufferedImage bimage = null;
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        PDDocument document = null;
        try {


            exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
            exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, outputStream);
            exporter.exportReport();

            document = PDDocument.load(outputStream.toByteArray());
            PDFRenderer renderer = new PDFRenderer(document);
            bimage = renderer.renderImageWithDPI(0, 300, ImageType.RGB);

        } catch (Exception e) {
            log.error("Exception in generateJasperReportPDF: ", e);
        } finally {
            if (outputStream != null)
                outputStream.close();
            if (document != null)
                document.close();
        }
        return bimage;
    }

执行以下行时出现以下异常:

bimage = renderer.renderImageWithDPI(0, 300, ImageType.RGB);

例外是:

Caused by: java.lang.LinkageError: loading constraint violation when resolving method "javax/imageio/metadata/IIOMetadata.getAsTree(Ljava/lang/String;)Lorg/w3c/dom/Node;" : loader "com/ibm/ws/classloader/CompoundClassLoader@a24fe2b5" of class "org/apache/pdfbox/filter/DCTFilter" and loader "com/ibm/oti/vm/BootstrapClassLoader@9e7c1335" of class "javax/imageio/metadata/IIOMetadata" have different types for the method signature
    at org.apache.pdfbox.filter.DCTFilter.getNumChannels(DCTFilter.java:387) ~[pdfbox-2.0.30.jar:2.0.30]
    at org.apache.pdfbox.filter.DCTFilter.decode(DCTFilter.java:95) ~[pdfbox-2.0.30.jar:2.0.30]
    at org.apache.pdfbox.cos.COSInputStream.create(COSInputStream.java:87) ~[pdfbox-2.0.30.jar:2.0.30]
    at org.apache.pdfbox.cos.COSStream.createInputStream(COSStream.java:175) ~[pdfbox-2.0.30.jar:2.0.30]
    at org.apache.pdfbox.pdmodel.common.PDStream.createInputStream(PDStream.java:243) ~[pdfbox-2.0.30.jar:2.0.30]
    at org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject.createInputStream(PDImageXObject.java:901) ~[pdfbox-2.0.30.jar:2.0.30]
    at org.apache.pdfbox.pdmodel.graphics.image.SampledImageReader.from8bit(SampledImageReader.java:507) ~[pdfbox-2.0.30.jar:2.0.30]
    at org.apache.pdfbox.pdmodel.graphics.image.SampledImageReader.getRGBImage(SampledImageReader.java:226) ~[pdfbox-2.0.30.jar:2.0.30]
    at org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject.getImage(PDImageXObject.java:514) ~[pdfbox-2.0.30.jar:2.0.30]
    at org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject.getImage(PDImageXObject.java:477) ~[pdfbox-2.0.30.jar:2.0.30]
    at org.apache.pdfbox.rendering.PageDrawer.drawImage(PageDrawer.java:1116) ~[pdfbox-2.0.30.jar:2.0.30]
    at org.apache.pdfbox.contentstream.operator.graphics.DrawObject.process(DrawObject.java:67) ~[pdfbox-2.0.30.jar:2.0.30]
    at org.apache.pdfbox.contentstream.PDFStreamEngine.processOperator(PDFStreamEngine.java:958) ~[pdfbox-2.0.30.jar:2.0.30]
    at org.apache.pdfbox.contentstream.PDFStreamEngine.processStreamOperators(PDFStreamEngine.java:531) ~[pdfbox-2.0.30.jar:2.0.30]
    at org.apache.pdfbox.contentstream.PDFStreamEngine.processStream(PDFStreamEngine.java:506) ~[pdfbox-2.0.30.jar:2.0.30]
    at org.apache.pdfbox.contentstream.PDFStreamEngine.processPage(PDFStreamEngine.java:150) ~[pdfbox-2.0.30.jar:2.0.30]
    at org.apache.pdfbox.rendering.PageDrawer.drawPage(PageDrawer.java:288) ~[pdfbox-2.0.30.jar:2.0.30]
    at org.apache.pdfbox.rendering.PDFRenderer.renderImage(PDFRenderer.java:355) ~[pdfbox-2.0.30.jar:2.0.30]
    at org.apache.pdfbox.rendering.PDFRenderer.renderImage(PDFRenderer.java:272) ~[pdfbox-2.0.30.jar:2.0.30]
    at org.apache.pdfbox.rendering.PDFRenderer.renderImageWithDPI(PDFRenderer.java:258) ~[pdfbox-2.0.30.jar:2.0.30]

更新: 在检查 Websphere 类加载器查看器时,我发现 IIOMetadata 类仅存在一次

 <class>
      <name>javax.imageio.metadata.IIOMetadata</name>
      <interface>false</interface>
   </class>
  • 类加载器顺序如下:

java websphere classloader pdfbox
1个回答
0
投票

问题几乎肯定是方法签名 org/w3c/dom/Node.js 中提到的 DOM 类的重复可见性。鉴于问题的描述和异常文本中的详细信息,我相信正在发生以下模式:

  1. DCTFilter 类是从父级最后一个应用程序类加载器加载的。它引用 IIOMetadata 并可能调用该类的 getAsTree() 方法,这意味着它还必须引用 Node。
  2. 加载依赖项时,使用DCTFilter的类加载器来加载它们。 ImageIO 库未打包在应用程序中(请确认它们仅加载一次),而是由系统类加载器找到。 DOM 类大概是封装在应用程序中的,因此可以在应用程序中找到 Node。
  3. 当链接 IIOMetadata 类并加载其依赖项时,会在 JDK 本地找到 XML 类,因此会在那里找到第二个 Node 实例。
  4. DCTFilter 现在可以查看 org/w3c/dom/Node 的两个不同版本 - 直接查看应用程序中的副本,并通过 IIOMetadata 间接查看 JDK 中的副本。这是非法的,并且会抛出 LinkageError。

最简单的解决方案是从应用程序中删除 XML 库 - JAXP 早已包含在 JDK 中,并且应用程序基本上没有理由需要引入自己的 API 版本。删除包含 DOM 类的 jar 应该可以解决该特定错误。

一个更大的问题可能是为什么您首先要使用父级最后一个类加载器委托。虽然某些应用程序打包设置支持它,但它基本上是导致出现此类错误的唯一方法,通常应用程序最好使用 Java EE 的服务器副本(在本例中为 SE) API 比它试图带来自己的更多。除非您有特定的技术原因使用该配置,否则最好的解决方案可能是将类加载器委托切换回默认值。

© www.soinside.com 2019 - 2024. All rights reserved.