2012-12-13 13 views
5

Ho codice comune tra un'applicazione Java e un'applicazione RCP. Così ho creato un pacchetto OSGI quali contiene:NoClassDefFoundError quando si esegue un bundle OSGI come jar classico

  • una classe principale di utilizzarlo come un classico barattolo
  • un manifesto OSGi per usarlo nella mia richiesta RCP

ho costruito tutto con Tycho Manifest-first e ha funzionato bene fino a quando ho avuto bisogno di utilizzare un jar esterno nel mio codice comune.

ho bisogno di usare jsch quindi devo aggiungere jsch nel mio MANIFEST.MF:

Manifest-Version: 1.0 
Bundle-ManifestVersion: 2 
Main-Class: mygroupid.Main 
Bundle-Name: Common tools 
Bundle-SymbolicName: common-tools 
Bundle-Version: 1.0.1.qualifier 
Export-Package: mygroupid, 
     mygroupid.tools 
Bundle-RequiredExecutionEnvironment: JavaSE-1.6 
Import-Package: org.osgi.framework;version="1.3.0" 
Require-Bundle: com.jcraft.jsch;bundle-version="0.1.46" 

io edificherò la mia applicazione RCP con Tycho e funziona. Ma quando ho eseguito il bundle come pura JAR con java -jar myjar.jar, ottengo il seguente errore:

Exception in thread "main" java.lang.NoClassDefFoundError: com/jcraft/jsch/JSchException 

Se posso esportare il mio pacco con Eclipse, funziona. Quindi ho un errore nella mia configurazione tycho ...

Come risolvere questo problema? Esiste un jar-with-dependencies per Tycho? Sembra non essere il caso Cosa mi sono perso?

(La mia configurazione: Eclipse Juno con M2E, Tycho 0.16.0, p2: Juno, Tycho: imballo> eclipse-plugin, target-piattaforma di configurazione: resolver = P2 e pomDependencies = considerano.)

risposta

0

se si sta lavorando su piattaforma Linux/Unix, si può provare java -classpath: com.yourpackage.mainclass myjar.jar

se siete workin su piattaforma Windows, si può provare java -classpath; myjar.jar com. yourpackage.mainclass

+0

Sì, conosco classpath. Ma ho bisogno di un pacchetto OSGI completo come Eclipse può farlo. Voglio distribuire solo un jar per la versione da riga di comando. Come costruirlo con Tycho? – cswormy

+0

Puoi provare a confrontare il MANIFEST.MF che hai scritto con l'esportazione di eclipse generata. – Weibo

1

Basta aggiungere lo maven-assembly-plugin alla build e le t è costruire un vaso con tutte le dipendenze:

<plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>2.4</version> 
    <configuration> 
     <descriptorRefs> 
     <descriptorRef>jar-with-dependencies</descriptorRef> 
     </descriptorRefs> 
    </configuration> 
</plugin> 

In alternativa, è anche possibile creare un gruppo in cui i vasi sono packed individually. Avrai bisogno di scrivere il tuo assembly descriptor per questo.