2012-02-24 5 views
3

My Playプロジェクトは、Playのpdf module version 0.9およびJavaAPIforKml 2.2.0(kmlファイルを表すオブジェクトの作成に使用)に依存しています。Play Framework:JavaAPIforKmlでうまく再生できないPDF 0.9モジュール

以前は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) 

例外が発生したコードの一部がこれです:私は、PDFモジュールのバージョン0.7に戻す場合は

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

、すべてが再び動作します。誰もが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 

答えて

0

私は私を得ることができましたしかし、私は特に解決策が好きではありません。まず、apacheからxerces2ライブラリをダウンロードします。

libディレクトリにjarを入れてビルドを行いました。このライブラリは以前は存在していなかったので、以前はどうなっていたのか分かりません。

私はxercesと呼ばれる独自の再生 "モジュール"にxerces jarを入れて、play deps --syncを実行したときにxerces jarがlibディレクトリから消去されないようにしました。この手法を使用してビルドを実行した後、ビルドに失敗しました。

周りをもっと遊んだ後、私はそれがジャーの注文に関係するかもしれないと思った。私が作成したxercesモジュールの名前をapache-xercesという名前に変更し、ビルドを再実行し、ビルドが再び動作するようになりました!

1

私もPlayで苦労しました! PDFモジュールは私の(以前働いていた)XMLパースを破っています。

あなたのソリューションを共有してくれてありがとう、それは多くの助けになった!それを達成するためのよりエレガントな方法がありますが。

Xercesのは、Mavenの中央に住んでいるとして、あなたはdependencies.ymlにこれを追加することができる必要があります:

- xerces -> xercesImpl 2.10.0 

あなたはそれのためのモジュールを作成する必要がある、またはそれがあることについて心配しないでくださいその方法同期すると上書きされます。

は(私は2.10.0を使用していますが、あなたはバージョンが最も適切な方のためにそれを交換することができます)PDFモジュールはに org.allcolor.xml.parser.CDocumentBuilderFactoryを追加するjarファイル xml-apis.jarを使用しているため、この問題が発生し

乾杯

1

使用可能なDocumentBuilderFactory残念ながら、この文書作成者は、XPathの評価として、いくつかの機能をあまりうまく扱えないようです。

Xercesライブラリをプロジェクトに追加すると、そのDocumentBuilderが前のものに優先し、すべて正常に動作します。しかし、これは偶然にも機能します.Xerces DocumentBuilderFactoryが最初に見つかることが起こります。

アプリケーションがデフォルトのDocumentBuilderFactory実装を使用するようにするには、javadocで定義されている対応するシステムプロパティを定義することが望ましいと思います。

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

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

代わりに、我々は明示的に実装が使用されるべきかを示す新しいのDocumentBuilderFactoryインスタンスを作成することができます

関連する問題