我在Websphere ND 9.0.5.13上使用的是Apahce Pdfbox 2.0.30,它在Java 8上运行 应用程序class loader被设置为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>

并且当try 获得缓冲图像时,如下所示:

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]

UPDATE:在判断Websphere类加载器查看器时,我发现类IIOMetadata只存在一次

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

enter image description here

推荐答案

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

  1. DCTFilter类是从父级的最后一个应用程序类加载器加载的.它引用IIOMetadata并可能调用该类上的getAsTree()方法,这意味着它还必须引用Node.
  2. 加载依赖项时,使用DCTFilter的类加载器加载它们.ImageIO库没有打包在应用程序中(假设您确认它们只加载一次),并且由系统类加载器找到.DOM类大概是打包在应用程序中的,所以Node是在应用程序中找到的.
  3. 当链接IIOMetadata类并加载其依赖项时,会在JDK中本地找到这些XML类,因此会在那里找到Node的第二个实例.
  4. DCTFilter现在可以查看org/w3c/don/Node的两个独立版本--直接访问应用程序中的副本,并通过IIOMetadata间接访问JDK中的副本.这是非法的,并且会引发LinkageError.

最简单的解决方案是从应用程序中删除XML库-JAXP早就包含在JDK中,基本上没有理由让应用程序需要提供其自己版本的API.删除包含DOM类的JAR(S)应该可以解决这个特定的错误.

一个更大的问题可能是,为什么一开始就使用父类加载器委托.虽然某些应用程序打包设置支持它,但它基本上是导致类似错误的唯一方法,而且通常应用程序最好使用服务器的Java EE(在本例中为SE)API的副本,而不是try 使用自己的API.除非您有使用该配置的特定技术原因,否则最好的解决方案可能是将类加载器委托切换回默认设置.

Java相关问答推荐

日食IDE 2024-03在Ubuntu下崩溃,导致hr_err_pid.log

当切换javaFX场景时,stage的大小正在Minimize

Java中不同包中的类之间的配置共享

Cucumber TestNG Assert失败,出现java. lang. Numbercycle异常

工件部署期间出错[Tomcat 8.5.45]

无法在WebSocket onMessage中捕获错误

对Java中的通配符参数的混淆

第三方Jar pom.xml

使用Room Database删除Jetpack合成中的所有项目后,UI未重新合成

Java连接池无法正常工作

Spring Validator批注不起作用

组合连接以从两个表返回数据

Maven-Dependency-Plugin 3.6.+开始查找在依赖关系:分析目标期间找到的新的使用的未声明依赖关系

获取所有可以处理Invent.ACTION_MEDIA_BUTTON Android 13 API33的Android包

接受类及其接口的Java类型(矛盾)

活泼的一次判断成语,结果中等

从字节数组切换到JakartaMail org.springframework.mail.javamail.JavaMailSender InputStreamResource

如何在Java上为循环数组从synchronized迁移到ReentrantLock

如何使用Jackson读取以方括号开头的JSON?

一条Java记录可以保存多少个字段?