# Konsolenbefehl für Javaprogramm herausfinden?



## berndoa (16. Okt 2022)

Hallo,
ich stelle die Frage mal hier in dem Unterforum da es hier vermutlich am besten passt.
Ich habe in Eclipse ein JavaProgramm mit dutzenden Klassen gebaut, eine verwendete .jar Datewi ist auch im Workspace lib Ordner sowie .odt und txt Dateien im Workspace Ordner, die gelesen und verändert werden.

Funktioniert auch wunderbar wenn ich es in Eclipse ausführen lasse.

Nur ist es nun so dass ich mittels Windows Scheduler es gerne so machen würde dass bspw. jeden Tag mittags um 15 Uhr mein programm ausgeführt wird, was ja mit Eclipse nicht so geht bzw. nicht mein ziel ist.
Ich will mir eine .cmd Datei bauen, die den nötigen javac und java Befel drin hat und die eben zu jener Zeit ausgeführt wird.

Frage ist nur, wie müssen die nötigen Konsolenbefehle aussehen?
Wie komme ich vom in Eclipse funktionierenden Programm zu den entsprechenden konsolenbefehlen für java Compiler und Co. mit denen ich das selbe hinkriege?
Habe mir mit einer entspechenden Testklasse in Eclipse bereits Folgendes ausführen lassen:


```
package a;

import java.io.File;

public class PathTests {

    public static void main(String[] args) {

        String classpath = System.getProperty("java.class.path");
        System.out.println(classpath);
        String[] classpathEntries = classpath.split(File.pathSeparator);
        for (String a : classpathEntries) {
            System.out.println(a);
        }
    }

}
```

Dies druckt mir aber nur den Dateipfad des workspace bin ordners sowie den Dateipfad zur .jar Datei aus, also nicht wirklich das was ich will.

Kenne mich da nur wenig aus, wie baue oder finde ich den passenden javac ... und java .... Befehl für meine Zwecke?


----------



## httpdigest (16. Okt 2022)

Du kannst dir von Eclipse den java bzw. javaw Kommanzodeilenbefehl ausgeben lassen, der von Eclipse selbst benutzt wird, um die Anwendung zu starten.
Gehe hierzu einfach in die Run Configuration (z.B. Menü "Run" > "Run Configurations...") und dort wählst du die von dir in Eclipse üblicherweise gestartete Run Configuration aus und dann befindet sich unten auf der rechten Seite des Dialogfensters ein Button "Show Command Line".


----------



## mihe7 (16. Okt 2022)

Zum besseren Verständnis kannst Du Dir auch mal https://www.java-forum.org/thema/classpath-ressourcen-ides-und-build-systeme.194131/#post-1275748 anschauen.


----------



## MisterBu (16. Okt 2022)

Z.B. ein Powershellskript

```
$Dir = $PSScriptRoot
$Lib = $Dir + "\lib\*.jar"
$jars = Get-ChildItem -Path $Lib
foreach ($jar in $jars)
{
 $Env:CLASSPATH=$Env:CLASSPATH + ";" + $jar
}
#
java -Xmx1024M -Xms128M a.PathTests
```


----------



## berndoa (18. Okt 2022)

httpdigest hat gesagt.:


> Du kannst dir von Eclipse den java bzw. javaw Kommanzodeilenbefehl ausgeben lassen, der von Eclipse selbst benutzt wird, um die Anwendung zu starten.
> Gehe hierzu einfach in die Run Configuration (z.B. Menü "Run" > "Run Configurations...") und dort wählst du die von dir in Eclipse üblicherweise gestartete Run Configuration aus und dann befindet sich unten auf der rechten Seite des Dialogfensters ein Button "Show Command Line".


Habe mal so einen Befehl anzeigen lassen, bin mir nur nicht sicher ob ich den so wirklich verstehe was er tut...



```
C:\Program Files\Java\jdk-18.0.2.1\bin\javaw.exe
-Dfile.encoding=UTF-8
-classpath "C:\Users\p\Desktop\Eclipse mit Java 18\workspace\Test\bin;C:\Users\p\Desktop\Eclipse mit Java 18\workspace\Test\src\a\lib\jOpenDocument-1.3.jar"
-XX:+ShowCodeDetailsInExceptionMessages a.Test
```

ich bins eigentlich gewohnt dass man Programme a la


```
javac mainKlassenName.java
java mainKlassenName Parameter1 Parameter2
```
kompiliert und ausführt.

Aber Eclipse oben gibt irgendwie nur den Pfad an zum java(?) Installationsordner
Und setzt den bin Ordner sowie die benutzte .jar Datei als classpath?

übersehe ich da irgendwo wo in dem befehl die Kompilierung und Ausführung passiert?
Und was ist eigentlich dieser XX kram da, ist der wichtig zum Kompilieren und Ausführen?


----------



## mihe7 (18. Okt 2022)

berndoa hat gesagt.:


> ich bins eigentlich gewohnt dass man Programme a la


Das ist genau das gleiche 

Wenn Du nur "java" eintippst, sucht sich Windows aus der PATH-Umgebungsvariable ein ausführbares Programm java.exe, java.cmd, java.bat, ... und startet dieses. Hast Du also z. B. am Anfang von PATH "C:\Program Files\Java\jdk-18.0.2.1\bin" stehen und Du gibst in der Eingabeaufforderung nur "java" ein, dann wird letztlich "C:\Program Files\Java\jdk-18.0.2.1\bin\java.exe" ausgeführt - genau das kannst Du auch direkt eingeben.

javaw ist einfach die Windows-Variante der Konsolenanwendung java.

Und der Rest sind Parameter für die JVM: "-Dfile.encoding=UTF8" setzt die Eigenschaft "file.encoding" auf "UTF8", "-classpath" gibt an, wo die JVM nach Klassen suchen soll und mit "-XX" werden Optionen für Entwickler angegeben, hier z. B. dass detaillierte NullPointerExceptions ausgegeben werden sollen (https://openjdk.org/jeps/358). Das dürfte allerdings seit Java ... 15(?) bereits standardmäßig aktiviert sein.

Noch was: das ist die Run Configuration, betrifft also nur die Ausführung.


----------



## berndoa (22. Okt 2022)

Puh, also den aus Eclipse kopierten Befehl mag cmd aber mal gar nicht :-/

Ich wollte in einer .bat Datei folgenden Code ausführen lassen:


```
C:\Program Files\Java\jdk-18.0.2.1\bin\javaw.exe
-Dfile.encoding=UTF-8
-classpath "C:\Users\p\Desktop\Test\bin;C:\Users\p\Desktop\Test\lib\jOpenDocument-1.3.jar"
-XX:+ShowCodeDetailsInExceptionMessages a.Test
pause
```

Ordnerstruktur passt definitiv.

Da kriege ich gleich mehrere Fehlermeldungen in der Konsole angezeigt:


```
Der Befehl "C:\Program" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.

Der Befehl "-Dfile.encoding" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.

Der Befehl "-classpath" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.

-XX:+ShowCodeDetailsInExceptionMessages a.Test
Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch.
```

Das Letzte mit dem Package name und so kann ja sein aber cmd kann ja wirklich mit keinem der Befehle irgendwas anfangen?

Muss ich da erst noch was machen bevor cmd kapiert was ich meine?


----------



## thecain (22. Okt 2022)

Wenn du Leerzeichen im Pfad hast, brauchts Anführungszeichen


----------



## yfons123 (22. Okt 2022)

du musst noch zeilenumbrüche hinzufügen wenn du es so in die bat geschrieben hast


----------



## mihe7 (22. Okt 2022)

Das wäre alles in einer Zeile:

```
"C:\Program Files\Java\jdk-18.0.2.1\bin\javaw.exe" -Dfile.encoding=UTF-8 -classpath "C:\Users\p\Desktop\Test\bin;C:\Users\p\Desktop\Test\lib\jOpenDocument-1.3.jar" -XX:+ShowCodeDetailsInExceptionMessages a.Test
```


----------



## yfons123 (22. Okt 2022)

```
C:\Program Files\Java\jdk-18.0.2.1\bin\javaw.exe `n
-Dfile.encoding=UTF-8 `n
-classpath "C:\Users\p\Desktop\Test\bin;C:\Users\p\Desktop\Test\lib\jOpenDocument-1.3.jar" `n
-XX:+ShowCodeDetailsInExceptionMessages a.Test
```
so wäre es in powershell wenn du es in mehr zeilen haben willst, geht auch in cmd aber ka was da das zeichen für umbruch ist


----------



## berndoa (23. Okt 2022)

mihe7 hat gesagt.:


> Das wäre alles in einer Zeile:
> 
> ```
> "C:\Program Files\Java\jdk-18.0.2.1\bin\javaw.exe" -Dfile.encoding=UTF-8 -classpath "C:\Users\p\Desktop\Test\bin;C:\Users\p\Desktop\Test\lib\jOpenDocument-1.3.jar" -XX:+ShowCodeDetailsInExceptionMessages a.Test
> ```


Habe mal die 2 an sich unnötigen Befehle vorwerfen und zu Kontrollzwekcen jav.exe benutzt:

```
"C:\Program Files\Java\jdk-18.0.2.1\bin\java.exe" -classpath "C:\Users\p\Desktop\Test\bin;C:\Users\p\Desktop\Test\lib\jOpenDocument-1.3.jar" 
pause
```
Jetzt kriege ich anlässlich der ersten zeile 
eine ellenlange Erklärung zum java Befehl und wie man ihn nutzt... 
Aber ausgeführt hat er mir von den Dateien nichts bisher :-(


----------



## KonradN (23. Okt 2022)

Jetzt hast Du ja auch nur den Classpath angegeben und sonst nichts. Wenn Du die Erklärung zum Java Befehl bekommen hast: Evtl. einfach mal lesen? 

Bei Dir ist das Wichtige wohl:
`java [Optionen] <mainclass> [args...]`

Also es muss immer die Klasse angegeben werden, in der die main Methode ist. Das hättest Du also nicht weglassen dürfen.

Das andere sind Optionen und die sind - was den Aufruf angeht - optional.


----------



## berndoa (23. Okt 2022)

KonradN hat gesagt.:


> Jetzt hast Du ja auch nur den Classpath angegeben und sonst nichts. Wenn Du die Erklärung zum Java Befehl bekommen hast: Evtl. einfach mal lesen?
> 
> Bei Dir ist das Wichtige wohl:
> `java [Optionen] <mainclass> [args...]`
> ...


Naja, ich habe nur die befehle kopiert die mir Eclipse so vorgegeben hatte.
Offensichtlich sieht deren benutzter Befehl dann wohl noch etwas Anders aus.


----------



## thecain (23. Okt 2022)

berndoa hat gesagt.:


> Habe mal die 2 an sich unnötigen Befehle vorwerfen


Vielleicht waren sie doch nicht unnötig?


----------



## mihe7 (23. Okt 2022)

@berndoa, sorry, da habe ich mich oben wohl missverständlich ausgedrückt:


mihe7 hat gesagt.:


> Und der Rest sind Parameter für die JVM: "-Dfile.encoding=UTF8" setzt die Eigenschaft "file.encoding" auf "UTF8", "-classpath" gibt an, wo die JVM nach Klassen suchen soll und mit "-XX" werden Optionen für Entwickler angegeben, hier z. B. dass detaillierte NullPointerExceptions ausgegeben werden sollen (https://openjdk.org/jeps/358). Das dürfte allerdings seit Java ... 15(?) bereits standardmäßig aktiviert sein.


Hier hätte ich vielleicht noch erwähnen sollen, dass das `a.Test` am Ende die von der JVM auszuführende Klasse angibt.


----------



## berndoa (23. Okt 2022)

mihe7 hat gesagt.:


> @berndoa, sorry, da habe ich mich oben wohl missverständlich ausgedrückt:
> 
> Hier hätte ich vielleicht noch erwähnen sollen, dass das `a.Test` am Ende die von der JVM auszuführende Klasse angibt.


Ups, ich dachte (weil halt gleiche Zeile und kein - mehr dazwischen, also kein neuer Parameter) dass das zu dem -XX+-*/ Befehl dazu gehört.

Werds mal testen obs geht wenn das a.Test am Ende mit dabei ist.


----------

