RCP Klassenkompilieren zur Laufzeit

K

Kepa

Gast
Hey ho,

ich versuche zur Zeit in ein Programm einen Compiler zu bauen, der eine Klasse zur Laufzeit kompiliert und lädt.
Am Rande: Sinn der Sache ist, dass der Nutzer des Programms Quelltext schreibt und sich anzeigen lässt, was dieser macht.
Dazu habe ich dieses Tutorial durchgelesen und nachvollzogen: Add dynamic Java code to your application - JavaWorld

Meine Datei, die ich zu kompilieren versuche, heißt Algo.java und ist abgeleitet von AbstractAlgo.java, aber das ist nur nebensächlich.
Das Problem ist, dass ich es nicht vernünftig hinbekomme, dass die Algo.java auf die Pakete innerhalb des Projektes zugreift, außer ich füge den expliziten Pfad (zum Wurzelverzeichnis des RCP-Projektes) zum ersten Argument von "new Javac" hinzu.
Dann werden die Dateien fein importiert, aber dann meckert er darüber, was diese wiederum wieder importieren, nämlich org.eclipse.draw2d.Animation oder org.eclipse.swt.graphics.Color und so weiter.

Fazit: Wie schaffe ich es, den Classpath zu erzeugen/extrahieren, der ALLES enthält, was ich brauche? (Sprich Pfad zum Wurzelverzeichnis des Projekts, Pfad zu den Plugins von Eclipse)

Betriebssystem ist Ubuntu Linux 11.04 und die Eclipse-Version ist 3.6.

Gruß und Danke,
Kepa
 

Wildcard

Top Contributor
Gib dem Project die PDE Nature (sprich ein Plugin Projekt) und erstelle zB per Wizard direkt ein Manifest das dein Bundle als required Bundle enthält. PDE kümmert sich dann um den Classpath.
Wenn dein RCP kein PDE enthält bzgw. enthalten soll musst du entweder einen eigenen Classpath Container schreiben oder zB m2Eclipse installieren um den Classpath darüber managen zu lassen.
 
K

Kepa

Gast
Danke schon einmal für deine Antwort, habe leider im Moment wenig Zeit, weswegen ich jetzt erst antworte.

Ich habe mich dazu entschieden, das mittels eines selbstgebauten Classpath Containers umzusetzen und folgendes Tutorial gelesen:
Simplify Eclipse classpaths using classpath containers

Habe ich das richtig verstanden, dass ich meinem Projekt einen Classpath Container und in diesem Container einen Entry brauche, der auf das Verzeichnis zeigt, welches Algo.java enthält und der Rest wird von selber erledigt?
 
K

Kepa

Gast
So, ich habe ein wenig weitergearbeitet.
AbstractAlgo.java ist nun ein Interface, Algo.java ist die dynamische Klasse.
Das Interessante ist der compileClasspath. Ich erzeuge nach dem ersten Tutorial eine Instanz von DynaCode, die sich per Thread.currentThread().getContextClassLoader() den Class Loader holt und daraus mittels der Funktion extractClasspath:
[Java] private static String extractClasspath(ClassLoader cl) {
StringBuffer buf = new StringBuffer();
while (cl != null) {
if (cl instanceof URLClassLoader) {
URL urls[] = ((URLClassLoader) cl).getURLs();
for (int i = 0; i < urls.length; i++) {
if (buf.length() > 0) {
buf.append(File.pathSeparatorChar);
}
buf.append(urls.getFile().toString());
}
}
cl = cl.getParent();
}

return buf.toString();
}[/Java]

Den Classpath rausholt. Zu diesem Classpath füge ich jetzt noch allerlei Referenzen hinzu:
- Auf den Workspace
- Auf das Verzeichnis, in dem das Projekt ausgeführt wird
- Auf den Workspace
und so weiter.

Wenn ich nun in meinem RCP-Projekt auf den Button klicke, der dafür sorgt, dass die Klasse kompiliert wird, klappt es genau jedes zweite Mal. Wenn es klappt, läuft alles wunderbar, wenn nicht, kommen Fehler wie diese:
In rot:
error: org.eclipse.zest.layouts.LayoutAlgorithm: class file for org.eclipse.zest.layouts.LayoutAlgorithm not found
Und dann ein dicker Haufen hinterher:
/home/basti/Programmierung/new_workspace/alviscopy/src/alvis/example/graph/MyGraph.java:14: package org.eclipse.core.runtime does not exist
import org.eclipse.core.runtime.FileLocator;
^
/home/basti/Programmierung/new_workspace/alviscopy/src/alvis/example/graph/MyGraph.java:35: package org.eclipse.ui does not exist
import org.eclipse.ui.IActionBars;

Und noch tausende weitere Imports, die nicht funktionieren. Aber halt jedes zweite Mal^^

Woran liegt das und wie kann ich das beheben?
 

Oben