当前位置: 首页 > 知识库问答 >
问题:

无法在 JBoss 7 中使用文档 x4j

陶沛
2023-03-14

我成功地使用docx4j(http://www.docx4java.org)创建了一个简单的项目。这个简单的项目成功地创建并写入了. docx文档。现在我正试图在一个更大的项目中完成同样的事情。这个更大的项目是在JBoss AS 7.1中运行的webapp。然而,在我的第一行docx4j相关代码中:

WordprocessingMLPackage wmlp = WordprocessingMLPackage.createPackage();

它遇到一个错误:

java.lang.NoClassDefFoundError: Could not initialize class org.docx4j.jaxb.Context
    at org.docx4j.openpackaging.parts.JaxbXmlPart.<init>(JaxbXmlPart.java:79) [docx4j-2.8.1.jar:]
    at org.docx4j.openpackaging.parts.JaxbXmlPartXPathAware.<init>(JaxbXmlPartXPathAware.java:64) [docx4j-2.8.1.jar:]
    at org.docx4j.openpackaging.parts.WordprocessingML.DocumentPart.<init>(DocumentPart.java:157) [docx4j-2.8.1.jar:]
    at org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart.<init>(MainDocumentPart.java:76) [docx4j-2.8.1.jar:]
    at org.docx4j.openpackaging.packages.WordprocessingMLPackage.createPackage(WordprocessingMLPackage.java:432) [docx4j-2.8.1.jar:]
    at org.docx4j.openpackaging.packages.WordprocessingMLPackage.createPackage(WordprocessingMLPackage.java:421) [docx4j-2.8.1.jar:]
    at foo.servlets.bar.DocxServlet.doGet(DocxServlet.java:101) [classes:]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:734) [jboss-servlet-api_3.0_spec-1.0.0.Final.jar:1.0.0.Final]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [jboss-servlet-api_3.0_spec-1.0.0.Final.jar:1.0.0.Final]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:]
    at foo.includes.other.ServletNameSetFilter.doFilter(ServletNameSetFilter.java:83) [fooClasses.jar:]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:]
    at foo.includes.other.HtmlEscapeFilter.doFilter(HtmlEscapeFilter.java:67) [fooClasses.jar:]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:]
    at foo.includes.other.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:64) [fooClasses.jar:]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.13.Final.jar:]
    at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50) [jboss-as-jpa-7.1.1.Final.jar:7.1.1.Final]
    at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368) [jbossweb-7.0.13.Final.jar:]
    at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:505) [jbossweb-7.0.13.Final.jar:]
    at org.apache.coyote.ajp.AjpProtocol$AjpConnectionHandler.process(AjpProtocol.java:445) [jbossweb-7.0.13.Final.jar:]
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930) [jbossweb-7.0.13.Final.jar:]
    at java.lang.Thread.run(Thread.java:636) [rt.jar:1.6.0_20]

此外,当我在不重建EAR的情况下停止并重新启动服务器时,此错误不会显示,而是从同一方法调用(createPackage())中获得NoSuchElementException:

我相信这与 JBoss 有自己的 JAXB 实现这一事实有关,但是 JAXB 上下文是在 docx4j 库中初始化的。下面是代码(来自 http://www.docx4java.org/trac/docx4j/browser/trunk/docx4j/src/main/java/org/docx4j/jaxb/Context.java):

jc = JAXBContext.newInstance("org.docx4j.wml:" +
                "org.docx4j.dml:org.docx4j.dml.chart:org.docx4j.dml.chartDrawing:org.docx4j.dml.compatibility:org.docx4j.dml.diagram:org.docx4j.dml.lockedCanvas:org.docx4j.dml.picture:org.docx4j.dml.wordprocessingDrawing:org.docx4j.dml.spreadsheetdrawing:org.docx4j.dml.diagram2008:" +
                // All VML stuff is here, since compiling it requires WML and DML (and MathML), but not PML or SML
                "org.docx4j.vml:org.docx4j.vml.officedrawing:org.docx4j.vml.wordprocessingDrawing:org.docx4j.vml.presentationDrawing:org.docx4j.vml.spreadsheetDrawing:org.docx4j.vml.root:" +
                "org.opendope.xpaths:org.opendope.conditions:org.opendope.questions:org.opendope.components:org.opendope.SmartArt.dataHierarchy:" +
                "org.docx4j.math:" +
                "org.docx4j.sharedtypes:org.docx4j.bibliography",classLoader );
log.info("loaded " + jc.getClass().getName() + " .. loading others ..");

jcThemePart = jc; //JAXBContext.newInstance("org.docx4j.dml",classLoader );
jcDocPropsCore = JAXBContext.newInstance("org.docx4j.docProps.core:org.docx4j.docProps.core.dc.elements:org.docx4j.docProps.core.dc.terms",classLoader );
jcDocPropsCustom = JAXBContext.newInstance("org.docx4j.docProps.custom",classLoader );
jcDocPropsExtended = JAXBContext.newInstance("org.docx4j.docProps.extended",classLoader );
jcXmlPackage = JAXBContext.newInstance("org.docx4j.xmlPackage",classLoader );
jcRelationships = JAXBContext.newInstance("org.docx4j.relationships",classLoader );
jcCustomXmlProperties = JAXBContext.newInstance("org.docx4j.customXmlProperties",classLoader );
jcContentTypes = JAXBContext.newInstance("org.docx4j.openpackaging.contenttype",classLoader );

jcSectionModel = JAXBContext.newInstance("org.docx4j.model.structure.jaxb",classLoader );

jcXmlDSig = JAXBContext.newInstance("org.plutext.jaxb.xmldsig",classLoader );

从我观察到的情况来看,我似乎需要放一个jaxb。属性文件,指定在上面每个JAXBContext实例中列出的每个包中使用哪个jaxb实现。这是正确的吗?我有什么遗漏吗?

共有3个答案

曾永新
2023-03-14

我假设您使用的是Java 7。我能够通过运行JBoss EAP 6.2来解决这个问题

java version "1.7.0_55"
OpenJDK Runtime Environment (IcedTea 2.4.7) (7u55-2.4.7-1ubuntu1~0.13.10.1)
OpenJDK 64-Bit Server VM (build 24.51-b03, mixed mode)

>

  • 定义以下JBoss模块:

    <!-- module.xml content -->
    <module xmlns="urn:jboss:module:1.1" name="org.docx4j-compat">
        <dependencies>
            <module name="sun.jdk"/>
            <system export="true">
                <paths>
                    <path name="com/sun/xml/internal/bind/marshaller"/>
                </paths>
            </system>
        </dependencies>
    </module>
    

    将对该模块的依赖添加到您的WEB-INF/jboss-deployment-structure.xml.

  • 邓德惠
    2023-03-14

    JBoss AS7有一个与以前版本不同的类加载机制。一般参见https://docs.jboss.org/author/display/AS71/Class在AS7中加载

    它包含一个名为javax.xml.bind的模块。应用程序编程接口;要让docx4j在WAR中工作,只需要包含WEB-INF/jboss部署结构。xml包含:

    <deployment>
        <dependencies>
    
            <module name="com.sun.xml.bind" />
    
        </dependencies>
    </deployment>
    

    详细信息/讨论

    modules\javax\xml\bind\api\main表示:

    <dependencies>
        <module name="javax.activation.api" export="true"/>
        <module name="javax.xml.stream.api"/>
        <module name="com.sun.xml.bind" services="import"/>
        <module name="javax.api"/>
    </dependencies>
    
    <resources>
        <resource-root path="jboss-jaxb-api_2.2_spec-1.0.3.Final.jar"/>
        <!-- Insert resources here -->
    </resources>
    

    modules\com\sun\xml\bind\main说:

    <resources>
        <resource-root path="jaxb-impl-2.2.4.jar"/>
        <resource-root path="jaxb-xjc-2.2.4.jar"/>
        <!-- Insert resources here -->
    </resources>
    
    <dependencies>
        <module name="javax.api" />
        <module name="javax.xml.bind.api" />
        <module name="javax.xml.stream.api" />
    </dependencies>
    

    因此,您可能认为以下方法也适用:

    <deployment>
        <dependencies>
    
            <module name="javax.xml.bind.api" />
    
        </dependencies>
    </deployment>
    

    但似乎没有,也许是因为被赋予了效果?

    云胤
    2023-03-14

    在 Maven pom 中.xml放置这些缺少的依赖项,问题就解决了(在 JBoss 7.1.3 上)

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.6.1</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <version>2.2.7</version>
    </dependency>
    <dependency>
        <groupId>com.googlecode.jaxb-namespaceprefixmapper-interfaces</groupId>
        <artifactId>JAXBNamespacePrefixMapper</artifactId>
        <version>2.2.4</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>xerces</groupId>
        <artifactId>xercesImpl</artifactId>
        <version>2.11.0</version>
    </dependency>
    
     类似资料:
    • 我在JBoss7.x中配置了datasource,如下所示: 然后,在我的spring应用程序中,我使用下面的代码来查找数据源: 我错过什么了吗?

    • 问题内容: 现在已经苦了两天,只是不能删除文件 在这里,我将放置将进行测试的代码,希望有人可以指出我做错了的事情,以及已经尝试过的事情: 将Lucene版本从更新为 使用代替 特林的配置为或 这里的代码: 首先将在中生成索引,并 显示将成功查询该索引,然后希望删除该文档,但再次将证明删除操作失败。 这是pom依赖关系,以防有人可能需要测试 渴望得到答案。 问题答案: 您的问题出在分析仪中。将标记定

    • StackExchange.Redis 是 Stackoverflow 开发的 Redis C# 客户端,是目前.net应用使用的最多的 redis 客户端,性能优越。 Redis 简介 Redis 是一个使用 ANSI C 编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库。 从2015年6月开始,Redis 的开发由 Redis Labs 赞助,而2013年5月至2015年6月期间,

    • 我试图根据文档ID查询文档,但我无法使用 AFS是AngularFiRecovery类型 我不知道上面的代码是否正确。 我尝试了在中提到的解决方案:通过将ref.id替换为firebase来查询firestore数据库中的文档id。firestore。FieldPath。documentId(),但我收到一个错误: “Firebase”是指UMD全局,但当前文件是一个模块。 帮助我检索数据。

    • 我得到了错误,而解压缩zip文件使用unArchive模块在我的anable playbook……它工作正常,有时我得到下面的错误 失败了!= 我使用下面的脚本代码来执行取消存档 有什么需要纠正的吗,我浏览了可调整的文档.....我希望我在正确的代码上,但仍然得到错误...请任何建议

    • 我试图跟踪文档中特定字段的更改。这是我的用户类。我想用Javers记录count中的任何变化。 我添加了以下代码来跟踪何时创建新的用户对象。 这是使用MongoTemplate的updateCount方法: 现在我想跟踪的是在updateCount方法调用结束时提交某种更改。但是除非我有一个实体对象,否则这些更改无法提交。我该怎么做?