Realisierung einer "Plugin-Schnittstelle":

Ulathar

Aktives Mitglied
Hallo,
ich habe da auch mal wieder eine Frage. Und zwar Frage ich mich und hiermit euch, wie man am sinnvollsten vorgehen sollte, wenn man einem Programm die Möglichkeit geben will, dass andere Entwickler für dieses Programm Plugins schreiben können.
Am besten ohne direkten Zugang zum eigendlichen Sourcecode zu haben.

Ein simples Beispiel was mir da so in etwa vorschwebt:

Ich habe ein GUI, das in seiner Menubar irgendwo das MenuItem "Plugins" enthält.
Dieses MenuItem Plugins soll nun sämtliche "Plugins" enthalten, die in form eines z.b. JARs in dem ordner /plugins/ liegen.

Bei einem Klick auf das jeweilige Plugin soll dann logischer weise das JAR ausgeführt werden, am besten mit gewissen übergabeparametern/daten aus dem eigendlichen GUI und dann auf die "Antwort" des Plugins gewartet werden, also am Ende des Plugins sollen ver/bearbeitete Daten an das GUI zurückgeliefert werden.

Hoffe es ist klar was ich in etwa meine.
Mein erster Ansatz wäre dazu bei Programmstart (ehe das GUI gebaut wird) den Ordner zu scannen und für jedes dort gefundene JAR ein MenuItem zu erzeugen.
Anschließend würde ich bei einem Klick auf das Item das jeweilige JAR executen lassen. Nur wie kann ich an dieser Stelle dann z.B. auf die Rückgabe warten? (das können ettliche hundert MB an daten werden theoretisch!).

Falls der Ansatz totaler Mist ist und es dafür bessere Bordmittel oder ähnliches gibt, bin ich für jeden Hinweis natürlich dankbar ;).
 
T

Tomate_Salat

Gast
Ich würde hierfür mind. OSGi und am besten gleich RCP verwenden. Bei letzterem kannst du Plugins schreiben, die genau die Möglichkeiten bieten, wie du sie von Eclipse kennst.
 
N

nillehammer

Gast
Hallo,
Du definierst drei Regeln, an die sich Deine Plugin Entwickler halten sollen:
1. Sie müssen ein Interface implementieren, dass Du definierst. In diesem spezifizierst Du, was Du an Funktionalität von Plugins erwartest.
2. Sie sollen Dir ihre Plugins als jar ausliefern. In dieser jar gibt es die Datei "META-INF/MANIFEST.MF" ist Standard bei jars. In dieser Datei sollen sie einen Eintrag machen, der den voll qualifizierten Klassennamen ihrer implementierenden Klasse spezifiziert.
3. Du sagst den Plugin Entwicklern, dass diese Klasse einen public no argument Konstruktor haben muss.

Wenn die Plugin Entwickler sich an die Regeln halten und Dir ihre jars geschickt haben, pacskt Du sie mit zu den libs Deiner Anwendung. Beim Start der Anwendung machst Du dann folgendes:
1. Du holst Dir die URLs aller MANIFEST.MF (siehe hierzu di Methode getResources von ClassLoader: ClassLoader (Java Platform SE 6)) )
2. Du machst aus jeder gefundenen MANIFEST.MF ein Manifest Objekt (Manifest (Java Platform SE 6)) Mit diesem kannst Du dann nach dem in Regel 2 spezifizierten Klassennamen schauen und ihn Dir z.B. in einer Liste merken, wenn er vorhanden ist.
3. Du gehst die Liste mit den Klassennamen durch und lädst Dir die Klasse mit: Class.forName(...) (Class (Java Platform SE 6))
4. Mit der geladenen Klasse erzeugst Du die Instanz der Plugin Implementierung mitttels der Methoden Class.getConstructor().newInstance();
 

planetenkiller

Aktives Mitglied
Hallo,
Du definierst drei Regeln, an die sich Deine Plugin Entwickler halten sollen:
1. Sie müssen ein Interface implementieren, dass Du definierst. In diesem spezifizierst Du, was Du an Funktionalität von Plugins erwartest.
2. Sie sollen Dir ihre Plugins als jar ausliefern. In dieser jar gibt es die Datei "META-INF/MANIFEST.MF" ist Standard bei jars. In dieser Datei sollen sie einen Eintrag machen, der den voll qualifizierten Klassennamen ihrer implementierenden Klasse spezifiziert.
3. Du sagst den Plugin Entwicklern, dass diese Klasse einen public no argument Konstruktor haben muss.

Wenn die Plugin Entwickler sich an die Regeln halten und Dir ihre jars geschickt haben, pacskt Du sie mit zu den libs Deiner Anwendung. Beim Start der Anwendung machst Du dann folgendes:
1. Du holst Dir die URLs aller MANIFEST.MF (siehe hierzu di Methode getResources von ClassLoader: ClassLoader (Java Platform SE 6)) )
2. Du machst aus jeder gefundenen MANIFEST.MF ein Manifest Objekt (Manifest (Java Platform SE 6)) Mit diesem kannst Du dann nach dem in Regel 2 spezifizierten Klassennamen schauen und ihn Dir z.B. in einer Liste merken, wenn er vorhanden ist.
3. Du gehst die Liste mit den Klassennamen durch und lädst Dir die Klasse mit: Class.forName(...) (Class (Java Platform SE 6))
4. Mit der geladenen Klasse erzeugst Du die Instanz der Plugin Implementierung mitttels der Methoden Class.getConstructor().newInstance();

Geht mit ServiceLoader (Java Platform SE 6) viel einfacher.
Die Jars können zur Laufzeit mit URLClassLoader (Java Platform SE 6) geladen werden.
 

Landei

Top Contributor
Zuletzt bearbeitet:

Ulathar

Aktives Mitglied
Danke euch erstmal für die Denkanstöße, ich denke ich werde mir das mit den Services näher ansehen, da das am einfachsten/schnellsten zu realisieren zu sein scheint (habe nur wenig Zeit mein Programm um diese Funktionalität zu erweitern, daher muss es was Quick & Dirty für den Anfang sein ^^).

Das Problem ist, dass die potentiellen Plugin-Entwickler ihre JARs nicht an mich schicken werden (wie oben vorgeschlagen), sondern eher ich mein Programm "ausliefer" und die die damit arbeiten dann weiß der Geier was damit anstellen werden (in Bezug auf Plugins).

Ich nehme an, über das Service Provider Interface regel ich dann auch die Datenübermittlung vom Hauptprogramm zum Plugin zurück zum Hauptprogramm?
Falls jemand noch Codeschnipsel rumliegen hat nehm ich die auch gern, wird aber auch so gehen, sind ja ein paar Beispiele auf den oben verlinkten Seiten!

Bin dann mal lesen, ist n völlig neues Kapitel für mich ;).
 
Zuletzt bearbeitet:
N

nillehammer

Gast
Geht mit ServiceLoader (Java Platform SE 6) viel einfacher.
Die Jars können zur Laufzeit mit URLClassLoader (Java Platform SE 6) geladen werden.
Stimmt, ich konnte mich nur nicht mehr erinnern, wie der Mechanismus heißt und konnte deswegen bei google keinen vernünftigen Suchbegriff eingeben, um den Link zu finden. Danke für's Posten, jetzt finde ich ihn immer wieder:
 

TheDarkRose

Gesperrter Benutzer
Das Problem ist, dass die potentiellen Plugin-Entwickler ihre JARs nicht an mich schicken werden (wie oben vorgeschlagen), sondern eher ich mein Programm "ausliefer" und die die damit arbeiten dann weiß der Geier was damit anstellen werden (in Bezug auf Plugins).
Um Tomate_Salat zu zitieren.
Ich würde hierfür mind. OSGi und am besten gleich RCP verwenden. Bei letzterem kannst du Plugins schreiben, die genau die Möglichkeiten bieten, wie du sie von Eclipse kennst.
Eclipse RCP ist für sowas de facto schon fast "Industriestandard" ;) Damit kenne sich relativ viele Entwickler aus, ist ausgereift und getestet und fremde Entwickler müssten sich nicht in irgendwelche Eigenimplementierungen einarbeiten. Und du ersparst dir auch jede Menge Zeit.
 

Ulathar

Aktives Mitglied
Ich muss das Thema leider doch noch mal aufgreifen.
Ich hatte endlich die Zeit mich etwas intensiver damit zu befassen und habe nun für den Anfang einmal versucht das Beispiel aus Creating Extensible Applications With the Java Platform , bzw Service Provider Interface: Creating Extensible Java Applications - Developer.com in mein bereits bestehendes Projekt zu integrieren.
Ich bin mir auch (fast) sicher, dass der Code an sich stimmt, aber die Plugins funktionieren dennoch nicht und ich find nicht den Grund dafür.

Meine Struktur:

Hauptprogramm besteht aus 17 Packages, relevant wären die folgenden 3 Packages:
main
spi
plugin

im package main liegt die Main-Class, in spi liegt das Interface (Dictionary im Beispiel) und in plugin liegt die Implementierung des Interface ServiceProvider (GeneralDictionary im Beispiel).

In der MainClass führe ich folgenden Test der "Plugins" durch:
Java:
PluginService plug = PluginService.getInstance();
System.out.println("Test1 mit Test:  " + plug.getDefinition("Test"));
System.out.println("Test2 mit book:  " + plug.getDefinition("book"));
System.out.println("Test3 mit XML:   " + plug.getDefinition("XML"));

Also ebenfalls analog zu dem Beispiel. Ich erhalte als Rückgabe aber immer "null", was höchst wahrscheinlich daran liegt, dass mein Programm die 2 Plugins nicht korrekt erkennt.

Hier mal eines der Plugins:

Java:
package plugin;

import java.util.SortedMap;
import java.util.TreeMap;

import spi.Plugin;


public class ExamplePlugin implements Plugin {	

    private SortedMap<String, String> map;

    /** Creates a new instance of GeneralDictionary */
    public ExamplePlugin() {
        map = new TreeMap<String, String>();
        map.put("book", "a set of written or printed pages, usually bound with " +
                "a protective cover");
        map.put("editor", "a person who edits");
    }

    
    public String getDefinition(String word) {
        return map.get(word);
    }
}


Jedes Plugin ist dabei ein eigenes Projekt, hoffe das ist richtig so... Damit der Code compiliert muss ich allerdings dem Projekt mein Hauptprojekt (für das das Plugin sein soll) in form eines external JARS mit in den Buildpath aufnehmen (da er logischerweise sonst das Plugin-Interface nicht kennt).

Das Plugin verpacke ich dann wie im Beispiel angegeben in ein Jar. Das JAR sieht dann folgendermaßen aus:

[plugin] -> ExamplePlugin.class
[META-INF] -> [services] -> spi.Plugin

in der spi.Plugin Datei steht folgendes:
plugin.ExamplePlugin


Das müsste doch so alles passen oder nicht? Ich blick einfach nicht wo der Fehler ist :(.
Das exportierte Plugin-JAR habe ich natürlich in enen Unterordner meines Hauptprojekts kopiert, der im CLASSPATH liegen müsste.

Kann bei Bedarf auch noch weiteren Code (oder auch die Sources selbst) anbieten, aber da ich bis auf einige Namen quasi 1:1 die Struktur der beiden Beispiele beibehalten habe könnte das auch da eingesehen werden.


Gibt es alternativ noch andere Lösungen mit denen ich Ziel erreichen könnte? (es genügt, wenn ich ein JAR aus meinem Programm heraus mit gewissen Übergabeparatern, z.b. einem String[], starten könnte und dann auf eine Antwort, wieder ein String[], des externen JARS warte, weiß aber nicht ob das mit JARs überhaupt so möglich ist).
 
Zuletzt bearbeitet:

Wildcard

Top Contributor
Das exportierte Plugin-JAR habe ich natürlich in enen Unterordner meines Hauptprojekts kopiert, der im CLASSPATH liegen müsste.
Wenn ein Verzeichnis im Classpath liegt, heißt das noch nicht das die jars in diesem Verzeichnis auch im Classpath liegen. Insbesondere aus der IDE heraus solltest du die jars im Verzeichnis explizit in den Classpath aufnehmen.
Gibt es alternativ noch andere Lösungen mit denen ich Ziel erreichen könnte?
Hier wurde doch schon erwähnt das OSGi/Eclipse RCP die Standardlösung für diese Art Problem ist.
 

Ulathar

Aktives Mitglied
Leider is OSGi/RCP für mich zum jetzigen Zeitpunkt keine Option weil die Zeit die ich benötigen würde um mich in RCP einzuarbeiten und dann mein Projekt darauf zu portieren einfach nicht da ist (habe über 60 Klassen mittlerweile). Wenn ich das so überfliege (z.B. Eclipse RCP Tutorial) scheint das leider nicht ansatzweise mit meinem bisherigen Projekt kompatibel zu sein :(.

Was das hinzufügen der Jars betrifft:
habe es gerade aus Eclipse heraus probiert und es scheint zu funktionieren, aber es ist problematisch, wenn ich für jedes Plugin das irgendwer geschrieben hat das Projekt neu builden müsste (die Anwender starten das Tool nicht über Eclipse sondern über einen mit launch4j erzeugten launcher)...

Danke jedenfalls für den Hinweis mit dem expliziten hinzufügen. Nun weiß ich wenigstens, dass der Code an sich korrekt ist.
Jetzt muss ich "nur" noch eine Lösung dafür finden, wie ich die JARs automatisch adden kann ohne jedes mal das Programm neu builden zu müssen (das ist deployment technisch nicht möglich).

Es muss doch möglich sein, alle JARs aus einem ordner "automatisch" dem classpath hinzuzufügen...

Die Struktur ist momentan folgende:

.../programm/Launcher.exe
.../programm/bin/hauptjar (wird vom Launcher gestartet)
.../programm/lib/jdbctreiber, jogl, etc liegt hier
.../programm/res/hier sind dinge wie icons, sound, etc
.../programm/plugins/alle plugin jars
 
Zuletzt bearbeitet:

TheDarkRose

Gesperrter Benutzer
Damit war ja nicht gemeint das du alles auf Eclipse RCP umstellen solltest. OSGI ist auch ohne Eclipse RCP lauffähig und eigentlich Standard bei Pluginanwendungen. So schwer dürfte es nicht sein, auf deinen Klassen OSGI Bundles zu machen.
 

Wildcard

Top Contributor
habe es gerade aus Eclipse heraus probiert und es scheint zu funktionieren, aber es ist problematisch, wenn ich für jedes Plugin das irgendwer geschrieben hat das Projekt neu builden müsste (die Anwender starten das Tool nicht über Eclipse sondern über einen mit launch4j erzeugten launcher)...
Mir ist schon klar das die Anwender das nicht über Eclipse machen, aber du musst das in Eclipse so machen.
Fürs Deployment ist ein üblicher Weg ein 'lib' oder 'plugins' Folder und ein Startscript das den Classpath passend setzt.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Realisierung einer dynamischen Tabelle unter Android Allgemeine Java-Themen 3
M Technische Realisierung von Atomic Datentypen Allgemeine Java-Themen 16
GenerationLost Input/Output Custom Serialization - hilfe bei Realisierung Allgemeine Java-Themen 8
C Projekt Realisierung Allgemeine Java-Themen 7
F Design Pattern zur Realisierung von Mehrfachvererbung? Allgemeine Java-Themen 8
X Realisierung eines GUI-Segments Allgemeine Java-Themen 2
M Idee zur Realisierung eines Hotkeymanagers in Java Allgemeine Java-Themen 2
clemson Realisierung verschiedener Datenspeicherungen Allgemeine Java-Themen 8
O Text aus einer Textdatei rausholen, der zwischen zwei Schlüsselworten steht Allgemeine Java-Themen 4
V Umgang mit fehlenden Daten in einer Java-Datenanalyseanwendung Allgemeine Java-Themen 5
M Methodenübersicht einer Klasse einsehen Allgemeine Java-Themen 14
T JNA, Aufruf der Funktionen einer dll Allgemeine Java-Themen 5
I Vom Monolith zu Services in einer Webseite Allgemeine Java-Themen 1
W Variable Initialisierung mit dem Ergebnis einer Regex Allgemeine Java-Themen 1
O Werte einer Generic LinkedList zusammenrechenen Allgemeine Java-Themen 14
C Sortieren und Selektieren einer ArrayList<Point3D> Allgemeine Java-Themen 6
A Einzelne Objekte und Unterobjekte einer ArrayList ausgeben Allgemeine Java-Themen 53
TheSepp Wie kann man Leerzeichen aus einer Array liste entfernen? Allgemeine Java-Themen 10
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
I Wie kann ich den Wert aus einer If abfrage ausgeben Allgemeine Java-Themen 23
S HTML einer Webseite 1:1 so bekommen wie es auch der Browser anzeigt? Allgemeine Java-Themen 14
melaniemueller Einzelne Zeile aus einer txt Datei in einem String speichern Allgemeine Java-Themen 12
L Java überprüfen lassen, ob sich ein gegebener Pfad / das Programm an sich auf einer CD oder Festplatte befindet Allgemeine Java-Themen 14
J (Geplante) Änderungen an einer Datei vorübergehend speichern und anwenden? Allgemeine Java-Themen 12
ME2002 Fragen aus einer Java Klausur Allgemeine Java-Themen 67
_user_q Obfuscate einer .jar-Datei mit ProGuard? Allgemeine Java-Themen 2
_user_q Verknüpfung einer .jar-Datei (liegt z. B. auf dem Desktop) im Autostart-Ordner erstellen? Allgemeine Java-Themen 20
C Parsen einer sich updatenden Html mithilfe von jsoup Allgemeine Java-Themen 4
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
H Performance einer Monte-Carlo-Simulation verbessern Allgemeine Java-Themen 6
LimDul Kam eine java.net.URL zu einer HashMap und ging als DNS Anfrage wieder heraus Allgemeine Java-Themen 18
E Variablen Nach Übergabe einer Variable den Constructor aufrufen Allgemeine Java-Themen 16
Zeppi NullPointerException in einer if-Abfrage Allgemeine Java-Themen 6
D Abbruch einer ViewScoped Bean in Arbeit Allgemeine Java-Themen 2
Lukas2904 Schleife mit ansteuerung einer Klasse Allgemeine Java-Themen 5
d.lumpi Aus Einer Klasse auf ein Objekt einer anderen Klasse Zugreifen Allgemeine Java-Themen 1
Lukas2904 Wie kann man cps (ClicksPerSecond) in einer GUI anzeigen lassen? Allgemeine Java-Themen 4
O Produziert das Tool "jpackage" (ab JDK 14) .exe Dateien, die auf einer Zielumgebung ohne JRE lauffähig sind ?` Allgemeine Java-Themen 7
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
N BlueJ Implementation einer Analoguhr Allgemeine Java-Themen 0
O Formatierte String ausgabe bei vier Variablen in einer Zeile Allgemeine Java-Themen 1
N Speicherort einer Datei im Explorer ändern Allgemeine Java-Themen 8
O Datentypen Wie kann ich den Typ einer ArrayList abfragen ? Allgemeine Java-Themen 7
O Leerzeichen und Umlaute im Pfad einer Java Applikation machen Probleme Allgemeine Java-Themen 13
H Mehrere PNG-Files in einer Datei Allgemeine Java-Themen 9
G Java Editor Löschen doppelter Zahlen einer Liste Allgemeine Java-Themen 2
J JSON Daten von einer Webseite erhalten Allgemeine Java-Themen 2
L RegEx für Teile einer Berechnung Allgemeine Java-Themen 14
L Erste Schritte TDD testen einer Methode mit injezierten Services? Allgemeine Java-Themen 12
J Zerlegen einer Zahl Allgemeine Java-Themen 6
Zrebna Wie kann man endgültig aus einer Rekursion ausbrechen? Allgemeine Java-Themen 14
MiMa Person in einer Arraylist hinzugügen mit Prüfung ? Allgemeine Java-Themen 6
Meeresgott Effizientester Weg um nach der Value einer verschachtelten Map aufzulösen Allgemeine Java-Themen 5
H Mehrere Datentypen in einer Arraylist speichern Allgemeine Java-Themen 9
MiMa Prüfziffer einer EAN Nummer berechnen Allgemeine Java-Themen 4
MiMa Erstellungsdatum einer Datei Allgemeine Java-Themen 10
Drachenbauer Wie kann ich einer existierenden Enum von außerhalb veränderte Werte zuweisen? Allgemeine Java-Themen 5
S HTML den ich von einer URL hole nicht identisch mit dem HTML im Browser Allgemeine Java-Themen 1
S Rückgabe einer HttpURLConnection für eine Seite einlesen bei der man eingeloggt ist..? Allgemeine Java-Themen 5
O Java-Applikation tut in Netbeans, als JAR nicht, wegen Pfadangaben einer benötigten Datei Allgemeine Java-Themen 8
M Hilfe bei einer Java Programmieraufgabe! Ab morgen Montag um 08:00 Uhr Allgemeine Java-Themen 5
J Algorithmen Analyse einer Schleife Allgemeine Java-Themen 6
Drachenbauer Wie finde ich den Aufrufer zu einer Methode, die sich nicht in meinem Projekt befindet? Allgemeine Java-Themen 2
J Die Letzte Zahl aus einer Text datei lesen Allgemeine Java-Themen 8
P einen public <Optinal String> in einer anderen Klasse mit einem Int vergleichen Allgemeine Java-Themen 2
A Mithilfe von einer Nummer einen Namen finden n-Beziehung Allgemeine Java-Themen 8
Scream_ilias Auf einer Website die anmeldedaten eingeben Allgemeine Java-Themen 9
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
I Lohnt sich heutzutage der Aufwand einer Portierung für MacOS Allgemeine Java-Themen 8
J Suchen von einer Scannereingabe in einem HashSet Allgemeine Java-Themen 1
M Konstruktor einer Methode Allgemeine Java-Themen 35
L Echtzeitdaten aus einer Webseite ziehen mit Java Allgemeine Java-Themen 19
V EMail, Attachments auslesen von einer Email Allgemeine Java-Themen 0
T Google Links in einer Liste Allgemeine Java-Themen 4
T Sinn einer toString Methode Allgemeine Java-Themen 3
P Durchlaufen einer Queue Allgemeine Java-Themen 9
J Größe einer CD ermitteln Allgemeine Java-Themen 10
L Operatoren Java Reflections: Alle Methoden einer Klasse aufrufen ohne Exceptions Allgemeine Java-Themen 5
H Länge einer verketteten Liste Allgemeine Java-Themen 4
B Quellcode einer Java libary finden um zu copy & paste'n Allgemeine Java-Themen 5
N Daten einer JCoTable in JTextArea anzeigen Allgemeine Java-Themen 7
sascha-sphw Java 9 module Zugriff auf eine resource einer anderen JAR Allgemeine Java-Themen 0
N Generic Type einer Generischen Klasse während der Laufzeit bekommen Allgemeine Java-Themen 2
E Erstellen einer Liste mit einer maximalen Menge an Elementen Allgemeine Java-Themen 13
M Wie kann ich ein int[] Array in einer Methode benutzen? Allgemeine Java-Themen 6
T Compiler-Fehler NoClassDefFoundError beim Laden einer Class Allgemeine Java-Themen 11
H Klassen LibGDX - Verschiedene Klassen als Value in einer Map Allgemeine Java-Themen 8
P Element einer Liste wurde hinzugefügt, aber es gibt keinen Zugriff Allgemeine Java-Themen 2
E Elemente innerhalb einer ArrayList vergleichen Allgemeine Java-Themen 33
J Einen Thread in einer Schleife Allgemeine Java-Themen 2
temi Java Programm aus einer DB laden und starten Allgemeine Java-Themen 2
J int Werte in einer anderen Klasse in Arrays speichern Allgemeine Java-Themen 3
S Hilfe bei dem Auslesen einer YAML Datei Allgemeine Java-Themen 8
D Warum kann ich eine (deflaut) Klasse aus einer Libary in einem anderen Projekt benutzen? Allgemeine Java-Themen 3
B Generelle Frage bei einer Webanwendung / Reduzierung von DB Abfragen Allgemeine Java-Themen 1
ReinerCoder Methode einer Klasse meldet Fehler "misplaced construct(s)" Allgemeine Java-Themen 13
L Fehler bei der Ausführung einer Jar Allgemeine Java-Themen 2
Javafan01 Deklarieren einer Math.random() Zufallszahl Allgemeine Java-Themen 16

Ähnliche Java Themen

Neue Themen


Oben