![]() |
|
|
|||||||
| Allgemeine Java-Themen Allgemeine Themen, die nicht in andere Fachforen und nicht zu den Java Basics passen |
|
|
|
Themen-Optionen | Thema durchsuchen | Ansicht |
| #1 (permalink) | |
|
Neuer Benutzer
byte
Registriert seit: 11.03.2006
Fachbeiträge: 13
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
|
Servus!
Ich habe gleich mehrere Probleme: 1: Wie kreig ich den Pfad der JAR-Datei raus, die ich gerade ausführe? 2: Wie kann ich aus einer JAR-Datei heraus (und/oder einfach aus *.class-Datei) eine Klasse laden, die sich in ein einem anderen Ordner befindet (z.B. in [Ordner_durch_1:_rausgekriegt]\module) und dann mit ihnen arbeiten? 3: Wie kann ich nun, wenn die durch 2: geladen Klasse abgeleitet von einem JPanel, auf dem sich noch andere Komponenten befinden und mit denen ich arbeiten kann, ist, dieses Panel auf mein Formular aus der Haupt-Klasse (in JAR) bringen. (eine Instanz der Klasse bilden und dann einfach add zu irgendeinem anderen Panel funzt nicht ... selbst wenn die Klasse mit direkt im JAR ist) Wie man schon sieht, will ich ein Programm bastel, das aus einem nicht viel tuenden Haptprogramm besteht und das beim Start den Ordner "module" noch andern *.class und/oder *.jar-Dateien, die alle irgendwie so sind, dass ich sie dann einfach in z.b. jede in ein JTabbedPane laden kann und damit arbeiten kann, durchsucht und lädt. Geht das überhaupt (bestimmt!) und gibt es vielleicht einfachere und bessere Methoden dazu? Ich hoffe, Ihr könnt mir hier helfen! mfg, eyeless |
|
|
| #3 (permalink) | |
|
Premium-Benutzer
Registriert seit: 07.02.2004
Fachbeiträge: 7.817
Abgegebene Danke: 10
Erhielt 152 Danke für 74 Beiträge
|
1. Da es überhaubt keine Garantie gibt, dass dein Programm überhaupt aus einer JAR ausgeführt wird... ich wüsste nicht wie. Vielleicht über den ClassLoader?
2. Mit einem URLClassLoader kannst du die Klassen laden, "Class"-Objekte herstellen und schliesslich Instanzen anlegen. 3. Ich verstehe rein sprachlich nicht ganz, wie das jetzt funktionieren soll... Ein Plugin-Mechanismus kannst du folgendermassen machen: ein Interface "Plugin" in deinem Hauptprogramm. Die Plugins kommen je in eine JAR-Datei, in dem Manifest wird die Haupt-Plugin-Klasse angegeben. Dann lädt man das Plugin mit einem URLClassLoader, instanziiert die Haupt-Plugin-Klasse (welche das Interface "Plugin" implementiert haben muss!), macht noch einen kleinen Cast von "Object" auf "Plugin" - und dann kann man nach herzenslust irgendwelche selbst definierten Methoden aufrufen. |
|
|
| #5 (permalink) | |
|
Neuer Benutzer
byte
Themenstarter
Registriert seit: 11.03.2006
Fachbeiträge: 13
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
|
Hallo,
3. meine ich ungefähr so: Ich habe nun per ClassLoader diese externe .class in die VM geladen und eine Instanz davon erstellt: Java: Code:
public class Test3Panel extends javax.swing.JPanel {
/** Creates new form Test3Panel */
public Test3Panel() {
initComponents();
}
private void initComponents() {
jProgressBar1 = new javax.swing.JProgressBar();
jProgressBar1.setValue(50);
add(jProgressBar1);
}
private javax.swing.JProgressBar jProgressBar1;
}
Hat vieleicht jemand ein Beispiel, wie das mit den Interface "Plugin" funktioniert? mfg, eyeless |
|
|
| #7 (permalink) | |
|
Neuer Benutzer
byte
Themenstarter
Registriert seit: 11.03.2006
Fachbeiträge: 13
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
|
So, hab mich nur vertan, inzwischen funktioniert alles (fast) super.
Ein Problem ist aber noch: Zur Zeit habe ich die Klassen auch als solche, also als *.class dastehen, mit entsprechenden Ordnern für Bilder und so und Packages, also eigentlich auch nur Unterordner, wo noch andere Klassen drinne sind. So habe ich zum Bsp. die HauktKlasse im Ordner "base", Bilder für die HauptKlasse in "base/img" und extra Klassen für das HauptKlasse in "base/misc" (package base.misc) Nun habe ich Module, einfach Klassen, die von JPanel abgeleitet sind, im Ordner "modules/{$ModulName}" (auch package "modules.{$ModulName}"), die ich dann einfach per Laufzeit mit Class.forName, Interfaces und so weiter einbinde, und in ein JTabbedPane auf dem HauptFormular reinstecke. Das funkktioniert allerdings nur solange, wie ich alles nicht in JARS packe. Wenn ich nun aber die ganzen Sachen für die HauptKlasse in eine JAR Packe (z.B. "Prog.jar"), sich im ProgrammOrdner also nur noch die Prog.jar und der Ordner "modules", funktionier es nicht mehr, wenn ich z.B. Class.forName("modules.dummy.mod") mache, obwohl ein Ordner dummy in modules existiert und in dummy die Klasse "mod.class" mit package "modules.dummy.mod". Da kommt einfach eeine ClassNotFoundException. Also: wie kann ich nun diese Klasse aus der JAR-Datei heraus laden? Muss ich dazu irgendwie den CLASSPATH in MANIFEST.MF im JAR um "./modules" erweitern? Ich habe es auch schon hiermit probiert: Java: Code:
public Class findClass(String name) throws ClassNotFoundException {
// Dieses Array nimmt den Bytecode auf.
byte[] byteCode = null;
// Zusammensetzen des Dateinamens
String fileName = name.replace('.', File.separatorChar)+"."+CRYPT_EXT;
try {
// Entschlüsseln der Datei und Einlesen des Bytecodes
byteCode = decryptFile(fileName);
}
catch(IOException e) {
throw new ClassNotFoundException("Encrytepd class "
+name+" not found.", e);
}
// Klasse in der VM erzeugen und Class-Objekt zurückliefern
Class c = defineClass(name, byteCode, 0, byteCode.length);
return c;
}
Allerdings sagt der Compiler mir immer, es gäbe "defineClass()", "decryptClass" und "CRYPT_EXT" nicht, obwohl ich "java.lang.ClassLoader" und "javax.crypto.*" importiert habe ... oer muss ich nochwas importieren? Ein weiteres Problem wäre noch, was muss ich ändern, wenn ich nun eine ganze JAR-Datei laden will? mfg, eyeless |
|
|
|
| Themen-Optionen | Thema durchsuchen |
| Ansicht | |
Ähnliche Themen
|
||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| konstruktor aus externer klasse aufrufen | stefan2801 | Java Basics - Anfänger-Themen | 1 | 04.10.2008 18:05 |
| Klasse in externer JAR mit ObjectInputStream | The_S | Allgemeine Java-Themen | 14 | 11.06.2008 12:49 |
| TimerTask auf externer class | Kawia | Java Basics - Anfänger-Themen | 0 | 22.11.2007 23:26 |
| JInternalFrame aus externer Klasse | JavaPain | Java Basics - Anfänger-Themen | 0 | 16.02.2005 17:35 |
| XML von externer Domain laden | Dan | Für Verirrte - Fragen zu JavaScript | 1 | 09.09.2004 08:29 |
| Lesezeichen |
|
|