Maskieren von reservierten Wörtern in der Windows-Befehlszeile

333
GreenGren

Ich habe ein Java-Programm, das ich mit einem Befehl wie diesem starten muss:

java -cp "some.jar;some2.jar" -Dsome.prop.dir=C:\somedir com.software.MainClass 

Nun ist das Problem hier der -Dsome.prop.dir=C:\somedirParameter - aus irgendeinem Grund führt dies dazu, dass Java fehlschlägt Could not find or load main class com.software.MainClass. Wenn ich diesen einen Parameter weglasse, läuft das Programm gut, aber offensichtlich ist die Poperty nicht gesetzt.

Ich vermute, es ist vielleicht, weil dirWindows ein zurückhaltendes Wort ist. Gibt es eine Möglichkeit, diese Maske zu maskieren oder umzugehen, außer die Java-Anwendung zu ändern oder ein spezielles Binär / PE-Startprogramm für die Java-Anwendung in Windows zu erstellen?

2
Dies ist kein reserviertes Wortproblem. Das Problem ist Ihre Syntax, Sie haben ein Leerzeichen, außerhalb von Anführungszeichen. Ramhound vor 6 Jahren 0
@ Ramhound, was für ein Raum? DavidPostill vor 6 Jahren 0
"** somedir com **" die Zitate fehlen noch Ramhound vor 6 Jahren 0
@Ramhound Sie sind separate Argumente DavidPostill vor 6 Jahren 0
@Ramhound `com.software.MainClass` ist der Name der auszuführenden Klassendatei. DavidPostill vor 6 Jahren 0
Versuchen Sie folgende Befehlszeile: java -cp "some.jar; some2.jar" -Dsome.prop.dir = "C: \ somedir" com.software.MainClass " DavidPostill vor 6 Jahren 0
@DavidPostill Das ist es nicht, `-Dsome.prop.dir =" C: \ somedir "` und `-Dsome.prop.dir = a 'schlagen genauso fehl. Wie funktioniert "-Dsome.prop.dir = a" wie auch "" -Dsome.prop.dir "=" a "` - otoh, `-Dsome.prop.adir = C: \ somedir`. GreenGren vor 6 Jahren 0
Sie sollten auch `-Dsome.prop.dir = C: \\ somedir` versuchen, indem Sie zwei umgekehrte Schrägstriche in Ordnerpfade einfügen oder den Schrägstrich ansonsten verwenden, z. B.` -Dsome.prop.dir = C: / somedir` Pimp Juice IT vor 6 Jahren 0

1 Antwort auf die Frage

0
HeroSteve

Ich habe keine Lösung, aber einige Tests und Empfehlungen, um Ihr Problem zu untersuchen.

Ich habe versucht, das von Ihnen beschriebene Problem zu reproduzieren. Ich habe sogar die falschen Namen erstellt (Verzeichnis somedir, class Mainclass).

Hier ist meine Version von Mainclass. Im Wesentlichen erhält es die Systemeigenschaft und generiert daraus einfache Diagnoseausgaben.

package com.software;  import java.io.File;  public class Mainclass {  public static void main(String[] args) { String someDir = System.getProperty("some.prop.dir"); if (someDir == null || someDir.isEmpty()) { System.out.println("No directory parameter specified");  } else { File dir = new File(someDir); System.out.println(String.format("Directory stats: %s, %s, %s", someDir, dir.getAbsolutePath(), dir.isDirectory() ? "directory" : "file")); } System.out.println("Main running okay."); }  } 

Als Nächstes erstellte ich eine JAR-Datei mit Mainclass und nannte sie some.jar.

Ich habe die Befehlszeile wie folgt ausgeführt:

java -cp "some.jar" -Dsome.prop.dir=C:\somedir com.software.Mainclass 

Ergebnisse:
Verzeichnisstatistiken: C: \ somedir, C: \ somedir, Verzeichnis
Main läuft einwandfrei.

Ich lief auch ohne den Parameter -D:

java -cp "some.jar" com.software.Mainclass 

Ergebnisse: Kein Verzeichnisparameter angegeben
.

Obwohl ich das Problem ohne Probleme ausführen konnte, habe ich einige Stellen gesehen, an denen das Problem bestehen könnte:

  1. Die Jar-Dateien. Sie geben den Klassenpfad als die ersten beiden Dateinamen an. Hauptklasse muss in einer von ihnen sein, sonst wird sie nicht gefunden. Ich vermute, das ist nicht das Problem, da es ohne den Parameter -D korrekt läuft.
  2. Der Parameter -D wird intern zum Suchen der Klasse verwendet. Im obigen Beispielcode berichte ich nur über das Verzeichnis. Vielleicht verwenden Sie es, um die Klassendatei irgendwie zu finden, und sie kann sie nicht finden? Vielleicht verwendet das Programm das Verzeichnis, um nach der Klasse zu suchen, aber wenn Sie das Verzeichnis weglassen, verwendet es standardmäßig das in der JAR-Datei angegebene Verzeichnis.

Wenn ich im bin-Verzeichnis (wo die Klassen generiert wurden) lief, konnte ich den Befehl -cp weglassen und es lief korrekt.

Wenn ich -cp mit einem jar ohne Mainclass verwendet habe, bekam ich den Fehler, aber ich bekam es, ob -D angegeben wurde oder nicht.