Jar-File soll externe class-Datei benutzen

N

nethwa

Gast
Moin moin,

ich probiere gerade wieder etwas mit Java rum und da ich zu diesem Thema keine direkte Antwort finde wollte ich hier einfach mal nachfragen:

Ist es unter Java möglich, dass, wenn man eine Jar-Datei startet, diese im Verlauf des Arbeitens externe class-Dateien verwendet? Ich habe bereits versucht einfach die Ordnerstruktur zu verwenden und so zur class-Datei zu verweisen, das hat allerdings nicht funktioniert.

Und nicht dass man mich jetzt falsch versteht - ich will nicht, dass die jar-Datei erst in einem IDE gestartet wird oder dass eine externe Jar-Date verwendet wird. Ich will einfach nur, dass der Benutzer die jar-Datei starten kann und ggf. zusätzliche class-Dateien (zB von mathematischen Algorithmen, diese sollten dann die Konventionen vordefinierter Interfaces und ABC's erfüllen) die in einem bestimmten Ordner liegen oder angegeben werden laden und verwenden kann.

Ein paar Hinweise oder Anregungen dazu würden mich schon sehr sehr freuen,

Vielen Dank im Vorraus,
nethwa
 
B

bygones

Gast
am einfachsten ist es diese zusaetzlichen class Dateien beim Start deines Jars zu laden - woher soll waehrend der Laufzeit das programm wissen, dass sich der Ordner geaendert hat.

Im grunde willst du ein Plugin system und da gibt es meines Wissens einige Threads im Forum - ein wichtiger Teil ist zb der URLClassLoader
 
N

nethwa

Gast
Ich hatte vergessen die Struktur zu Erläutern :D Tut mir leid^^

Also die classes sollen nicht on-the-fly geladen werden - die jar-Datei selbst provided eine weitere Prozesstruktur, in der die classes dann erst verwendet werden sollen, es wird quasi ein zweiter Prozess gestartet, wo die externen Klassen erst zur Verwendung kommen.

Bei starten der jar-Datei wird zuerst eine GUI geöffnet, wo der Benutzer Einstellungen vornehmen und, wenn benötigt, externe classes auswählen. Der Start-Knopf beendet dann die gui und übergibt sämtliche benötigten Parameter (Einstellungen und classes) an eine andere Klasse, die in der jar provided wird. Diese startet dann nacheinander die classes mit den gewünschten Einstellungen und gibt anschließend die Ergebnisse aus.
Da die externen classes die Voraussetzungen der Interfaces der jar-Datei erfüllen, sollte das eigentlich kein Problem sein, da die Liste der classes als Typ einfach das Interfaces gegeben hat (sollte eine Voraussetzung nicht erfüllt sein wird natürlich die Exception gefangen).
 

nethwa

Mitglied
Ich hatte vergessen die Struktur zu Erläutern :D Tut mir leid^^

Also die classes sollen nicht on-the-fly geladen werden - die jar-Datei selbst provided eine weitere Prozesstruktur, in der die classes dann erst verwendet werden sollen, es wird quasi ein zweiter Prozess gestartet, wo die externen Klassen erst zur Verwendung kommen.

Bei starten der jar-Datei wird zuerst eine GUI geöffnet, wo der Benutzer Einstellungen vornehmen und, wenn benötigt, externe classes auswählen. Der Start-Knopf beendet dann die gui und übergibt sämtliche benötigten Parameter (Einstellungen und classes) an eine andere Klasse, die in der jar provided wird. Diese startet dann nacheinander die classes mit den gewünschten Einstellungen und gibt anschließend die Ergebnisse aus.
Da die externen classes die Voraussetzungen der Interfaces der jar-Datei erfüllen, sollte das eigentlich kein Problem sein, da die Liste der classes als Typ einfach das Interfaces gegeben hat (sollte eine Voraussetzung nicht erfüllt sein wird natürlich die Exception gefangen).

Hab mich schnell mal registriert (sorry für den Doppelpost).
Das mit dem Plugin-System werde ich mir aber gleich mal ansehen, vielleicht ist das doch das, was ich meine, danke sehr.
 

irgendjemand

Top Contributor
also in dem fall könnte man sich das ganze ziemlich einfach machen in dem man im MANIFEST des jar als class-path einfach den entsprechenden unter-ordner angibt ... dadurch werden diese dann ebefalls geladen ...

zur prozessstruktur : is denke ich ein wenig overkill ... startest du denn wirklich einen seperaten prozess oder läuft alles innerhalb ein und derselben VM ab ?

auch könnte man bei dir fertige dinge anwenden ... stich worte wären z.b. SPI *ServiceProviderInterface* in verbindung mit dem ServiceLoader *gibt hier ein paar themen ... auch drüben auf Java @ tutorials.de: Tutorials, Forum & Hilfe gibt es zu SPI und plugin-system einige threads* ... OSGI *modul-basierte plattform* ... und natürlich das wichtigste : URLClassLoader

du könntest dir auch was einiges schreiben ...

ich habe z.b. selbst ein sehr stabiles plugin-system ...
ich poste dir einfach mal den source *leicht abgewandelt und auf das wesentliche gekürzt* ... ist zwar nicht ganz sauber und leider auch nicht mehr ganz so aktuell ... aber sehr robust und funktionsfähig ... *ich muss den code langsam echt mal updaten mit den ideen die ich noch dafür habe ... sorry für dieses "out-of-date" wirr-warr*

Plugin.java *ist das interface welches von den klassen implementiert werden muss*
Java:
public interface Plugin
{
	public void loadPlugin(PluginLoader loader) throws Exception;
	public void startPlugin() throws Exception;
	public void stopPlugin() throws Exception;
}

PluginLoader.java *ein interface welches von der klasse zu implementieren ist welche die "Plugin"s läd*
Java:
public interface PluginLoader
{
	public Object invoke(String pluginName, String pluginMethod, Object... args) throws Exception;
	public void shutdown();
}

LoaderImpl.java *eine zusammengeschnittene beispiel implementierung eines loaders*
Java:
public class LoaderImpl implements PluginLoader
{
	private Vector<Plugin> plugins=null;
	private PluginFilenameFilter pluginFilenameFilter=null;
	public static void main(String[] args) { (new LoaderImpl()).load(); }
	private LoaderImpl()
	{
		pluginFilenameFilter=new PluginFilenameFilter();
		plugins=new Vector<Plugin>();
	}
	private void load()
	{
		try
		{
			File pluginDir=new File("plugins");
			File[] pluginJars=pluginDir.listFiles(pluginFilenameFilter);
			for(File pluginJar : pluginJars)
			{
				String name="FAIL";
				JarFile jarFile=new JarFile(pluginJar);
				for(Enumeration<JarEntry> entries=jarFile.entries(); entries.hasMoreElements(); )
				{
					JarEntry entry=entries.nextElement();
					if(entry.getName().endsWith("Plugin.rsf"))
						name=(new BufferedReader(new InputStreamReader(jarFile.getInputStream(entry)))).readLine();
				}
				jarFile.close();
				if(name.equals("FAIL"))
					continue;
				URLClassLoader urlCL=new URLClassLoader(new URL[] { pluginJar.toURI().toURL() });
				Class<?> clazz=urlCL.loadClass(name);
				Plugin plugin=(Plugin)clazz.newInstance();
				plugin.loadPlugin(this);
				plugins.add(plugin);
			}
			for(Plugin plugin : plugins) { plugin.startPlugin(); }
		}
		catch(Exception e) { e.printStackTrace(); System.exit(1); }
	}
	public Object invoke(String pluginName, String methodName, Object... args) throws Exception
	{
		for(Plugin plugin : plugins)
		{
			Class<?> clazz=plugin.getClass();
			if(clazz.getName().equals(pluginName))
			{
					for(Method method : clazz.getDeclaredMethods())
					{
						if(method.getName().equals(methodName))
							return method.invoke(plugin, args);
					}
			}
		}
		return null;
	}
	public void shutdown()
	{
		for(Plugin plugin : plugins)
		{
			try { plugin.stopPlugin(); }
			catch(Exception e) { e.printStackTrace(); }
		}
		System.exit(0);
	}
	static final class PluginFilenameFilter implements FilenameFilter
	{
		public boolean accept(File path, String name)
		{
			if((name.toLowerCase().endsWith(".jar"))&&(!name.equals("Launcher.jar")))
				return true;
			else
				return false;
		}
	}
}

SamplePlugin.java *ein einfaches beispiel plugin*
Java:
public class SamplePlugin implements Plugin
{
	private PluginLoader pluginLoader=null;
	public void loadPlugin(PluginLoader pluginLoader) throws Exception { this.pluginLoader=pluginLoader; }
	public void startPlugin() throws Exception
	{
	}
	public void stopPlugin() throws Exception
	{
	}
}

das sample-plugin muss im ordner "plugins" in einem JAR liegen welches neben der CLASS und dem MANIFEST eine weitere datei enthält welche auf "Plugin.rsf" enden muss ... z.b. "SamplePlugin.rsf" ...
der inhalt dieser datei ist lediglich der volle class-name ...
wenn also deine SamplePlugin z.b. im package "something.plugins" liegt gehört in die rsf die zeile "something.plugins.SamplePlugins" ...

auch ist es dank der impl möglich methoden anderer plugins zu callen ...
dazu muss lediglich der volle class-name , der methoden-name sowie die methoden-parameter übergeben werden *entweder als Object-Array oder *dank der dynamischen programmierung* als einzelne parameter*

wenn "something.plugins.SamplePlugin" also z.b. die methode "machWas(int, Object)" der klasse "another.classes.AnotherPlugin" callen will sähe der aufruf so aus
Java:
pluginLoader.invoke("another.classes.AnotherPlugin", "machWas", 5, complexObjectReference);

das ganze wird dann im pluginloader wie zu sehen über reflections umgesetzt


wie gesagt ... das wäre jetzt mal so MEIN plugin-system als beispiel ...
ich selbst habe vor das ganze noch soweit zu ändern das man anstatt eines extra file einen manifest-eintrag verwendet um den zu ladenen klassen-namen zu bekommen ...
oder auch eine dynamische option WELCHE plugins überhaupt geladen werden sollen *für dich wichtig*
das könnte man z.b. so umsetzen das man den FilenameFilter ändert ...

ich hoffe ich kann dir damit wenigstens etwas helfen ...
 

nethwa

Mitglied
Also nen ganzes Plugin-System für ein einzelnes kleines Projekt zu schreiben wär nicht das richtige (zumal sich das mit dem Framwork beißen würde, mit dem ich arbeite [MASON-Framework für agentenbasierte Systeme]).
Ich werde erstmal probieren, dass ein jar-File alle Klassen aus einem Ordner mit einliest beim Start und das darüber zu machen.

Wenn ich eine galante Lösung gefunden habe schreib ich die hier noch rein^^
 

irgendjemand

Top Contributor
Ich werde erstmal probieren, dass ein jar-File alle Klassen aus einem Ordner mit einliest beim Start und das darüber zu machen.

wie bereits gesagt ... DAS geht einfach in dem du ins MANIFEST folgende zeile schreibst

"Class-Path: plugins"

und dann alle klassen in den unter-ordner "plugins" packst ...

aber wie ich das so rausgelesen habe willst du ja eine selektive auswahl der klassen die überhaupt geladen werden ... und da wist du wohl um ein etwas größes konstrukt mit selektivem URLClassLoader bzw ServiceLoader nicht herumkommen ...
 

nethwa

Mitglied
wie bereits gesagt ... DAS geht einfach in dem du ins MANIFEST folgende zeile schreibst

"Class-Path: plugins"

und dann alle klassen in den unter-ordner "plugins" packst ...
Genau damit wollte ich das testen und erstmal verwenden.

aber wie ich das so rausgelesen habe willst du ja eine selektive auswahl der klassen die überhaupt geladen werden ... und da wist du wohl um ein etwas größes konstrukt mit selektivem URLClassLoader bzw ServiceLoader nicht herumkommen ...
Das wird erst bei größeren Mengen an Klassen und sehr komplizierten Algorithmen nötig, aber ich glaube nicht, dass das Programm so exzessiv genutzt werden wird, als dass das nötig wäre.

Danke auf jedenfall für die Hilfe an alle
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Applet soll Html-File öffnen Java Basics - Anfänger-Themen 2
Timo12345 JNLP File mit Java öffnen Java Basics - Anfänger-Themen 2
I Bild richtig speichern / Hochkant im File Explorer, nach Upload vertikal Java Basics - Anfänger-Themen 9
R File.pathSeparator und File.separator Java Basics - Anfänger-Themen 46
KeinJavaFreak Erste Schritte Java "Executable Jar File" nicht vorhanden Java Basics - Anfänger-Themen 1
izoards Prunsrv - Windows Service - .bat file starten Java Basics - Anfänger-Themen 84
I File Uploader... Statusanzeige, Berechnung des Status etc. Java Basics - Anfänger-Themen 0
I H2 Datenbank starten / Daten in File speichern Java Basics - Anfänger-Themen 25
G jar file lässt sich nicht öffnen Java Basics - Anfänger-Themen 1
N Textdatei aus Resourcen-Ordner eines Projekts/ jar-file lesen Java Basics - Anfänger-Themen 4
J File length als Prüfwert für Download Java Basics - Anfänger-Themen 5
berserkerdq2 Überprüfen ob eine Schreibberechtigung auf ein file exisitert bzw. ob man dieses file löschen kann, wie? Java Basics - Anfänger-Themen 9
berserkerdq2 IOstreams, was unterscheidet file von z. B. BufferedWriter? Java Basics - Anfänger-Themen 11
J Datentypen String in File konvertieren funktioniert nicht Java Basics - Anfänger-Themen 4
A java jar-File Java Basics - Anfänger-Themen 1
E Executable jar file fehler Java Basics - Anfänger-Themen 9
I Upload File zu einem Webservice Java Basics - Anfänger-Themen 17
I ZIP File erstellen Java Basics - Anfänger-Themen 10
LeoDerKek Textdatei in JAR-File Java Basics - Anfänger-Themen 4
Tom/S File Java Basics - Anfänger-Themen 10
AleXusher Mehrdimensionales Array aus txt.file auslesen Java Basics - Anfänger-Themen 4
A Checkstyle - File contains tab characters Java Basics - Anfänger-Themen 2
H Java file nicht gefunden Java Basics - Anfänger-Themen 5
C File speichern Java Basics - Anfänger-Themen 5
C Runnable Jar-File erzeugen Java Basics - Anfänger-Themen 14
C Pfad zu Properties-File bei ResourceBundle Java Basics - Anfänger-Themen 7
F GSON file mit einer List erstellen Java Basics - Anfänger-Themen 2
rafi072001 Lesen aus einem Excel File Java Basics - Anfänger-Themen 10
C Bild in executable JAR File mitgeben Java Basics - Anfänger-Themen 5
K File (png) in Image laden Java Basics - Anfänger-Themen 3
B Inputstream in file schreiben? Java Basics - Anfänger-Themen 23
S Input/Output Reader/Writer finden file nicht Java Basics - Anfänger-Themen 3
T Buffered Stream leert Txt File Java Basics - Anfänger-Themen 3
A 2d Arrays aus txt.file einlesen Java Basics - Anfänger-Themen 16
Dimax In Java File (nicht in Java Projekt) mysql Driver importieren Java Basics - Anfänger-Themen 3
K File wird in der .Jar nicht gefunden Java Basics - Anfänger-Themen 3
E TXT FILE EINLESEN Java Basics - Anfänger-Themen 4
Trèfle EXCEL-File Laufwerkunabhängig einbinden. Java Basics - Anfänger-Themen 1
B HTML File einlesen inkl. Bilder? Java Basics - Anfänger-Themen 2
B Hilfe bei InputStream To File Java Basics - Anfänger-Themen 22
topi relativer Pfad in einem Runnable JAR file Java Basics - Anfänger-Themen 12
A jar File kleiner bekommen Java Basics - Anfänger-Themen 3
B File öffnen in src/main/webapp Java Basics - Anfänger-Themen 4
K File-Name Vergleich Java Basics - Anfänger-Themen 2
krgewb Runnable JAR File Export Java Basics - Anfänger-Themen 11
S Maxium aus einer File finden Java Basics - Anfänger-Themen 12
dapzoo Class File Version zu niedrig? Ausführen über Eingabeaufforderung nicht möglich Java Basics - Anfänger-Themen 14
D Input/Output File exists canRead canWrite Java Basics - Anfänger-Themen 11
B cal4j - Error at line 1:Unexpected end of file Java Basics - Anfänger-Themen 0
P jar file lässt sich nicht ausführen Java Basics - Anfänger-Themen 4
E Best Practice Jar-file mit zwei Klassen und externer Bibliothek über Konsole erzeugen Java Basics - Anfänger-Themen 13
M Erste Schritte CSV-File einlesen und Daten verarbeiten Java Basics - Anfänger-Themen 5
F File von Windowsfreigabe laden Java Basics - Anfänger-Themen 1
S java.nio.file.FileSystemException bei Dateizugriff vermeiden Java Basics - Anfänger-Themen 7
Vince42 NIO File Tree in XML umwandeln Java Basics - Anfänger-Themen 10
J Zweidimensionales Array in CSV File exportieren Java Basics - Anfänger-Themen 3
E War-File Problem mit Eclipse Java Basics - Anfänger-Themen 3
B Excel File einlesen und Überschrift prüfen Java Basics - Anfänger-Themen 8
M Email versenden Outlook, attached File, ohne Anmeldung Java Basics - Anfänger-Themen 4
M Input/Output Word File Kopieren Java Basics - Anfänger-Themen 12
K Runable Jar File erstellen Java Basics - Anfänger-Themen 17
T Java Executable jar file funktioniert nicht Java Basics - Anfänger-Themen 4
sourcecorn Werte aus einem File lesen Java Basics - Anfänger-Themen 6
Kopak'rraf Korruptes zip File. Java Basics - Anfänger-Themen 0
T File für Einstellungen wird nicht geladen Java Basics - Anfänger-Themen 1
S Sounddatei in Jar File integrieren Java Basics - Anfänger-Themen 2
S Index File bauen Java Basics - Anfänger-Themen 5
T Anzeige, wie lange es noch dauert bis ein File gesendet ist. Java Basics - Anfänger-Themen 2
T filereader , file aus programm einlesen Java Basics - Anfänger-Themen 12
Ghostman1711 Itext PDF print File gelockt by Java Java Basics - Anfänger-Themen 15
N Email mit Anhang - File not Found Java Basics - Anfänger-Themen 1
K Interface Kein Bild im .jar-File Java Basics - Anfänger-Themen 15
S Bild in Jar-File mit ImageIO Java Basics - Anfänger-Themen 50
Syncopated Pandemonium Compiler-Fehler The constructor MP3File(File) refers to the missing type NoMPEGFramesException Java Basics - Anfänger-Themen 7
S File mit canRead() testen Java Basics - Anfänger-Themen 4
A file.delete funktioniert nicht Java Basics - Anfänger-Themen 15
K Classpath Lesen von Property-File Java Basics - Anfänger-Themen 1
S jar file Java Basics - Anfänger-Themen 19
B Fragen zu ZIP-File Java Basics - Anfänger-Themen 9
B Dateityp von File bekommen Java Basics - Anfänger-Themen 2
I Automatisch Verzeichnis erstellen bei File erstellen Java Basics - Anfänger-Themen 5
E Große Datenmengen effizient in CSV File speichern Java Basics - Anfänger-Themen 4
I String zu File umwandeln Java Basics - Anfänger-Themen 2
N File virtuell ByteStream Java Basics - Anfänger-Themen 11
X Übergabeparameter Konstruktor (File) Java Basics - Anfänger-Themen 13
Anfänger2011 file.isDirectory() liefert falschen Wert!? Java Basics - Anfänger-Themen 1
ms_cikar Jar file mit resource erzuegen Java Basics - Anfänger-Themen 28
E lesen csv file column by column Java Basics - Anfänger-Themen 10
U Anhand von Ant ein War-File erstellen Java Basics - Anfänger-Themen 0
B Quellcode einelsen "line by line" (und abspeichern in file (txt) Java Basics - Anfänger-Themen 7
O Zip-File Inhalt einlesen Java Basics - Anfänger-Themen 3
V Erste Schritte Dateinamen aus einer FIle[] in eine List Java Basics - Anfänger-Themen 11
P Jar File Java Basics - Anfänger-Themen 3
B Probleme bei "Daten in CSV File schreiben". Java Basics - Anfänger-Themen 9
S CSV File - "Vergleichen und Sortieren" Java Basics - Anfänger-Themen 3
T Wieso kann ich das jar file nicht starten? Java Basics - Anfänger-Themen 5
S Resourcen-Dateien im Jar-File verfügbar machen (Intellij 14) Java Basics - Anfänger-Themen 14
A Wieso übergibt der nicht die bearbeitete txt file Java Basics - Anfänger-Themen 8
Ruvok Executable Jar File startet nicht Java Basics - Anfänger-Themen 3
R Ini File erstellen Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben