Маскирование зарезервированных слов в командной строке Windows

300
GreenGren

У меня есть Java-программа, которую мне нужно запустить с помощью команды, подобной этой:

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

Теперь проблема здесь в -Dsome.prop.dir=C:\somedirпараметре - по какой-то причине он вызывает сбой Java Could not find or load main class com.software.MainClass. Если я пропущу этот один параметр, программа запустится нормально, но, очевидно, poperty не установлен.

Я думаю, это может быть потому, что dirэто зарезервированное слово в Windows. Есть ли какой-нибудь способ, возможно, замаскировать это или обойти это, кроме изменения приложения Java или создания какого-либо специального средства запуска двоичных / PE для приложения Java в Windows?

2
Это не зарезервированное слово. Проблема в вашем синтаксисе, у вас есть пробел, за пределами кавычек. Ramhound 6 лет назад 0
@Ramhound Эрм, что пространство? DavidPostill 6 лет назад 0
«** Somedir Com **» цитаты по-прежнему отсутствуют Ramhound 6 лет назад 0
@Ramhound Это отдельные аргументы DavidPostill 6 лет назад 0
@Ramhound `com.software.MainClass` - имя запускаемого файла класса. DavidPostill 6 лет назад 0
Попробуйте следующую командную строку `java -cp" some.jar; some2.jar "-Dsome.prop.dir =" C: \ somedir "com.software.MainClass` DavidPostill 6 лет назад 0
@DavidPostill Это не так, `-Dsome.prop.dir =" C: \ somedir "` и `-Dsome.prop.dir = a` не работают точно так же. Как работает `" -Dsome.prop.dir = a "`, как и `" -Dsome.prop.dir "=" a "` - otoh, `-Dsome.prop.adir = C: \ somedir` работает. GreenGren 6 лет назад 0
Вам также следует попробовать `-Dsome.prop.dir = C: \\ somedir`, поставив две обратные косые черты в пути к папкам, или использовать вместо этого косую черту, например` -Dsome.prop.dir = C: / somedir` Pimp Juice IT 6 лет назад 0

1 ответ на вопрос

0
HeroSteve

У меня нет решения, но некоторые тесты и рекомендации, чтобы исследовать вашу проблему.

Я попытался воспроизвести проблему, которую вы описываете. Я даже создал поддельные имена (каталог somedir, класс Mainclass).

Вот моя версия Mainclass. По сути, он получает системное свойство и использует его для генерации простого диагностического вывода.

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."); }  } 

Затем я создал файл jar, содержащий Mainclass, и назвал его some.jar.

Я запустил командную строку следующим образом:

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

Результаты:
Статистика каталогов: C: \ somedir, C: \ somedir, каталог
Main работает нормально.

Я также бежал без параметра -D:

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

Результаты: не указан параметр каталога.
Main работает нормально.

Хотя я смог запустить проблему без проблем, я видел несколько мест, где проблема могла существовать:

  1. Фляги. Вы указываете classpath для этих первых двух имен файлов. Основной класс должен быть в одном из них, иначе он не будет найден. Я подозреваю, что это не проблема, так как он работает правильно без параметра -D.
  2. Параметр -D используется внутри, чтобы найти класс. В приведенном выше примере кода я просто сообщаю о каталоге. Возможно, вы используете его для поиска файла класса, и он не может его найти? Возможно, программа использует каталог для поиска класса, но когда вы опускаете каталог, по умолчанию используется каталог, указанный в jar-файле?

Если я работал в каталоге bin (где генерировались классы), я мог опустить команду -cp, и она работала правильно.

Если я использовал -cp с банкой без Mainclass, я получил ошибку, но я понял, была ли указана опция -D.