2012-02-24 1 views
3

내 Play 프로젝트는 현재 Play의 pdf module version 0.9JavaAPIforKml 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) 

예외를 발생시키는 코드의 부분은 이것이다 :

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 테스트를 계속 진행할 수 있는지 알 수 있습니까? JavaApiForKml 버전 2.2.0이 종속되지만

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 

:이 도움이 경우

, PDF로 모듈 버전 0.9은 이러한 종속성이 나는 그럭저럭 한

jaxb-impl 2.2 
jaxb-xjc 2.2 
xmlunit 1.2 

답변

0

내 그러나 나는 다시 한번 해결책을 좋아하지 않는다. 첫째, 나는 아파치에서 xerces2 라이브러리를 다운로드한다.

jar 파일을 lib 디렉토리에 넣으면 빌드가 작동합니다. 이 라이브러리는 이전에는 존재하지 않았으므로 이전에 어떻게 작동하는지 잘 모르겠습니다.

xerces라고하는 자체 재생 "모듈"에 xerces jar를 넣으므로 play deps --sync을 실행하면 xerces jar가 lib 디렉토리에서 지워지지 않을 것입니다. 이 기술을 사용하여 빌드를 실행 한 후 빌드가 다시 실패했습니다!

그래서 더 놀아 본 후에는 항아리 주문과 관련이 있다고 생각했습니다. 내가 만든 xerces 모듈의 이름을 apache-xerces라고 바꾸고 빌드를 다시 실행하고 빌드가 다시 시작되었습니다!

1

나는 또한 플레이로 고생했습니다! PDF 모듈이 내 (이전에 작동하는) XML 구문 분석을 위반했습니다.

솔루션을 공유해 주셔서 감사합니다. 덕분에 많은 도움이되었습니다. 그것을 달성하는 더 우아한 방법이 있지만.

- xerces -> xercesImpl 2.10.0 

당신이 그것을 위해 모듈을 생성하거나 것에 대해 걱정할 필요가 없습니다 그 방법 : Xerces에로

받는다는에 중앙 살고, 당신은 당신의 dependencies.yml이를 추가 할 수 있어야 동기화 할 때 덮어 씁니다.

은 (내가 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 인스턴스를 만들 수 있습니다