【问题标题】:Play Framework: PDF 0.9 module not playing nicely with JavaAPIforKml播放框架:PDF 0.9 模块不能很好地与 JavaAPIforKml 配合使用
【发布时间】:2012-02-24 06:49:10
【问题描述】:

我的 Play 项目目前依赖于 Play 的 pdf module version 0.9JavaAPIforKml 2.2.0(用于创建表示 kml 文件的对象)。

以前我使用pdf module version 0.7,一切正常。

现在我已经升级到 0.9 版,我对基于 kml 的类的所有测试现在都失败了。我得到的例外是:

java.lang.ClassNotFoundException: org.apache.xerces.jaxp.datatype.DatatypeFactoryImpl
at java.lang.ClassLoader.findClass(ClassLoader.java:358)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at     
play.classloading.ApplicationClassloader.loadClass(ApplicationClassloader.java:93)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at javax.xml.datatype.FactoryFinder.getProviderClass(FactoryFinder.java:115)
at javax.xml.datatype.FactoryFinder.newInstance(FactoryFinder.java:146)
at javax.xml.datatype.FactoryFinder.findJarServiceProvider(FactoryFinder.java:298)
at javax.xml.datatype.FactoryFinder.find(FactoryFinder.java:223)
at javax.xml.datatype.DatatypeFactory.newInstance(DatatypeFactory.java:131)
at com.sun.xml.bind.DatatypeConverterImpl.<clinit>(DatatypeConverterImpl.java:833)
at com.sun.xml.bind.v2.runtime.JAXBContextImpl$3.run(JAXBContextImpl.java:287)
at com.sun.xml.bind.v2.runtime.JAXBContextImpl$3.run(JAXBContextImpl.java:286)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:285)
at 
com.sun.xml.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1140)
at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:154)
at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:121)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:202)
at javax.xml.bind.ContextFinder.find(ContextFinder.java:363)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:574)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:522)
at de.micromata.opengis.kml.v_2_2_0.Kml.getJaxbContext(Kml.java:631)
at de.micromata.opengis.kml.v_2_2_0.Kml.createMarshaller(Kml.java:640)
at de.micromata.opengis.kml.v_2_2_0.Kml.marshal(Kml.java:682)

导致异常的部分代码是这样的:

de.micromata.opengis.kml.v_2_2_0.Kml kml = ...
kml.marshal(someByteArrayOutputStream); // This is the line that causes the exception

如果我切换回 pdf 模块版本 0.7,一切都会再次运行。有谁知道我可以做些什么来继续使用 pdf 模块 0.9 版并让 kml 测试继续工作?

如果有帮助,pdf 模块 0.9 版具有以下依赖项:

core-renderer.jar
itest-2.1.7.jar
jaxen-1.1.jar
jtidy-r938.jar
shani-parser-v1.4.17.jar
xml-apis.jar
yahp-internal.jar
yahp.jar

虽然 JavaApiForKml 版本 2.2.0 具有以下依赖项:

jaxb-impl 2.2
jaxb-xjc 2.2
xmlunit 1.2

【问题讨论】:

    标签: java playframework pdf-generation kml


    【解决方案1】:

    我也为 Play 苦苦挣扎! PDF 模块破坏了我的(以前工作的)XML 解析。

    感谢您分享您的解决方案,这对您有很大帮助!虽然有一种更优雅的方式来实现它。

    由于 xerces 位于 maven Central 上,您应该能够将其添加到您的 dependencies.yml:

    - xerces -> xercesImpl 2.10.0
    

    这样您就无需为其创建模块,也无需担心在同步时它会被覆盖。

    (我使用的是 2.10.0,但您可以将其换成最合适的版本)

    干杯

    【讨论】:

      【解决方案2】:

      出现此问题是因为 PDF 模块使用 jar 文件 xml-apis.jarorg.allcolor.xml.parser.CDocumentBuilderFactory 添加到可用的 DocumentBuilderFactory。不幸的是,这个文档构建器似乎不能很好地处理某些功能,如 XPath 评估。

      当我们将 Xerces 库添加到项目中时,它的 DocumentBuilder 会取代之前的,并且一切正常。但这是偶然的:恰好 Xerces DocumentBuilderFactory 是第一个被发现的。

      为了强制应用程序使用默认的 DocumentBuilderFactory 实现,我认为最好定义相应的系统属性,如javadoc 中定义的那样。

      -Djavax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl
      

      或者,我们可以创建一个新的 DocumentBuilderFactory 实例,明确指出应该使用哪个实现:

      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance("com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl", null);
      

      【讨论】:

        【解决方案3】:

        我已经设法让我的构建再次工作,但我并不特别喜欢这个解决方案。首先,我从 apache 下载 xerces2 库。

        我将 jar 放入 lib 目录,构建工作正常。这个库以前从未存在过,所以我不确定它以前是如何工作的。

        然后我将 xerces jar 放在它自己的名为 xerces 的播放“模块”中,这样​​当运行play deps --sync 时,xerces jar 就不会从 lib 目录中删除。使用此技术运行构建后,构建再次失败!

        所以在玩了更多之后,我认为这可能与罐子的订购有关。我将创建的 xerces 模块重命名为 apache-xerces 并重新运行构建,构建再次开始工作!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多