2011-12-15 13 views
8

Ho generato classi con XMLBeans da un file xsd e li ho imballati in un file jar. poi ho aggiunto quel jar al classpath del progetto in eclipse e tutto si compila e gira bene. Ho costruito un file jar stand-alone dal mio progetto con Maven e di nuovo la generazione viene eseguita correttamente, ma quando provo eseguirlo ottengo questo errore:Errore durante l'utilizzo delle classi generate da XmlBeans

Exception in thread "main" java.lang.ExceptionInInitializerError 
    at com.oblicore.oblisync.resolutions.TestsDocument$Factory.parse(TestsDo 
cument.java:126) 
    at com.oblicore.oblisync.handlers.TransferEntitiesHandler.getResolution(
TransferEntitiesHandler.java:117) 
    at com.oblicore.oblisync.handlers.TransferEntitiesHandler.resolveConflic 
ts(TransferEntitiesHandler.java:103) 
    at com.oblicore.oblisync.main.Orchestrator.run(Orchestrator.java:107) 
    at com.oblicore.oblisync.main.Orchestrator.main(Orchestrator.java:58) 
Caused by: java.lang.RuntimeException: Cannot load SchemaTypeSystem. Unable to l 
oad class with name schemaorg_apache_xmlbeans.system.s8B21CFFFCFED0B2438C2585C61 
F113F7.TypeSystemHolder. Make sure the generated binary files are on the classpa 
th. 
    at org.apache.xmlbeans.XmlBeans.typeSystemForClassLoader(XmlBeans.java:7 
83) 
    at com.oblicore.oblisync.resolutions.TestsDocument.<clinit>(TestsDocumen 
t.java:19) 
    ... 5 more 
Caused by: java.lang.ClassNotFoundException: schemaorg_apache_xmlbeans.system.s8 
B21CFFFCFED0B2438C2585C61F113F7.TypeSystemHolder 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:303) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248) 
    at org.apache.xmlbeans.XmlBeans.typeSystemForClassLoader(XmlBeans.java:7 
69) 
    ... 6 more 

La classe mancante è nel vaso che ho creato con XmlBeans, come faccio a dire a Maven di aggiungerlo al barattolo che crea dal mio progetto?

risposta

3

Nel file jar generato assicurarsi di aver incluso i file di classe generati dai xmlbeans.

Dal stacktrace:

Caused by: java.lang.ClassNotFoundException: schemaorg_apache_xmlbeans.system.s8 
B21CFFFCFED0B2438C2585C61F113F7.TypeSystemHolder 

suggerisce che durante la fase di compilazione i file di classe richiesti sono nel classpath, ma nel vostro vaso incorporato questi file sono mancanti.

Controlla il tuo file jar per vedere se queste classi sono presenti.

EDIT: Secondo questione riformulata

Per costruire vaso con dependecies in Maven usare jar-with-dependencies opzione, example

Due riferimento molto buona:

  1. http://www.sonatype.com/books/mvnref-book/reference/assemblies-sect-basics.html

  2. http://thomassundberg.wordpress.com/2011/03/05/create-an-executable-jar-from-maven/

Nel secondo quello che non hanno bisogno di una classe principale se il vaso non è un jar eseguibile

+0

Ho rifasato la mia domanda per spiegare meglio di cosa ho bisogno – Tomer

+0

Per la costruzione di jar con dipendenze è possibile utilizzare il plugin maven-assembly in cui è necessario specificare quali jar devono essere inclusi, sample pom può essere trovato qui http: // maven.apache.org/plugins/maven-assembly-plugin/descriptor-refs.html – mprabhat

+1

Quando si crea un progetto JAR con Maven, il JAR contiene solo le classi di quel progetto. Non contiene i JAR necessari per costruirlo, né i JAR che saranno necessari per l'esecuzione (principalmente, ma non sempre gli stessi). Se impacchettate il vostro progetto come WAR o EAR, però, Maven avrebbe incluso tutti i JAR che i vostri elenchi POM come dipendenze di runtime. Se non hai bisogno di WAR o EAR, allora il suggerimento del plugin assembly sopra è più semplice (usa l'opzione jar-with-dependencies). –

3

Si prega di aggiungere tag di seguito in pom.xml. Errore wil andare

 <!-- 
      this tells maven to copy the openejb-javaagent jar into your target/ 
      directory 
     --> 
     <!-- where surefire can see it --> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-dependency-plugin</artifactId> 
      <version>2.1</version> 
      <executions> 
       <execution> 
        <id>copy</id> 
        <phase>process-resources</phase> 
        <goals> 
         <goal>copy</goal> 
        </goals> 
        <configuration> 
         <artifactItems> 
          <artifactItem> 
           <groupId>org.apache.openejb</groupId> 
           <artifactId>openejb-javaagent</artifactId> 
           <version>3.0-beta-2</version> 
           <outputDirectory>${project.build.directory}</outputDirectory> 
          </artifactItem> 
         </artifactItems> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
    <resources> 
     <resource> 
      <directory>target/generated-sources/axis2/wsdl2code/resources</directory> 
     </resource> 
     <resource> 
      <directory>target/generated-sources/xmlbeans/resources</directory> 
     </resource> 
     <resource> 
      <directory>src/main/resources</directory> 
     </resource> 
    </resources> 
</build> 
4

Quando si dispone di questo tipo di errore Il TypeSystemHolder.class generato da WSDL2Java non essere collocato nel classpath, al fine di evitare questo errore.

Copiare TypeSystemHolder.class dalla cartella "resource/schemaorg_apache_xmlbeans/system/s68C41DB812F52C975439BA10FE4FEE54".

E Incollare TypeSystemHolder.class file nella cartella classpath (build/classes/schemaorg_apache_xmlbeans/sistema/s68C41DB812F52C975439BA10FE4FEE54) cartella

4

mentre si fa WSDL2Java una directory verranno create le risorse di nome. Copia i file schemaorg_apache_xml che si trovano sotto le risorse per classpath del tuo progetto. Questa dovrebbe essere la soluzione.

0

Vaso di estrazione in cui si desidera includere la cartella schemaorg_apache_xmlbeans. Copia cartella schemaorg_apache_xmlbeans nella cartella estratta (risultato dell'estrazione del vaso). prompt dei comandi aperto nella cartella estratta.

make jar di nuovo usando il comando jar cf. ad esempio jar cf test.jar *, per includere tutte le cartelle.

Distribuire quel barattolo.

Problemi correlati