【问题标题】:Apache POI and Weblogic JAR conflict- POI 5 and xmlbeansApache POI 和 Weblogic JAR 冲突 - POI 5 和 xmlbeans
【发布时间】:2023-02-18 04:59:44
【问题描述】:

我目前正在尝试使用 apache POI 在 java 中制作 excel 文件,确切地说是 SXSSF。但是,在运行它时,出现以下错误:

Caused By: java.lang.ExceptionInInitializerError
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:348)
        at org.apache.xmlbeans.impl.schema.SchemaTypeLoaderImpl.build(SchemaTypeLoaderImpl.java:161)
        at org.apache.xmlbeans.impl.schema.SchemaTypeSystemImpl.<init>(SchemaTypeSystemImpl.java:198)
        at org.apache.xmlbeans.metadata.system.sXMLSCHEMA.TypeSystemHolder.<init>(TypeSystemHolder.java:9)
        Truncated. see log file for complete stacktrace
Caused By: org.apache.xmlbeans.XmlRuntimeException: java.lang.ClassCastException: org.apache.xmlbeans.impl.schema.SchemaTypeSystemImpl cannot be cast to org.apache.xmlbeans.SchemaTypeLoader
        at org.apache.xmlbeans.impl.schema.SchemaTypeLoaderImpl.build(SchemaTypeLoaderImpl.java:164)
        at org.apache.xmlbeans.impl.schema.SchemaTypeSystemImpl.<init>(SchemaTypeSystemImpl.java:198)
        at org.apache.xmlbeans.metadata.system.sXMLTOOLS.TypeSystemHolder.<init>(TypeSystemHolder.java:9)
        at org.apache.xmlbeans.metadata.system.sXMLTOOLS.TypeSystemHolder.<clinit>(TypeSystemHolder.java:6)
        at java.lang.Class.forName0(Native Method)
        Truncated. see log file for complete stacktrace
Caused By: java.lang.ClassCastException: org.apache.xmlbeans.impl.schema.SchemaTypeSystemImpl cannot be cast to org.apache.xmlbeans.SchemaTypeLoader
        at org.apache.xmlbeans.impl.schema.SchemaTypeLoaderImpl.build(SchemaTypeLoaderImpl.java:162)
        at org.apache.xmlbeans.impl.schema.SchemaTypeSystemImpl.<init>(SchemaTypeSystemImpl.java:198)
        at org.apache.xmlbeans.metadata.system.sXMLTOOLS.TypeSystemHolder.<init>(TypeSystemHolder.java:9)
        at org.apache.xmlbeans.metadata.system.sXMLTOOLS.TypeSystemHolder.<clinit>(TypeSystemHolder.java:6)
        at java.lang.Class.forName0(Native Method)
        Truncated. see log file for complete stacktrace

现在,我知道出现了与此类似的问题,通常的解决方法是更改​​ weblogic.xml,然后

<prefer-web-inf-classes>false</prefer-web-inf-classes>

<wls:container-descriptor>
        <wls:prefer-application-packages>
            <wls:package-name>org.apache.commons.collections4.*</wls:package-name>
            <wls:package-name>org.apache.commons.compress.*</wls:package-name>
            <wls:package-name>org.apache.poi.*</wls:package-name>
            <wls:package-name>org.apache.xmlbeans.*</wls:package-name>
            <wls:package-name>org.apache.xmlbeans.XmlOptions</wls:package-name>
            <wls:package-name>org.openxmlformats.*</wls:package-name>
            <wls:package-name>schemaorg_apache_xmlbeans.*</wls:package-name>
        </wls:prefer-application-packages>
        <wls:prefer-application-resources>
            <wls:resource-name>schemaorg_apache_xmlbeans/system/sXMLCONFIG/TypeSystemHolder.class</wls:resource-name>
            <wls:resource-name>schemaorg_apache_xmlbeans/system/sXMLLANG/TypeSystemHolder.class</wls:resource-name>
            <wls:resource-name>schemaorg_apache_xmlbeans/system/sXMLSCHEMA/TypeSystemHolder.class</wls:resource-name>
            <wls:resource-name>schemaorg_apache_xmlbeans/system/sXMLTOOLS/TypeSystemHolder.class</wls:resource-name>
        </wls:prefer-application-resources>
    </wls:container-descriptor>
 

但是,出现的问题是将 prefer-web-inf-classes 设置为 false 会破坏应用程序的其余部分。所以我的问题是,在我创建 excel 的文件中是否有一种方法可以指定我希望它是从 apache xmlbeans 而不是 weblogic xmlbeans 构建的?我在想类似 Classloader/Urlloader 的东西,但我还不能使它正常工作,但我可能实施错了。

最后,我将包括我的 pom.xml 文件

 <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>${org.apache.poi-version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.16.0</version>
        </dependency>

        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>${org.apache.commons-commons-codec-version}</version>
            <exclusions>
                <exclusion>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>${org.apache.commons-commons-lang3-version}</version>
        </dependency>

        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>org.eclipse.persistence.core</artifactId>
            <version>${org.eclipse.persistence-core-version}</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>com.googlecode.json-simple</groupId>
            <artifactId>json-simple</artifactId>
            <version>1.1.1</version>
        </dependency>

        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.10.14</version>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
            <version>1.9.3</version>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-to-slf4j</artifactId>
            <version>2.8.2</version>
        </dependency>
    </dependencies>
</project>

【问题讨论】:

  • 你可能会看看组件图引用here。
  • schemaorg_apache_xmlbeans/system... 是 XmlBeans 5 之前元数据的位置。所以这就是说:采用版本 5 的类,但查找 weblogic 附带的旧 XmlBeans (/POI) 的元数据。如果你删除这 4 行会发生什么?
  • 似乎删除这 4 行并没有太大变化。将 weblogic.xml 保留为 <prefer-web-inf-classes>false</prefer-web-inf-classes> 会得到相同的结果
  • @bgarrett315 你能克服这个吗?

标签: java apache-poi weblogic xmlbeans


【解决方案1】:

更具体地说,在我的例子中,我已将以下代码添加到 weblogic-application.xml 以修复异常 - java.lang.ClassCastException: org.apache.xmlbeans.impl.schema.SchemaTypeSystemImpl cannot be cast to org.apache。 xmlbeans.SchemaTypeLoader

<weblogic-application>
    <prefer-application-packages>
        <package-name>org.apache.*</package-name>
        <package-name>schemaorg_apache_xmlbeans.*</package-name>
    </prefer-application-packages>
    <prefer-application-resources>
        <resource-name>schemaorg_apache_xmlbeans/*</resource-name>
    </prefer-application-resources>
</weblogic-application>

【讨论】:

    猜你喜欢
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    相关资源
    最近更新 更多