2012-04-10 2 views
4

H2 데이터베이스가 내장 된 Datanucleus 및 JDO가있는 데스크톱 응용 프로그램을 개발 중입니다. 그것은 Eclipse에서 실행할 때 모두 잘 작동하지만 실행 가능한 jar을 만들려고 할 때 작동을 멈 춥니 다. 다음 오류가 발생합니다 :Datanucleus, JDO 및 실행 가능한 jar - 어떻게 할 수 있습니까?

org.datanucleus.exceptions.NucleusUserException : 지속성 프로세스가 DataNucleus 플러그인 메커니즘에서 아직 발견되지 않은 "jdo"라는 ClassLoaderResolver를 사용하도록 지정되었습니다. CLASSPATH 및 플러그인 사양을 확인하십시오.

물론 내가 제대로 구성하지 못했음을 보여줍니다. 무엇이 누락 되었습니까? 큰 것을 놓친다면, 전혀 작동하지 않을 것이므로, 결함있는 실행 가능한 jar라고 가정합니다. 내가 JPOX 같은 다른 애플 리케이션에서 그 오류를 보았다 어디 고정,하지만 주어진 어떤 해결책도없이.

전체 오류 스택 트레이스 :

pmf = JDOHelper.getPersistenceManagerFactory(getProperties()); 

속성 파일이 해당과 같습니다 :

javax.jdo.PersistenceManagerFactoryClass=org.datanucleus.api.jdo.JDOPersistenceManagerFactory 
datanucleus.ConnectionDriverName=org.h2.Driver 
datanucleus.ConnectionURL=jdbc:h2:datanucleus 
datanucleus.ConnectionUserName=sa 
datanucleus.ConnectionPassword= 

내가 모든 종속성에서이

Exception in thread "main" javax.jdo.JDOFatalInternalException: Unexpected exception caught. 
     at javax.jdo.JDOHelper.invokeGetPersistenceManagerFactoryOnImplementation(JDOHelper.java:1193) 
     at javax.jdo.JDOHelper.getPersistenceManagerFactory(JDOHelper.java:808) 
     at javax.jdo.JDOHelper.getPersistenceManagerFactory(JDOHelper.java:701) 
     at db.PersistenceManagerFilter.init(PersistenceManagerFilter.java:44) 
     at Main.main(Main.java:26) 
NestedThrowablesStackTrace: 
java.lang.reflect.InvocationTargetException 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
     at java.lang.reflect.Method.invoke(Unknown Source) 
     at javax.jdo.JDOHelper$16.run(JDOHelper.java:1965) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at javax.jdo.JDOHelper.invoke(JDOHelper.java:1960) 
     at javax.jdo.JDOHelper.invokeGetPersistenceManagerFactoryOnImplementation(JDOHelper.java:1166) 
     at javax.jdo.JDOHelper.getPersistenceManagerFactory(JDOHelper.java:808) 
     at javax.jdo.JDOHelper.getPersistenceManagerFactory(JDOHelper.java:701) 
     at db.PersistenceManagerFilter.init(PersistenceManagerFilter.java:44) 
     at Main.main(Main.java:26) 
Caused by: org.datanucleus.exceptions.NucleusUserException: Persistence process has been specified to use a ClassLoaderResolver of name "jdo" yet this has not been found by the DataNucleus plugin mechanism. Please check your CLASSPATH and plugin specification. 
     at org.datanucleus.NucleusContext.<init>(NucleusContext.java:233) 
     at org.datanucleus.NucleusContext.<init>(NucleusContext.java:196) 
     at org.datanucleus.NucleusContext.<init>(NucleusContext.java:174) 
     at org.datanucleus.api.jdo.JDOPersistenceManagerFactory.<init>(JDOPersistenceManagerFactory.java:364) 
     at org.datanucleus.api.jdo.JDOPersistenceManagerFactory.createPersistenceManagerFactory(JDOPersistenceManagerFactory.java:294) 
     at org.datanucleus.api.jdo.JDOPersistenceManagerFactory.getPersistenceManagerFactory(JDOPersistenceManagerFactory.java:195) 
     ... 12 more 

가 가리키는 라인은 PersistenceManagerFilter 초기화 방법입니다 의존성을 가지고 배포하는 것을 목표로합니다. 의존성은 데이터 핵 페이지에 명시된 바와 같습니다 http://www.datanucleus.org/products/datanucleus/jdo/maven.html

아이디어가 있습니까?

+0

"실행 가능한 jar"은 무엇입니까? 뭘 만들었 니? – DataNucleus

+1

실행 가능한 jar 파일로 배포 된 maven 종속성이있는 전체 프로젝트입니다. – Paul

+0

당신은 DN 단지를 unjarred하고 모든 것을 하나의 병에 넣어 두는 것을 의미합니까? – DataNucleus

답변

1

DataNucleus 응답에 추가.
는 다음 종속성이 대상/항아리 디렉토리에있을 것입니다 당신의 pom.xml

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-dependency-plugin</artifactId> 
      <version>2.4</version> 
      <executions> 
       <execution> 
        <id>copy-dependencies</id> 
        <phase>package</phase> 
        <goals> 
         <goal>copy-dependencies</goal> 
        </goals> 
        <configuration> 
         <outputDirectory>${project.build.directory}/jars</outputDirectory> 
         <overWriteReleases>false</overWriteReleases> 
         <overWriteSnapshots>false</overWriteSnapshots> 
         <overWriteIfNewer>true</overWriteIfNewer> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

에 다음은 받는다는 - 종속성 - 플러그인
를 사용하여 추가해야합니다 필요 acheave합니다. "
자바 -cp :;

윈도우 : package.className


리눅스
자바 -cp"항아리가/* yourFile.jar "

당신이 명령을 사용하여 응용 프로그램을 실행하려면 yourFile.jar : 항아리/* "package.className


참고 :. 항아리/* 항아리를 사용하지 않는이 작동하지 않습니다

4

DataNucleus 항아리 OSGi에 지원과 능력을 확인하는 플러그인 메커니즘을 사용하기 때문에 plugin.xml에META-INF/MANIFEST.MF 파일을 포함입니다. 이들은 원래의 jar 파일과 동일한 위치에 있어야합니다 (jar 파일의 루트에 있음). 압축을 푼 다음 다시 압축하면 plugin.xml과 META-INF/MANIFEST.MF를 DN jars ...에서 병합해야합니다. 모든 정보가 여기에 있습니다.

+1

좋아, 이제는 항아리가 정확하고 필요한 모든 정보가 포함되어 있다는 것을 확신합니다. 나는 재산에서 무엇인가를 놓치고 있다고 생각한다. 그것은 무엇 일 수 있는가? 아니면 맞습니까? 모든 게시물을 포함하도록 내 게시물을 수정했습니다. 그것이 datanucleus.ConnectionFactoryName에 대한 수 있을까요? 그것이 갖는 가치는 무엇입니까? – Paul

+1

이 파일을 병합하는 방법을 좀 더 정확하게 설명해 주시겠습니까? 그것은 분명하지 않다. – Fabien

+0

@DataNucleus 예. 매니페스트 파일을 병합하는 가장 좋은 방법을 설명하는 것이 좋을 것입니다. 큰 프로젝트에서 음영 처리 된 JAR을 컴파일하고 수동으로 병합 할 너무 많은 것들이 있습니다. – jtravaglini

2

DataNucleus 4를 사용하려면 다음을 수행하십시오.x는 하나의 항아리가 필요한 Apache Storm 토폴로지에서 PluginRegistry가 작동하도록 두 가지 해킹을해야했습니다. 문제는 DataGruus 코어가 모듈을 OSGi 번들로로드하려고 시도한다는 것입니다. 심지어 OSGi 컨테이너에서 실행되지 않는 경우에도 마찬가지입니다. 항아리가 병합되지 않는 한이 작업은 정상적으로 작동합니다 (그리고 내 종속성을 병합하지 않는 것이 좋지만이 방법은 선택 사항이 아닙니다).

먼저 모든 plugin.xml 파일을 datanucleus-core plugin.xml에 병합했습니다. 속임수는 확장 포인트 ID가 부모 플러그인의 ID와 관련이 있다는 것입니다. 따라서 사용중인 모듈 중 하나가 새로운 확장 점을 정의하면 datanucleus-rdbms의 경우, 새로운 부모 플러그인에 상대적으로 ID를 다시 써야합니다.

둘째, 나는 우리 항아리의 MANIFEST.MF에 다음 항목을 추가 : 우리의 응용 프로그램은 본질적으로 DataNucleus 핵심 OSGi 번들로 척으로

Premain-Class: org.datanucleus.enhancer.DataNucleusClassFileTransformer 
Bundle-SymbolicName: org.datanucleus;singleton:=true 

이 솔루션은 적합하지 않습니다. 그러나, 이것은 내가 책상에서 머리를 스매싱하고 며칠 후에 끝났습니다.

다른 PluginRegistry 구현을 제공하는 것이 가능할 수도 있지만이를 조사하지 않았습니다.

관련 문제