2012-12-13 8 views
5

Ich habe einen gemeinsamen Code zwischen einer Java-Anwendung und einer RCP-Anwendung. So habe ich ein OSGi-Bundle erstellt, die enthält:NoClassDefFoundError beim Ausführen eines OSGI-Bundles als klassisches jar

  • eine Hauptklasse es als klassisches Glas es in meiner RCP-Anwendung zu verwenden
  • ein OSGi-Manifest zu verwenden

ich gebaut alle mit Tycho Manifest zuerst und es funktionierte gut, bis ich ein externes Glas in meinem gemeinsamen Code verwenden musste.

Ich brauche zu verwenden jsch so habe ich jsch in meinem MANIFEST.MF hinzufügen:

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" 

ich mit Tycho meine RCP-Anwendung erstellen und es funktioniert. Aber wenn ich das Bündel als reine JAR mit java -jar myjar.jar laufen lasse, erhalte ich folgende Fehlermeldung:

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

Wenn ich mit Eclipse mein Bündel exportieren, es funktioniert. So habe ich einen Fehler in meiner Tycho-Konfiguration ...

Wie man dieses Problem löst? Gibt es ein Jar-mit-Abhängigkeiten für Tycho? Es scheint nicht der Fall zu sein Was habe ich verpasst?

(Meine Konfiguration: Eclipse-Juno mit M2e, Tycho 0.16.0, p2: Juno, Tycho: Verpackung> Eclipse-Plugin, Ziel-Plattform-Konfiguration: Resolver = p2 und pomDependencies = betrachten.)

Antwort

0

wenn Sie arbeiten auf Linux/Unix-Plattform können Sie java -classpath versuchen:; myjar.jar com myjar.jar com.yourpackage.mainclass

, wenn Sie auf Windows-Plattform sind workin, können Sie java -classpath versuchen. yourpackage.mainclass

+0

Ja, ich kenne Klassenpfad. Aber ich brauche ein komplettes OSGI-Paket, da Eclipse es kann. Ich möchte nur ein jar für die Befehlszeilenversion bereitstellen. Wie man es mit Tycho baut? – cswormy

+0

Sie können versuchen, die MANIFEST.MF, die Sie geschrieben haben, mit dem generierten Eclipse-Export zu vergleichen. – Weibo

1

Fügen Sie einfach die maven-assembly-plugin zu Ihrem Build, und le t es ein Glas mit allen Abhängigkeiten bauen:

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

Alternativ können Sie auch eine Assembly erstellen, wo die Gläser packed individually sind. Sie müssen dafür Ihre eigene assembly descriptor schreiben.