# Bibliotheken in Eclipse-Plugin-Projekt verwenden.



## HobbyProgger (19. Mai 2010)

Ich verwendete in einem normalen Projekt die Bibliotheken *TableLayout* und *Xstream*. Jetzt soll ich aus diesem Projekt ein Eclipse-Plugin machen. Nachdem ich in nur 1 Tag das Tutorial durchgegangen bin, hatte ich Probleme, die alte Swing/AWT UI in das Eclipse SWT UI zu integrieren - dies konnte ich aber noch alleine lösen. Nun habe ich allerdings Probleme mit den besagten Bibliotheken!
Ich habe diese wie bei einem normalen Projekt üblich, in den Build Path eingebunden. (die jar-Dateien liegen in einem Unterordner "lib" im Projekt-Verzeichnis). Anschließend wurden zwar im Quelltext an den Stellen, wo die Bibliotheken verwendet wurden, keine Fehler mehr angezeigt - aber beim Ausführen des Plugins erhalte ich immer Fehlermeldungen, dass die Klasse nicht geladen werden konnte.

Den gleichen Fehler erhielt ich übrigens, als ich versuchte, von dem Plugin-Projekt aus, auf das alte Projekt zuzugreifen (altes Projekt wurde dem Build Path hinzugefügt). - Erst, nachdem ich die Klassen des alten Projektes in das Plugin-Projekt kopierte, konnte ich diese einsetzen.

Gibt es hier noch etwas spezielles zu beachten?


----------



## maki (19. Mai 2010)

> Gibt es hier noch etwas spezielles zu beachten?


zB. OSGi und dessen Manifest.

Kurz: Du brauchst OSGi Versionen der Libs, kannst du entweder selber erzeugen, oder besser gleich OSGi Versionen runterladen, falls möglich.
Den Build Path kannst du mit OSGi getrost vergessen.


----------



## HobbyProgger (20. Mai 2010)

maki hat gesagt.:


> Kurz: Du brauchst OSGi Versionen der Libs, kannst du entweder selber erzeugen, oder besser gleich OSGi Versionen runterladen, falls möglich.


Wie erzeugt man diese?

Oder kennt jemand eine Seite, wo man die OSGi-Versionen dieser Bibliotheken beziehen kann?

Hier war nichts dabei:
https://tablelayout.dev.java.net/se...folderID=3487&expandFolder=3487&folderID=3487
XStream - Download
Oder?


----------



## Koringar (20. Mai 2010)

Hi,

lass mich raten, du hast die Jars in dein Projekt kopiert und im Package Explorer 'Add to Build Path' gemacht. Aber genau das geht bei Eclipse-Plugin nicht einfach so. Du musst es aber über die 'plugin.xml' machen, dort gibt es den Reiter 'Runtime' und dort musste dann unter 'Classpath' die Jars hinzufügen. Erst dann erkennt er die Jars auch.


----------



## maki (20. Mai 2010)

Empfehle dir diese Seite HobbyProgger: Java, Eclipse, Android and Web programming tutorials

Da findest du u.a. wie man OSGi Bundles aus normalen Jars amcht und vieles mehr das man braucht mit Eclipse RCP bzw. OSGi.


----------



## HobbyProgger (20. Mai 2010)

Koringar hat gesagt.:


> lass mich raten [...]


korrekt 



Koringar hat gesagt.:


> Du musst es aber über die 'plugin.xml' machen, dort gibt es den Reiter 'Runtime' und dort musste dann unter 'Classpath' die Jars hinzufügen.


Super, dass hat schon mal funktioniert! 

Jetzt müsst ich nur noch wissen, wie ich ein ganzes externes Projekt dem Classpath hinzufügen kann... - Geht das?


----------



## Koringar (20. Mai 2010)

Hi,

einfach so eine Projekt zum Classpath hinzu zupacken geht nicht. Du musst dieses Projekt entweder als normale Jar oder eben dann als Bundle verpacken und das kannste dann dem Plugin-Projekt hinzufügen.


----------



## HobbyProgger (20. Mai 2010)

Ok, ich habe jetzt das Projekt so wie es ist komplett als jar exportiert, in das erwähnte lib-Verzeichnis kopiert und unter Classpath hinzugefügt. 

Jetzt habe ich eine Klasse (erweitert JPanel), welche -unter Verwendung der Jmol-Bibliothek- einen Atom-Viewer bereit stellt.
Die 1. Zeile im Konstruktor funktioniert noch, aber bei der 2. steigt er aus:

```
public class JmolPanel extends JPanel {

	private JmolViewer viewer;
	private JmolAdapter adapter;
    
	public JmolPanel() {
		adapter = new SmarterJmolAdapter();
		viewer = (JmolViewer) JmolViewer.allocateSimpleViewer(this, adapter);
	}
}
```

Im normalen Java-Projekt gab es damit allerdings keine Probleme - nur im Plugin-Projekt.

Habe ich beim Exportieren etwas falsch gemacht?


----------



## Wildcard (20. Mai 2010)

Zunächst mal, 'er steigt aus' ist keine Fehlerbeschreibung mit der man etwas anfangen kann.
Du darfst in einem Plugin Projekt *niemals* den Java Build Path selbst verändern, das übernimmt das PDE Tooling. Du kannst den Classpath beeinflussen über den Manifest Editor:
-Import Package
-Require Bundle
-Extra Classpath Entries


----------



## HobbyProgger (21. Mai 2010)

Ok, der genaue Fehler lautet:

```
Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: javax/vecmath/Tuple3f
```
Ja, ich habe es dem Classpath hinzugefügt, wie du es beschreibst.


----------



## Wildcard (21. Mai 2010)

Poste mal dein Manifest. In welcher Bibliothek liegt javax/vecmath/Tuple3f?


----------



## HobbyProgger (21. Mai 2010)

Wildcard hat gesagt.:


> Poste mal dein Manifest. In welcher Bibliothek liegt javax/vecmath/Tuple3f?


Ok, hier ist mein Manifest:

```
source.. = src_plugin/
output.. = bin/
bin.includes = plugin.xml,\
               META-INF/,\
               .,\
               icons/,\
               splash.bmp,\
               lib/xstream-1.2.1.jar,\
               lib/TableLayout-bin-jdk1.5-2009-08-26.jar,\
               lib/commons-math-1.1.jar,\
               lib/log4j-1.2.14.jar,\
               lib/JMOL11.jar
```
Es gibt da eine *vecmath1.2-1.14.jar* unter jars im Jmol-Projekt-Ordner.
- Kann es sein, dass diese nicht mit in die JMOL.jar exportiert wurden?


----------



## maki (21. Mai 2010)

HobbyProgger, lies dir doch das Tutorial durch, denn so wird das nix, du weisst ja viel zu wenig 

Du soltest dein Manifest  posten, nicht die Build.properties...


----------



## HobbyProgger (21. Mai 2010)

maki hat gesagt.:


> Du soltest dein Manifest  posten, nicht die Build.properties...


Parton, ich hatte zwar die MANIFEST.MF ausgewählt, aber dann leider den falschen Reiter erwischt (hatte da nicht so drauf geachtet, weil ich in den letzten Reitern bisher selber nichts geändert hatte).

```
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: jCellGeo
Bundle-SymbolicName: CellGeoPlugin;singleton:=true
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: plugin.Activator
Require-Bundle: org.eclipse.ui,
 org.eclipse.core.runtime
Bundle-ActivationPolicy: lazy
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Bundle-ClassPath: .,
 lib/xstream-1.2.1.jar,
 lib/TableLayout-bin-jdk1.5-2009-08-26.jar,
 lib/commons-math-1.1.jar,
 lib/log4j-1.2.14.jar,
 lib/JMOL11.jar
```
PS: das RCP Tutorial bin ich durchgegangen.


----------



## Wildcard (21. Mai 2010)

HobbyProgger hat gesagt.:


> Es gibt da eine *vecmath1.2-1.14.jar* unter jars im Jmol-Projekt-Ordner.
> - Kann es sein, dass diese nicht mit in die JMOL.jar exportiert wurden?


Schau ins jar dann weißt du es, aber ich würde vermuten das die Klasse dort wirklich nicht enthalten ist.


----------



## HobbyProgger (21. Mai 2010)

Wildcard hat gesagt.:


> Schau ins jar dann weißt du es, aber ich würde vermuten das die Klasse dort wirklich nicht enthalten ist.


Da gibt es einen Ordner jars, welcher nur die *vecmath1.2-1.14.tar.gz* enthält.

Ansonsten gibt es noch einen Ordner "lib\JMOL11 - Kopie.zip\org\jmol\vecmath", welcher die Datei Point3fi.class einthält.

Wie bekomme ich denn die Bibliothek in die jar-Datei exportiert?
- Eigentlich sollten doch automatisch alle verwendeten Libs eingebunden werden, oder nicht?


----------



## Wildcard (21. Mai 2010)

Jar in Jar funktioniert nicht (ausser bei OSGi Bundles). Vielleicht solltest du aus JMOL Projekt ebenfalls ein OSGi Bundle machen?


----------



## HobbyProgger (21. Mai 2010)

Wildcard hat gesagt.:


> Jar in Jar funktioniert nicht (ausser bei OSGi Bundles). Vielleicht solltest du aus JMOL Projekt ebenfalls ein OSGi Bundle machen?


Ok, gibt es dabei etwas spezielles zu beachten?

Wäre es auch möglich, die jar-Datei aus diesem Projekt herauszunehmen und direkt dem Class-Path des eigentlichen Projektes hinzuzufügen?


----------



## HobbyProgger (21. Mai 2010)

HobbyProgger hat gesagt.:


> Wäre es auch möglich, die jar-Datei aus diesem Projekt herauszunehmen und direkt dem Class-Path des eigentlichen Projektes hinzuzufügen?


Ich habe es jetzt genau so gemacht - und es funktioniert! 

Mir wäre es zwar etwas lieber gewesen, wenn es ohne das explizite Einbinden der Vecmath gegangen wäre... - aber Hauptsache es geht!


----------

