# noclassdeffoundError



## noisebreath (18. Mai 2009)

Hi,

er schmeißt mir den noclassdeffoundError für eine Abstract Class die ich benutze. Diese Wiederum wird in einem Projekt definiert dass ich in eclipse eingebunden habe und unter Projects im Java Build Path eingebunden habe. Daher konnte ich die Class auch importieren.
Daher verstehe ich nicht warum er  mir zur laufzeit den error schmeißt. muss ich mehr machen als das projekt im Java Build Path einzubinden? Mich erstaunt es.

lg
noise


----------



## SlaterB (18. Mai 2009)

schon mal probeweise zwei neue Projekte angelegt,
in einem eine ganz kleine Klasse

class A {

}

definiert und im anderen Projekt verwendet?

class B {
     public static void main(String[] args)
    {
        A a = new A();
    }
}


--------

ist die .class-Datei real im Dateisystem vorhanden, Project clean usw?


----------



## Koringar (19. Mai 2009)

Es könnte sein das er manchmal den Pfad zu dem Projekt nicht findet, warum ka. Das ist bei z.B. RCP der Fall. Versuche mal das Projekt wo die Abtrakteklasse zu einer Jar zumachen und importiere sie dann in dein Projekt wo du sie verwenden willst.


----------



## noisebreath (19. Mai 2009)

es gibt bei mir schon ein projekt das objekte von einem anderen benutzt. das funktioniert also gerell schon bei mir. clean hatte ich auch schon diverse male probiert und hilft nicht. 
ich werd das mit dem jar später mal versuchen..


----------



## Wildcard (19. Mai 2009)

Wenn du sagst Laufzeit, dann meinst du welchen Kontext? Aus der IDE mit einer bestimmten JRE? Ausserhalb der IDE? In einem wie auch immer gearteten Container (OSGi, Tomcat,..)?


----------



## noisebreath (20. Mai 2009)

hi,

also im moment spuckt er mir keinen classdeffounderror mehr aus, aber er verhält sich generell immer gleich. 
sobald in meinem programm die class instantiiert wird ,in der auch ein Array der besagten AbstractClass als Attribut gebildet wird, beendet er das program. Im moment wirft er zu dem Zeitpunkt wie gesagt keinen error mehr aber ich denke das ist nur ein anzeigefehler. 
Jedenfalls funktioniert das rumhantieren mit der Abstractclass in einem anderen TestProjekt, welches kein Rcp ist wunderbar. Ich versuch jetzt die Sache mit dem jar aus. dann geb ich bescheid ob es was geändert hat.

lg


----------



## noisebreath (20. Mai 2009)

hab ein jar draus gemacht. gibt mir beim erstellen einiges an warnings: 

JAR export finished with warnings. See details for additional information.
  Problem writing text2onto/bin/org/ontoware/text2onto/algorithm/concept/CValueConceptExtraction.txt to JAR: duplicate entry: org/ontoware/text2onto/algorithm/concept/CValueConceptExtraction.txt
  duplicate entry: org/ontoware/text2onto/algorithm/concept/CValueConceptExtraction.txt
  Problem writing text2onto/bin/org/ontoware/text2onto/algorithm/relation/AbstractPatternRelationExtraction.txt to JAR: duplicate entry: org/ontoware/text2onto/algorithm/relation/AbstractPatternRelationExtraction.txt
  duplicate entry: org/ontoware/text2onto/algorithm/relation/AbstractPatternRelationExtraction.txt
  Problem writing text2onto/bin/org/ontoware/text2onto/algorithm/relation/AbstractWordnetRelationExtraction.txt to JAR: duplicate entry: org/ontoware/text2onto/algorithm/relation/AbstractWordnetRelationExtraction.txt
  duplicate entry: org/ontoware/text2onto/algorithm/relation/AbstractWordnetRelationExtraction.txt
  Problem writing text2onto/bin/org/ontoware/text2onto/algorithm/relation/causal/AbstractCausalRelationExtraction.txt to JAR: duplicate entry: org/ontoware/text2onto/algorithm/relation/causal/AbstractCausalRelationExtraction.txt
  duplicate entry: org/ontoware/text2onto/algorithm/relation/causal/AbstractCausalRelationExtraction.txt
  Problem writing text2onto/bin/org/ontoware/text2onto/algorithm/relation/causal/CausalRelationExtraction.txt to JAR: duplicate entry: org/ontoware/text2onto/algorithm/relation/causal/CausalRelationExtraction.txt
  duplicate entry: org/ontoware/text2onto/algorithm/relation/causal/CausalRelationExtraction.txt
  Problem writing text2onto/bin/org/ontoware/text2onto/algorithm/relation/general/SubcatRelationInstanceExtraction.txt to JAR: duplicate entry: org/ontoware/text2onto/algorithm/relation/general/SubcatRelationInstanceExtraction.txt
  duplicate entry: org/ontoware/text2onto/algorithm/relation/general/SubcatRelationInstanceExtraction.txt
  Problem writing text2onto/bin/org/ontoware/text2onto/algorithm/relation/partOf/AbstractPartOfRelationExtraction.txt to JAR: duplicate entry: org/ontoware/text2onto/algorithm/relation/partOf/AbstractPartOfRelationExtraction.txt
  duplicate entry: org/ontoware/text2onto/algorithm/relation/partOf/AbstractPartOfRelationExtraction.txt
  Problem writing text2onto/bin/org/ontoware/text2onto/algorithm/relation/partOf/PatternPartOfRelationExtraction.txt to JAR: duplicate entry: org/ontoware/text2onto/algorithm/relation/partOf/PatternPartOfRelationExtraction.txt
  duplicate entry: org/ontoware/text2onto/algorithm/relation/partOf/PatternPartOfRelationExtraction.txt
  Problem writing text2onto/bin/org/ontoware/text2onto/algorithm/relation/partOf/WordnetPartOfRelationAlgorithm.txt to JAR: duplicate entry: org/ontoware/text2onto/algorithm/relation/partOf/WordnetPartOfRelationAlgorithm.txt
  duplicate entry: org/ontoware/text2onto/algorithm/relation/partOf/WordnetPartOfRelationAlgorithm.txt
  Problem writing text2onto/bin/org/ontoware/text2onto/algorithm/taxonomic/subrelationOf/AbstractRelationClassification.txt to JAR: duplicate entry: org/ontoware/text2onto/algorithm/taxonomic/subrelationOf/AbstractRelationClassification.txt
  duplicate entry: org/ontoware/text2onto/algorithm/taxonomic/subrelationOf/AbstractRelationClassification.txt
  Problem writing text2onto/bin/org/ontoware/text2onto/bayes.zip to JAR: duplicate entry: org/ontoware/text2onto/bayes.zip
  duplicate entry: org/ontoware/text2onto/bayes.zip
  Problem writing text2onto/bin/org/ontoware/text2onto/gui/jgraph.zip to JAR: duplicate entry: org/ontoware/text2onto/gui/jgraph.zip
  duplicate entry: org/ontoware/text2onto/gui/jgraph.zip
  Problem writing text2onto/bin/org/ontoware/text2onto/util/algorithms.xml to JAR: duplicate entry: org/ontoware/text2onto/util/algorithms.xml
  duplicate entry: org/ontoware/text2onto/util/algorithms.xml
  Problem writing text2onto/bin/org/ontoware/text2onto/util/google/patterns.xml to JAR: duplicate entry: org/ontoware/text2onto/util/google/patterns.xml
  duplicate entry: org/ontoware/text2onto/util/google/patterns.xml

wenn ich das exportierte Jar einbinde anstatt das projekt selber, funktioniert das programm leider noch immer nicht... also ich bin hier am ende meines lateins..


----------



## Koringar (20. Mai 2009)

Hi,

also du willst also dann RCP machen. Da kann ich dir sagen, dass man da nicht auf ein anderes Projekt verweisen kann, da MUSS man eine Jar bilden (die Warnings sollten eigentlich egal sein, du sollstes sie aber trotzdem bereinigen).
Diese muss dann in dein Projekt, dann musst du aber auch noch in der 'plugin.xml' was einstellen. Und zwar unter dem Reiter 'Runtime' bei 'Classpath' muss du die Jar noch adden und alle Bibliotheken die dieses Jar braucht.
Das ist erstmal alles was du machen muss, wenn du es unter Eclipse zum laufen bekommen willst, willst du es dann eigenständig zum laufen bekommen musste da noch mehr machen.


----------



## noisebreath (20. Mai 2009)

oki danke werd mich dran machen.


----------



## noisebreath (20. Mai 2009)

hm.. also unter Runtime - ClassPath kann ich irgendwie nur das machen: 
"Specify the libraries and folders that constitute the plug-in classpath.  If unspecified, the classes and resources are assumed to be at the root of the plug-in."
Außer new und add ist nichts  auswählbar.
wenn ich da auf add gehe hab ich eigentlich nur die verzeichnisstruktur meines pluginprojekts zur auswahl und kann nicht irgendwelche jars ausserhalb adden. auch wenn ich das jar in den srcfolder packe zeigt er es mir nicht in dem ordner zur auswahl an.

lg


----------



## noisebreath (20. Mai 2009)

also hab jetzt einfach n ordner lib im plguin projekt gemacht und dort die beiden jars reingemacht. die beiden jars (vorher projekte) haben selbtständig eigene jars einbinden muessen. die information ist in den beiden jars im classpath drinnen. dann hab ich unter runtime classpath die beiden geadded aber leider funktioniert es noch immer an der gleichen stelle wie vorhin nicht. kann es sein dass ich alle jars die vorher in den beiden neu eingebundenen jars drin waren explizit wieder einbinden muss obwohl im classpath der beiden jars die informationen korrekt für die anderen stehen?

lg


----------



## noisebreath (20. Mai 2009)

jar hier jar bla.. ^^ falls unverständlich ist was ich geschrieben habe, einfach sagen dann formulier ich es klarer


----------



## Wildcard (20. Mai 2009)

Ach das ist ein OSGi Projekt? Sind deine Abhängigkeiten auch Bundles? Wenn ja, dann musst du sie einfach im Manifest als required bundles eintragen.


----------



## noisebreath (21. Mai 2009)

kein osgi (auch wenn ich  das nicht wirklich kenne). ist einfach ein plugin in eclipse kreiiert und will aus der api eines anderen projekts dinge benutzen. 
was sind bundles? ich habe von 2 programmen den sourcecode in 2 projekte innerhalb meiner workspace gepackt. diese projekte binden ihrerseits jars ein auf deren api sie zugreifen. nun hatte ich in mein plugin die beiden projekte eingebunden. ihr habt gesagt dass geht bei plugins nicht. daraufhin hab ich aus den 2 projekten jar 1 und jar 2 gemacht und eingebunden. in deren classpath-dateien stehen informationen der form : (bsp jar 1)

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
	<classpathentry kind="src" path="src"/>
	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
	<classpathentry kind="lib" path="E:/programms/text2onto-091107-noinstaller/3rdparty/aclibico.jar"/>
	<classpathentry kind="lib" path="E:/programms/text2onto-091107-noinstaller/3rdparty/gnu-regexp-1.0.8.jar"/>
	<classpathentry kind="lib" path="E:/programms/text2onto-091107-noinstaller/3rdparty/jena.jar"/>
	<classpathentry kind="lib" path="E:/programms/text2onto-091107-noinstaller/3rdparty/je-3.1.0.jar"/>
	<classpathentry kind="lib" path="E:/programms/text2onto-091107-noinstaller/3rdparty/utilities.jar"/>
	<classpathentry kind="lib" path="E:/programms/text2onto-091107-noinstaller/3rdparty/gate/heptag.jar"/>
	<classpathentry kind="lib" path="E:/programms/text2onto-091107-noinstaller/3rdparty/jpedal/jpedal.jar"/>
	<classpathentry kind="lib" path="E:/programms/text2onto-091107-noinstaller/3rdparty/jpedal/bcprov-jdk14-119.jar"/>
	<classpathentry kind="lib" path="E:/programms/text2onto-091107-noinstaller/3rdparty/jpedal/cid.jar"/>
	<classpathentry kind="lib" path="E:/programms/text2onto-091107-noinstaller/3rdparty/jpedal/jai_core.jar"/>
	<classpathentry kind="lib" path="E:/programms/text2onto-091107-noinstaller/3rdparty/google/googleapi.jar"/>
	<classpathentry kind="lib" path="E:/programms/text2onto-091107-noinstaller/3rdparty/jwnl/jwnl.jar"/>
	<classpathentry kind="lib" path="E:/programms/text2onto-091107-noinstaller/3rdparty/kaon/apionrdf.jar"/>
	<classpathentry kind="lib" path="E:/programms/text2onto-091107-noinstaller/3rdparty/kaon/datalog.jar"/>
	<classpathentry kind="lib" path="E:/programms/text2onto-091107-noinstaller/3rdparty/kaon/kaonapi.jar"/>
	<classpathentry kind="lib" path="E:/programms/text2onto-091107-noinstaller/3rdparty/kaon/query.jar"/>
	<classpathentry kind="lib" path="E:/programms/text2onto-091107-noinstaller/3rdparty/kaon/rdfapi.jar"/>
	<classpathentry kind="lib" path="E:/programms/kaon2.jar"/>
	<classpathentry kind="lib" path="E:/programms/jdom.jar"/>
	<classpathentry combineaccessrules="false" kind="src" path="/Gate"/>
	<classpathentry kind="output" path="bin"/>
</classpath>

Ich hab jar 1 und jar 2 anstatt der projekte eingebunden und wie verordnet unter runtime-classpath die beiden jars eingebunden. (ich habe beide jars in einen unterordner lib meines plugins gepackt)

Wie gesagt funktioniert es leider immer noch nicht und ich bin mim latein am ende. mit der aussage bundle kann ich leider nicht viel anfangen... 

lg
noise


----------



## Wildcard (21. Mai 2009)

PlugIns sind OSGi Bundles und Eclipse läuft in einem OSGi Container. Da jedes PlugIn also ein Bundle ist musst du im Manifest dein zweites PlugIn als required bundle eintragen (keine Angst, dafür gibt es einen grafischen Editor, einfach mal die Manifest.MF anklicken).
Der normale Java Build Path greift nämlich in der OSGi Runtime nicht mehr, da zählt nur noch das Manifest.


----------



## noisebreath (21. Mai 2009)

ich hab kein 2. plugin...
also wenn ich das richtig verstanden hab : 
plugins sind osgi bundles im osgi container. in dem läuft auch eclipse, aber eclipse selber ist kein osgi bundle oder? 
ich hab nur ein plugin in eclipse gemacht und will keine weiteren plugins einbinden sondern ganz normale java projekte mit sourcecode auf den ich dann zugreifen will..


----------



## noisebreath (21. Mai 2009)

übrigens hab ich ausprobiert ob er objekte aus den 2nd hand jars (also jars die in den beiden projekten eingebunden waren,die ich zu jar1 und jar2 gemacht habe) auflösen kann, aber das geht wohl nicht:

The type org.semanticweb.kaon2.api.KAON2Exception cannot be resolved. It is indirectly referenced from required .class files

Könnte es sein, dass er die objekte aus jar 1 auflösen kann, aber nicht die abhängigkeiten dahinter?
nach dem motto: ich greife auf obj 1 von jar 1 zu, welches aber selber auf ein objekt einer weiteren jar zugreift.


----------



## Wildcard (21. Mai 2009)

Eclipse bezeichnet nur die Plattform. Eclipse Equinox ist eine Implementierung der OSGi Spezifikation und stellt damit den OSGi Container. Dann werden einige Bundles in den Container geladen die den Eclipse spezifischen Teil liefern (auswerten der plugin.xml zb). Die ganze Funktionalität sind dann einfach PlugIns. Sei es die Java IDE, die Oberfläche, die Hilfe, die C IDE, die Problems View,... alles PlugIns.

Wenn deine Projekte keine Bundles sind, dann brauchst du jars die in dein PlugIn packst und dann musst du sie im Manifest Editor als extra classpath entries eintragen.
Du kannst aus deinen jars aber auch sehr einfach OSGi Bundles machen (das geht mit eclipse sogar automatisch) die du dann als required Bundles einträgst.


----------



## noisebreath (26. Mai 2009)

also ich habs bis heute noch nicht hinbekommen.
ehrlich gesagt denke ich auch nicht dass ich es noch hinbekomme. dafür hab ich einfach nicht genug ahnung von rcp.
ich hab auch mal versucht einfach die srces von dem projekt dass ich einbinden will in ein Plugin project einzubinden. das an sich funktioniert auch so wie es ausschaut, aber wenn ich dieses plugin dann in meinem hauptplugin als required project in den buildpath einbinde funktioniert es leider trotzdem nicht.
er erkennt wie gesagt das objekt aber terminiert einfach immer wenn er an dem punkt ankommt wenn ich das objekt instantiiere.


```
public Object execute(ExecutionEvent event) throws ExecutionException {
		
		//EntropyConceptExtraction a = new EntropyConceptExtraction();
                EntropyConceptExtraction a = null;

		IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindowChecked(event);
		MessageDialog.openInformation(
				window.getShell(),
				"OWLExtraction Plug-in",
				"Hello, Eclipse world");
		return null;
	}
```

so funktionierts dass er mir ein window anzeigt. sobald ich aber auskommentiertes reinnehme terminiert es bzw er zeigt mir kein window an.das rcp an sich bricht nicht ab. beim debuggen sehe ich auch das er nicht bis 		IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindowChecked(event); kommt.

dachte ich versuche das mal weil es hieß das man in plugins keine projekte adden kann aber plugins wohl schon. (?)

(Randinformation:die Activator class etc musste ich rausnehmen weil er mir nach dem import der srces fehler wegen jface etc kamen)

danke dennoch für die zahlreichen hilfsversuche 

ich hätte noch eine frage: gibt es eine Möglichkeit ein java projekt in ein rcp einzubinden und so funktionalität ins rcp einzubinden oder muss es ein plugin sein?

lg


----------



## noisebreath (26. Mai 2009)

neue idee/vermutung/verzweifelung ^^ : muss ich wenn ich in einem plugin ein anderes einbinde alle classes mit extension points angeben (weiss wohlgemerkt nicht genau wie die funktionieren), so dass reine classpath infos nicht ausreichen?


----------



## Wildcard (26. Mai 2009)

Zunächst musst du aus deinem nicht-plugin-projekt ein jar machen. Dieses jar stopfst du dann in zB ein Verzeichnis 'lib' in deinem Plugin. Danach machst du einen Doppelklick auf die Manifest.MF und stellst alles so ein wie auf den Screenshots angegeben (im ersten Build auf 'add' klicken wo der Cursor steht und dein jar auswählen).


----------



## noisebreath (27. Mai 2009)

danke wildcard,
das hab ich schon mal versucht, aber es ging nicht,denke ich werde es nochmal versuchen. ich hab da vielleicht einfach was falsch gemacht.
werden die classpathinformationen des projects auch behalten wenn ich das projekt zu nem jar mache? (also die pfade zu den vom Projekt eingebundenen jars)

nochmals vielen lieben dank für die muehe 

lg


----------



## noisebreath (27. Mai 2009)

mir ist übrigens etwas sehr merkwürdiges aufgefallen. wenn ich innerhalb meines plugins ein package mache und darin eine class mit eigener main function, dann erkennt er alle objecte (zb 	EntropyConceptExtraction a = new EntropyConceptExtraction(); ) und terminiert nicht. 
Is doch irgendwie komisch dass er innerhalb des gleichen Projekts in ner eigenen main  die objekte erkennt aber in den plugin handlern nicht. ist sowas intuitiv?! ^^


----------



## maki (27. Mai 2009)

> Is doch irgendwie komisch dass er innerhalb des gleichen Projekts in ner eigenen main die objekte erkennt aber in den plugin handlern nicht. ist sowas intuitiv?! ^^


Werden denn die "Objekte" (Klassen/Interfaces) bzw. deren packages Exportiert/Importiert?


----------



## noisebreath (27. Mai 2009)

die klassen importier ich aus projekten die ich als required projects angegeben habe


----------



## maki (27. Mai 2009)

noisebreath hat gesagt.:


> die klassen importier ich aus projekten die ich als required projects angegeben habe


Ich meinte ob sie in der Manifest als exportierte & importierte Packages angegeben sind, OSGi ist da sehr strickt, dadurch wird eine sehr saubere Trennung von Komponeneten(Bundles) erzielt und so unnötige Abhängigkeiten von vornherein vermieden.


----------



## noisebreath (27. Mai 2009)

das scheint nicht der fall zu sein. MANIFEST:MF

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Farazplug Plug-in
Bundle-SymbolicName: OWLExtraction_old;singleton:=true
Bundle-Version: 1.0.0
Bundle-Activator: farazplug.Activator
Require-Bundle: org.eclipse.ui,
 org.eclipse.core.runtime
Bundle-ActivationPolicy: lazy
Bundle-RequiredExecutionEnvironment: JavaSE-1.6

das ist alles was drinsteht


----------



## maki (27. Mai 2009)

Das Manifest ist DIE wichtigste Datei in OSGi, bei Eclipse RCP kommt noch die plugin.xml dazu.
Hast doch einen Editor mit Superfunktionlität dafür, wenn ich mich recht erinnere kann der die exports & imports auf Knopfdruck berechnen.


----------



## noisebreath (27. Mai 2009)

und weisst du auch wie? ist nämlich das erste mal dass ich das mache


----------



## maki (27. Mai 2009)

Wenn du die Manifest öffnest, sollte der Editor schon aufgehen, unten hast du dann verschiedene Tabs (Runtime, Dependencies, etc. pp.), *irgendwo da sollte es sein*

Sorry, hab leider keine OSGi Projekt zur Hand (Müsste erst auzschecken), würde dir auf jedenfall ein Tutorial empfehlen, ich fand dieses damals sehr gut, habe aber keine Eclipse RCP gemacht sondern OSGi auf Basis von Equinox mit Maven2 (Felix Bundle Plugin):
Hello, OSGi, Part 1: Bundles for beginners - JavaWorld
Hello, OSGi, Part 2: Introduction to Spring Dynamic Modules - JavaWorld
Hello, OSGi, Part 3: Take it to the server side - JavaWorld


----------



## noisebreath (27. Mai 2009)

oki danke


----------



## Wildcard (27. Mai 2009)

noisebreath hat gesagt.:


> mir ist übrigens etwas sehr merkwürdiges aufgefallen. wenn ich innerhalb meines plugins ein package mache und darin eine class mit eigener main function, dann erkennt er alle objecte (zb 	EntropyConceptExtraction a = new EntropyConceptExtraction(); ) und terminiert nicht.
> Is doch irgendwie komisch dass er innerhalb des gleichen Projekts in ner eigenen main  die objekte erkennt aber in den plugin handlern nicht. ist sowas intuitiv?! ^^



Das ist nicht im mindesten merkwürdig. Du musst dir einfach nur abgewöhnen den BuildPath Konfigurieren zu wollen, damit machst du die Sache nämlich nur unnötig kompliziert und Fehleranfällig.
Wenn du eine reguläre Java Application (mit main) in Eclipse ausführst, verwendet er dafür besagten Buildpath und da ist alles drin. Entwickelst du jedoch ein PlugIn/Bundle, dann werden deine Abhängigkeit über den OSGi Container zur Verfügung gestellt.
Dafür gibt es erstmal 3 Möglichkeiten:
1. Du gibst ein Bundle als required Bundle an und bekommst damit Zugriff auf alle Packages die dieses Bundle (explizit!) exportiert.
2. Du importierst ein package. Der OSGi Container versucht nun ein Bundle zufinden das die geforderten Packages exportiert. Wird kein solches Bundle gefunden, hast du Pech.
3. Du bringst selbst irgendwelche Bibliotheken mit(die du warum auch immer nicht zu Bundles machen willst). Diese Bibliotheken müssen *innerhalb* deines Bundles liegen (in der Regel als jar) und im Manifest als extra classpath entries angegeben sein.

Also: vergiss den blöden Buildpath, bei PlugIn Projekten baut dir Eclipse deinen Classpath anhand des Manifests automatisch zusammen.


----------



## noisebreath (27. Mai 2009)

danke fürdie antwort die endlich mal einiges was ih so fetzenweise hier und da gelesen habe in einklang bringt. verstehe jetzt glaub ich ein bisschen mehr die unterschiede, aber punkt 3 ist mir noch nicht ganz klar. 
meinst du damit dass die jars einzelnd entpackt werden sollen und dann aus jedem einzelne Plugins (bundle) gemacht werden sollen, welche ich dann benutze und auf die ich dann mit meinem plugin zugreife?


----------



## Wildcard (27. Mai 2009)

Von der Philosophie her bietet es sich an aus absolut jedem jar (sei es extern, oder intern) ein OSGi Bundle zu machen. Dadurch sind deine Dependcies sauberer, du kannst bestimmte Versionen Referenzieren,...
Der Unterschied zwischen normalem Jar und einem OSGi Bundle ist erstmal nur ein erweitertes Manifest, demzufolge lassen sich jars sehr leicht konvertieren.
Viele wichtige Bibliotheken sind bereits OSGifiziert und in Zentralen Repositories vorhanden.
Beispiele dafür sind Orbit und das Spring Repository:
Orbit
SpringSource Enterprise Bundle Repository

Wenn du einer jar jedoch kein erweitertes Manifest verpassen willst, oder kannst, hast du die Möglichkeit es Bundle Intern zu verwenden.
Kopier das jar in dein PlugIn Project (zB in /lib) und referenzier es als extra classpath entry im Manifest deines Bundles (siehe Bilder weiter oben).


----------



## noisebreath (28. Mai 2009)

danke wildcard für die geduld und die tollen erklärungen. es funktioniert endlich alles wie es  soll! 81 jars sind eingebunden und funktionieren allesamt miteinander. im endeffekt war es ja dann doch recht "einfach" wenn man mal von der klassischen java project heransgehensweise abstand nimmt 
ich bedanke mich auf diesem wege herzlich bei dir!

lg noise


----------



## Wildcard (28. Mai 2009)

noisebreath hat gesagt.:


> im endeffekt war es ja dann doch recht "einfach" wenn man mal von der klassischen java project heransgehensweise abstand nimmt


Korrekt. Die Sache ist wirklich sehr einfach wenn man sich mal drauf eingelassen hat. Und erst im Anschluss merkt man dann wie mächtig das Konzept wirklich ist.


> ich bedanke mich auf diesem wege herzlich bei dir!


keine Ursache, schön das es jetzt tut


----------



## faetzminator (29. Mai 2009)

Ich hatte dieses Problem nun ebenfalls (benötige 3 jars), konnte in den Logs die CNFE sehen.
Nun habe ich alle 3 Jars zu den Buildpaths manuell hinzugefügt. Wenn ich nun im Menu den Wizard starten will, gibt es nicht mal mehr einen Logentry. Es passiert einfach nichts. Ebenfalls ist - seit ich den Buildpath manuell setze - das Icon im Menu und in der Toolbar weg.

Wer kann mir da helfen?

plugin.xml:

```
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.2"?>
<plugin>
   <extension
         point="org.eclipse.ui.actionSets">
      <actionSet
            id="JarVersionCheckerPlugin.actionSet"
            label="Infrastructure"
            visible="true">
         <menu
               id="InfrastructureMenu"
               label="&amp;Infrastructure">
            <separator name="sampleGroup"/>
         </menu>
         <action
               class="com.*.payments.infrastructure.plugin.jarversionchecker.actions.VersionCheckerAction"
               icon="icons/infrastructure.gif"
               id="com.*.payments.infrastructure.plugin.jarversionchecker.actions.SampleAction"
               label="&amp;Version Checker"
               menubarPath="InfrastructureMenu/InfrastructureGroup"
               toolbarPath="InfrastructureGroup"
               tooltip="Version Checker"/>
      </actionSet>
   </extension>

</plugin>
```

build.properties:

```
source.. = src/
output.. = bin/
bin.includes = META-INF/,\
               .,\
               plugin.xml,\
               lib/commons-io-1.3.1.jar,\
               lib/commons-lang-2.4.jar,\
               lib/payments.jar,\
               icons/,\
               bin/
jars.compile.order = .,\
                     lib/payments.jar,\
                     lib/commons-lang-2.4.jar,\
                     lib/commons-io-1.3.1.jar
source.lib/commons-io-1.3.1.jar = lib/
source.lib/commons-lang-2.4.jar = lib/
source.lib/payments.jar = lib/
src.includes = META-INF/,\
               bin/,\
               lib/commons-io-1.3.1.jar,\
               lib/commons-lang-2.4.jar,\
               lib/payments.jar,\
               icons/,\
               src/,\
               plugin.xml
```

MANIFEST.MF:

```
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: JarVersionChecker Plug-in
Bundle-SymbolicName: JarVersionChecker;singleton:=true
Bundle-Version: 1.0.0
Bundle-Vendor: *@*.com
Bundle-Localization: plugin
Require-Bundle: org.eclipse.ui,
 org.eclipse.core.resources,
 org.eclipse.core.runtime
Bundle-ClassPath: lib/commons-io-1.3.1.jar,
 lib/commons-lang-2.4.jar,
 lib/payments.jar,
 .
Export-Package: com.*.payments.infrastructure.jar,
 com.*.payments.infrastructure.utilities,
 org.apache.commons.io,
 org.apache.commons.io.filefilter,
 org.apache.commons.io.input,
 org.apache.commons.io.output,
 org.apache.commons.lang,
 org.apache.commons.lang.builder,
 org.apache.commons.lang.enum,
 org.apache.commons.lang.enums,
 org.apache.commons.lang.exception,
 org.apache.commons.lang.math,
 org.apache.commons.lang.mutable,
 org.apache.commons.lang.text,
 org.apache.commons.lang.time
```


----------



## Wildcard (29. Mai 2009)

Vielleicht verschluckst du irgendwo eine Exception.


----------



## faetzminator (29. Mai 2009)

Konnte das Problem beheben - hatte noch eine alte Version im plugins/ Ordner. Bis anhin machte das allerdings keine Probleme beim Ausführen der Test-Eclipse-Umgebung - die Testapp sollte von Eclipse vor dem anderen gelesen werden?


----------



## Wildcard (31. Mai 2009)

Verstehe die Frage nicht


----------



## faetzminator (2. Jun 2009)

Nun, das erstellte Plugin verursachte Probleme in einer Eclipse-Testumgebung (Run as Eclipse Application). Der Grund dafür war anscheinend, dass ich eine ältere Version dieses Plugins "produktiv auf Eclipse laufen liess" - d.h. in ~/plugins/ hatte. Diese werden in der Testumgebung anscheinend ebenfalls geladen. So gab es gewisse Inkompatibilitäten.


----------



## Wildcard (2. Jun 2009)

In deiner run configuration steht genau welche Bundles geladen werden und welche nicht. Auch aufgeteilt nach Workspace Bundles und installierten Bundles.


----------

