Java-Konsolenanwendung mit Parameterübergabe (Windows)

piu58

Mitglied
Liebe Java-Gemeinde,

ich schreibe meist Konsolenanwendungen, tw. mit grafischer Ausgabe. Für den Start einer Java-Anwendung habe ich noch keine vernünftige Variante des Aufrufs gefunden.

Mich interessiert der Direkt-Aufruf vom Main.Main. Ich weiß, dass es mit jar-Dateien mehr Möglichkeiten gibt. Da ich aber meist der einzige Nutzer der Programme bin, ist es chic, einfach was in Eclipse zu ändern und dann ist es ausführbar.

Die Primitiv-Version ist

Java:
pushd .
cd <bin-Vz>
java Main.Main %1 %2 %3 %4 %5 %6 %7 %8 %9
popd
(Das ist natürlich kein Java-Code, aber zumindest Code 🙂 )


Das hat erst mal den Nachteil, dass man nur 9 Parameter übergeben kann, das reicht meist nicht. Mit dem Batch-Befehl Shift bekomme ich auch das hin:

Java:
@echo off
pushd .
cd <bin>
set /p ="java Main.Main "<nul > myBatchfile.bat
:Loop
IF "%1"=="" GOTO Continue
set /p =" %1 "<nul >> myBatchfile.bat
SHIFT
GOTO Loop
:Continue
call myBatchfile.bat
del myBatchfile.bat
popd

Damit kommt man ziemlich weit. Es bleibt ein Problem: Oft müssen Dateinamen angegeben werden. Die Start-Batch-Datei liegt irgendwo im Suchpfad, ist also ausführbar. Die Dateien liegen üblicherweise im Punkt-Verzeichnis. Wenn ich diese – ggf. mit automatischer Dateinamensergänzung – eintrage, findet der Aufruf sie nicht, weil er ja zur Laufzeit im bin-Verzeichnis steht. Ich muss also den vollen Pfadnamen hinschreiben, das ist umständlich und für Fremde verwirrend.

Hat dafür jemand eine vernünftige Lösung?
 
Zuletzt bearbeitet:
In Batchdateien kenne ich auch "nur" shift, bei mehr als 9 Parametern.

Es gibt noch %* als "Restliche Parameter"

Dein Problem des Pfades bei Dateiangaben löse ich immer mit dem CLASSPATH.

Im untenstehenden Programm können BELIEBIG viele Argumente angegeben werden. Dieses sollen Dateinamen sein.
Klar ist ja, wenn ich in einem anderen Verzeichnis beim Start bin, muss irgendetwas diese Dateien trotzdem finden können.

Dafür gibt es aber den Classpath. Java-Klassen werden ja auch darüber geladen. Warum also nicht darüber auch allgemeine Dateien laden?

Dies kann beim Aufruf via Batchprogramm einfach angegeben werden (-cp <xxx>) und schon findet das Programm unten die angegebenen Dateien, egal von wo ich es starte.

Java:
    public static void main(String[] args) throws URISyntaxException {
	for (String string : args) {
	    URL resource = ClassLoader.getSystemClassLoader().getResource(string);
	    if (resource != null) {
		File file = new File(resource.toURI());
		if (file.exists()) {
		    System.err.println(file.getAbsolutePath() + " gefunden");
		}
	    } else {
		System.err.println(string + " nicht gefunden");
	    }
	}
    }
 
1: ist zwar kein Java aber beim Batch kannst du statt den %1 %2 etc einfach %* übergeben.
Dann werden alle Parameter weitergereicht!

2: warum verwendest du ein Package?
Wenn du in deinem Java-Code kein Package verwendest, kannst du sie direkt aus deinem '.' Pfad aufrufen.
 
Recht vielen Dank. Die Kombination der beiden vorgeschlagenen Lösungsschnipsel (classpath und %*) führt zu einer wirklich einfachen Lösung. Ich wusste, es *musste* so etwas geben.
 
Zuletzt bearbeitet:

Zurück
Oben