.jar файл не работает с аргументами

Я пытаюсь запустить файл .jar (с именем MC) в Windows из команды, и я использую следующий код:

java -jar MC.jar 

Это работает, у файла есть всплывающий пользовательский интерфейс, и я могу вручную изменить некоторые аргументы.

тем не мение, я хочу запустить этот файл .jar без, когда пользовательский интерфейс появится и задаст аргументы через командную строку. В файле есть инструкции по изменению каждого параметра. Вот пример:

java -jar MC.jar bB 0.004

Когда я пытаюсь запустить это из командной строки, я получаю следующую ошибку:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
    at java.lang.String.substring(Unknown Source)
    at CellSim.main(CellSim.java:113)

Я понятия не имею, что не так. Следует упомянуть, что я не знаю, как писать код на Java, поэтому я не смотрел исходный код (для меня это было бы бессмысленно). Мне просто нужно несколько раз запускать этот файл .jar и использовать его вывод (много файлов .csv).

Я также должен упомянуть, что тот же файл .jar успешно использовался на Mac и других машинах с Windows, поэтому я думаю, что это что-то специфическое для моего ПК.

Вот что я установил на свой ПК с Windows: версия java "1.8.0_191" Среда выполнения Java (TM) SE (сборка 1.8.0_191-b12) Клиентская виртуальная машина Java HotSpot (TM) (сборка 25.191-b12, смешанный режим, совместное использование)

Вот что я установил на свой Mac: версия java "1.8.0_25" Среда выполнения Java (TM) SE (сборка 1.8.0_25-b17) 64-разрядная серверная виртуальная машина Java HotSpot (TM) (сборка 25.25-b02, смешанный режим)

Пожалуйста помоги! Я искал в Интернете последние 3 часа, пытаясь найти исправление.

Вы можете скачать файл .jar здесь

На изображениях ниже представлены более подробные сведения об аргументах, которые можно изменить. Обратите внимание, что я переименовал файл в MC.jar. Подробная информация о файле .jarПолный список параметров

Покажи нам свой код! Если вы не можете его изменить, вы не можете изменить способ обработки аргументов командной строки.

Elliott Frisch 04.11.2018 04:29

Я сделал файл доступным. Мне удалось изменить аргументы из командной строки (на моем Mac), поэтому я не думаю, что есть проблема с кодом. Может мне нужно что-то установить на свой ПК?

Dianananana 04.11.2018 05:00

«Файл содержит инструкции по изменению каждого параметра» - было бы полезно, если бы вы также предоставили эти инструкции

mangusta 04.11.2018 05:24

Возникла ли такая же проблема на вашем Mac?

user54321 04.11.2018 07:21

Нет, на Mac это работает так, как задумано.

Dianananana 04.11.2018 07:22

Кажется, проблема связана с кодом. Пожалуйста, проверьте мой ответ.

user54321 04.11.2018 07:33
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
6
732
2

Ответы 2

Есть две возможные причины / случаи:

  • Свойства не передаются в приложение (что вы, насколько я понимаю, сомневаетесь)

  • В коде есть некоторые внешние события, которые выполняются только в том случае, если параметр действительно передан правильно.

Если jar создан правильно, метод передачи аргументов правильный, можете быть уверены в этом.

Чтобы проверить себя и попрактиковаться (и я понимаю, что это вопрос «студента»), вы можете распечатать массив while args в цикле прямо в методе main:

public static void main(String [] args) {
    for(String arg : args) {
       System.out.println(arg);
    }  

    // now do your logic here      
}

Скорее всего, вы увидите, что параметры печатаются правильно.

Так что это, вероятно, второй случай, когда вам придется отлаживать и проверять, что там происходит.

Спасибо за предложение, Марк. Это могло бы сработать, однако, учитывая мое незнание программирования на Java, отладка этого была бы похожа на попытку читать по-китайски.

Dianananana 04.11.2018 07:19

Если у меня будет достаточно времени, я не сомневаюсь в этом. У меня плотный график с этим, и я хотел бы, чтобы он заработал сегодня. Меня больше интересуют данные, получаемые из этого файла, чем сам код.

Dianananana 04.11.2018 07:24

Проблема, похоже, заключается в том, как он создает выходной каталог.

Вот фрагмент декомпилированного кода файла jar,

decompiled code

Независимо от ОС, переменная path получает значение, в котором в качестве разделителя используется символ «/».

Например: путь = /C:/mydir/MC.jar

Поскольку File.separator - это '\' в Windows, он пытается создать подстроку, используя '\', что приводит к исключению в строке 113, так как он не может найти ни одного вхождения '\' в пути.

Таким образом, Нижняя линия: файл jar будет запускаться с параметрами только в Mac / Linux, если в код не было внесено никаких изменений.

здесь что-то не так, "getPath" возвращает путь с разделителем "\" (т.е. обратной косой чертой) в окнах

mangusta 04.11.2018 07:48

Спасибо, что дошли до сути. Я не смогу изменить код сегодня, так как мне действительно нужно научиться кодировать на Java. Но, безусловно, полезно знать, что мне делать, когда придет время.

Dianananana 04.11.2018 07:51

@mangusta Я запускал getPath () в окнах и получил "/" в окнах.

user54321 04.11.2018 08:19

"getLocation" здесь вышло из-под моего внимания. Он возвращает объект «URL», а «getPath», вызываемый для URL, будет содержать только косые черты, независимо от того, какая ОС. "getPath", вызываемый объектом File, будет содержать косые и обратные косые черты в зависимости от ОС.

mangusta 04.11.2018 08:42

Другие вопросы по теме