2011-01-10 5 views
1

Ich werde versuchen, dies so gut wie möglich zu formulieren. Ich habe ein Programm, das eine API-ähnliche Funktionalität hat - es verwendet Reflektion, um Methoden innerhalb einer Klasse dynamisch aufzurufen. In diesem Fall:Java-Programm mit einer Klasse aus einer JAR-Datei

Server.java

public static void main(String[] args) { 
    Class<?> clazz = Class.forName("DiHandler"); 
    StHandler out = (StHandler) clazz.newInstance(); 
    out.read(); 
} 

DiHandler.java

// implements StHandler 
import edu.ds.*; 

public void read() { 
    Ds aType = new Ds(); 
    aType = "134"; 
} 

So hat DiHandler eine Methode read(), die alles enthalten kann, spielt es keine Rolle zu Server.java nach der Kompilierzeit.

Mein Problem ist: DiHandler.java verwendet die Klasse Ds aus einer JAR-Datei. Wenn ich an DiHandler.java in Eclipse arbeite (in einem separaten Projekt von dem Projekt Server.java ist in) kann ich diese JAR ohne ein Problem hinzufügen. Aber wenn ich DiHandler.class verschiebe, nachdem es kompiliert wurde, um von Server.class verwendet zu werden, wie kann es noch die JAR-Datei benutzen?

Ich hoffe, dass dies einen Sinn ergibt, ich nehme an, eine andere Möglichkeit wäre, wie kann ich DiHandler erlauben, eine Klasse aus der JAR aufzurufen, ohne den Klassenpfad zu bearbeiten?

Vielen Dank im Voraus und Entschuldigung für jede Verwirrung oder schlechte Phrasierung, ich kann nur Dank und das übliche Angebot eines Pint für jegliche Hilfe anbieten.

M

+1

'STHandler out = (StHandler) clazz;' - Ich hoffe, dass Sie nicht versuchen, einen 'StHandler' zu instanziieren. –

+0

Sie könnten den zusätzlichen Klassenpfad entweder in der Befehlszeile oder der JAR-Manifest-Datei angeben – dvhh

+0

Entschuldigung, ich habe einen Teil verpasst, der jetzt korrigiert werden sollte. :) – Myn

Antwort

2

Auf die eine oder andere Art müssen Sie den ClassLoader, der DiHandler lädt, wissen, wie Sie Ihre Ds Klasse laden können. Der einfachste Weg ist durch den Klassenpfad.

Der andere Weg ist Ihre eigenen Classloader zur Verfügung zu stellen, die Sie DiHandler zu laden verwenden, um mit diesem Classloader zu wissen, wie Ds zu laden. Dies könnte eine Unterklasse von URLClassLoader sein, mit der Sie URLs zu JAR-Dateien im laufenden Betrieb hinzufügen können. Wie es in der Praxis aussehen wird kann ich nicht sagen, da ich die Details Ihres Kontextes nicht kenne.

+0

meine Antwort beantwortete nicht die ganze Frage, sondern reparierte etwas, das offensichtlich nicht funktionierte;) Vielleicht war es besser, ein Kommentar zu sein, obwohl – Bozho

+0

Ah ... das ist interessant ... Das Hinzufügen eines JAR im laufenden Betrieb ist schön viel, was ich hier tun muss, glaube ich. Was ich getan habe, ist, anderen Ingenieuren zu ermöglichen, ihren eigenen DiHandler zu schreiben, der StHandler implementiert. Was ich versuche, ist, meinen eigenen DiHandler zu schreiben, d. H. Als wäre er von jemand anderem geschrieben worden, aber mein DiHandler ruft in diesem Fall eine Klasse innerhalb einer JAR auf. Ich muss Benutzern erlauben, dies ohne Zugriff auf den Klassenpfad der Hauptanwendung zu tun. Ich hoffe, dass dies hilft, dies in mehr Kontext zu bringen. :) Vielen Dank für den Rat, ich werde URLClassLoader anschauen und sehen, was ich daraus mache. – Myn

0

können Sie nur eine Klasse verwenden, wenn die JVM Zugriff darauf hat. Dies bedeutet, dass die Klasse im Klassenpfad von JVM sein muss.

Es gibt eine Reihe von Möglichkeiten, ein jar im Klassenpfad eines Programms zu platzieren. Vielleicht, wenn Sie die Umgebung beschreiben, in der Sie arbeiten, und die Einschränkungen, denen Sie gegenüberstehen, kann Ihnen jemand helfen, den richtigen Mechanismus zu finden, um das abhängige Glas auf den Klassenpfad zu legen.

+3

Es bedeutet nicht, dass die Klasse überhaupt im Klassenpfad der JVM sein muss. Es gibt Alternativen. –

Verwandte Themen