You are not logged in.

  • Login

Dear visitor, welcome to Coder Forum. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

1

Friday, February 16th 2007, 11:39pm

Klassen aus .jar-Dateien laden

Ich würde gerne ein kleines Plugin-System basteln. Ich möchte, dass man innerhalb meines Programms eine .jar-Datei auswählen kann und dann eine bestimmte Klasse, die sich in dieser Datei befindet, geladen werden.

Ich hoffe ich könnte mich halbwegs verständlich formulieren. Erbitte Vorschläge...

2

Saturday, February 17th 2007, 12:59am

Wenn ich mich recht erinnere ist ein eine jar-Datei lediglich ein Zip-komprimiertes Archiv welches Java-Dateien enthält. Da die Dateien so heißen müssen, wie die Klasse die sie beschreiben, brauchste nur alle Dateinamen aus dem Zip-Archiv auslesen.

3

Saturday, February 17th 2007, 9:53am

Problem ist nur das "live" nachladen der Klassen.

Wenn die JARs im selben Verzeichnis liegen solltest du ja Zugriff auf die Klassen im JAR File haben (wegen classpath). Aber ein Nachladen der Klassen zur Laufzeit.....

Hab dazu ein Snippet gefunden:

Java Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import java.io.*;
import java.net.*;
 
/**
 * <p>Title: ClassPathController</p>
 *
 * <p>Description: Adding files to the ClassPath</p>
 *
 * $Revision: $
 * $Log: $
 */
 
public class ClassPathController {
 
    private static final Class[] parameters = new Class[] { URL.class };
 
    public static void addFile(String s) throws IOException {
        File f = new File(s);
        addFile(f);
    }//end method
 
    public static void addFile(File f) throws IOException {
        addURL(f.toURL());
    }//end method
 
    public static void addURL(URL u) throws IOException {
 
        URLClassLoader sysloader = (URLClassLoader) ClassLoader
                .getSystemClassLoader();
        Class sysclass = URLClassLoader.class;
 
        try {
            Method method = sysclass.getDeclaredMethod("addURL", parameters);
            method.setAccessible(true);
            method.invoke(sysloader, new Object[] { u });
            System.out.println("added " + u.toString() + " to Classpath");
        } catch (Throwable t) {
            t.printStackTrace();
            throw new IOException(
                    "Error, could not add URL to system classloader");
        }//end try catch
 
    }//end method
 
}//end class
 
/**
 * Usage
 */
public Application() {
        try {
            ClassPathController.addFile(new File ("nummer1.jar"));
            ClassPathController.addFile(new File ("nummer2.jar"));
    } catch (IOException e) {
        e.printStackTrace();
    }
}

4

Saturday, February 17th 2007, 1:19pm

Quoted from "SeBa"

Wenn ich mich recht erinnere ist ein eine jar-Datei lediglich ein Zip-komprimiertes Archiv welches Java-Dateien enthält. Da die Dateien so heißen müssen, wie die Klasse die sie beschreiben, brauchste nur alle Dateinamen aus dem Zip-Archiv auslesen.


Und wie soll mein Java-Programm diese Klassen dann laden?


Donut, wo hast du die Source her, dass man noch mal was daz nachlesen kann...?

5

Saturday, February 17th 2007, 1:39pm

Die Benutzung ist einfach:

Java Quellcode

1
ClassPathController.addFile(new File ("nummer1.jar"));


Danach solltest du auf das JAR File genauso Zugriff eit haben, als hätte die JAR zu Kompilierzeit im Verzeichnis gelegen.

Habs jedoch nicht ausprobiert.

Code ist von hier: http://www.tutorials.de/forum/java/264928-externe-jar-dateien-benutzen.html (sind auch keine weiteren Infos)

6

Thursday, February 22nd 2007, 1:28pm

Ich hab mal ein kleinen Code gebaswtelt, aber irgendwie wirft er dann eine "ClassNotFoundException"

Java Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package plugin;
 
public class TestPlugin {
    public TestPlugin(){
        System.out.println("Das TestPlugin wurde geladen!!! Unglaublich!");  
    }
}
 
 
package plugin;
 
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
 
public class Run {
 
    /**
     * @param args
     * @throws MalformedURLException
     * @throws ClassNotFoundException
     * @throws IllegalAccessException
     * @throws InstantiationException
     */
    public static void main(String[] args) throws Exception {
        URL url = new File("C:/Development/Java/Projekte/Test/plugin/TestPlugin.class").toURI().toURL();
        System.out.println(url);
        URLClassLoader cl = new URLClassLoader(new URL[]{url});
        Class<?> c = cl.loadClass("TestPlugin");
        c.newInstance();
    }
}

7

Thursday, February 22nd 2007, 6:02pm

Vielleicht musst du den Pfad anders escapen.
Auf meinem Linux hab ich keine Probleme mit deinem Code.

Poste mal die genaue Fehlermeldung,

8

Thursday, February 22nd 2007, 8:13pm

Quoted

file:/C:/Development/Java/Projekte/Test/plugin/TestPlugin.class
Exception in thread "main" java.lang.ClassNotFoundException: TestPlugin
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at plugin.Run.main(Run.java:21)

9

Thursday, February 22nd 2007, 8:25pm

du arbeitest ohne Enticklungsumgebung, oder?
Ich glaub du musst den Classpath anpassen.

Java ist die einzige Sprache, die ich ausschließlich in der IDE code ;-) Eclipse ist so toll!

Similar threads

Social bookmarks