Почему мой пользовательский модуль запуска Minecraft неправильно запускает процессы?

Поскольку мои школьные компьютеры блокируют неизвестные приложения или файлы .exe, но на них установлена ​​Java, я написал свою собственную систему запуска, которую я могу использовать вместо обычной программы запуска Minecraft.

Это прекрасно работает. Программа запуска дает вам команду вставить обратно в Powershell ISE (единственный разблокированный терминал), чтобы запустить игру. Тем не менее, я чувствую, что людям, не разбирающимся в технологиях, будет трудно с этим, поэтому я пытаюсь заставить свою программу запускать саму игру.

Я использую следующий код:

try {
    /*ProcessBuilder procbuilder = new ProcessBuilder(processArgs);
     procbuilder.inheritIO();
     procbuilder.start();*/
     Runtime.getRuntime().exec(command).waitFor();
} catch (java.io.IOException | java.lang.InterruptedException e) {
     System.out.println("Exception while starting Minecraft: " + e);
}

Моя переменная command всегда является допустимой командой Java, которая работает при вставке в терминал. У меня есть файл шаблона, из которого моя программа считывает и заменяет некоторые заполнители (для каталогов, аргументов, специфичных для сеанса, и т. д.).

Я могу использовать exec() для запуска других программ. Следующий код работает, как и ожидалось:

Runtime.getRuntime().exec("notepad.exe abc.txt");
// or
Runtime.getRuntime.exec(new String[] {"notepad.exe", "abc.txt"});

Я передал свою команду и аргументы так же, как показано.

Почему этот код заставляет Minecraft не отображать никаких окон? Используя ProcessExplorer, я вижу, что процесс был создан и выделен, но, в отличие от вставки команды в терминал, никогда не показывает окно игры или какие-либо признаки того, что он запущен. Почему Java не выполняет это правильно, а не вводит ту же команду в терминал? FWIW, ProcessExplorer показывает, что процесс, который я пытался запустить, имеет правильные аргументы, но явно что-то не так.

По запросу я вставил полную команду, которую пытаюсь запустить.

java "-Dox.name=Windows 10" "-Dos.version=10.0" "-Djava.library.path=C:\Users\myuser\Desktop\MC1-12-2\javaLibraries\" "-Dminecraft.launcher.brand=sidecraft" "-Dminecraft.launcher.version=2.3.592" "-Dminecraft.client.jar=C:\Users\myuser\Desktop\MC1-12-2\version\1.12.2.jar" -cp "C:\Users\myuser\Desktop\MC1-12-2\libraries\com\mojang\patchy\1.3.9\patchy-1.3.9.jar;C:\Users\myuser\Desktop\MC1-12-2\libraries\oshi-project\oshi-core\1.1\oshi-core-1.1.jar;C:\Users\myuser\Desktop\MC1-12-2\libraries\net\java\dev\jna\jna\4.4.0\jna-4.4.0.jar;C:\Users\myuser\Desktop\MC1-12-2\libraries\net\java\dev\jna\platform\3.4.0\platform-3.4.0.jar;C:\Users\myuser\Desktop\MC1-12-2\libraries\com\ibm\icu\icu4j-core-mojang\51.2\icu4j-core-mojang-51.2.jar;C:\Users\myuser\Desktop\MC1-12-2\libraries\net\sf\jopt-simple\jopt-simple\5.0.3\jopt-simple-5.0.3.jar;C:\Users\myuser\Desktop\MC1-12-2\libraries\com\paulscode\codecjorbis\20101023\codecjorbis-20101023.jar;C:\Users\myuser\Desktop\MC1-12-2\libraries\com\paulscode\codecwav\20101023\codecwav-20101023.jar;C:\Users\myuser\Desktop\MC1-12-2\libraries\com\paulscode\libraryjavasound\20101123\libraryjavasound-20101123.jar;C:\Users\myuser\Desktop\MC1-12-2\libraries\com\paulscode\librarylwjglopenal\20100824\librarylwjglopenal-20100824.jar;C:\Users\myuser\Desktop\MC1-12-2\libraries\com\paulscode\soundsystem\20120107\soundsystem-20120107.jar;C:\Users\myuser\Desktop\MC1-12-2\libraries\io\netty\netty-all\4.1.9.Final\netty-all-4.1.9.Final.jar;C:\Users\myuser\Desktop\MC1-12-2\libraries\com\google\guava\guava\21.0\guava-21.0.jar;C:\Users\myuser\Desktop\MC1-12-2\libraries\org\apache\commons\commons-lang3\3.5\commons-lang3-3.5.jar;C:\Users\myuser\Desktop\MC1-12-2\libraries\commons-io\commons-io\2.5\commons-io-2.5.jar;C:\Users\myuser\Desktop\MC1-12-2\libraries\commons-codec\commons-codec\1.10\commons-codec-1.10.jar;C:\Users\myuser\Desktop\MC1-12-2\libraries\net\java\jinput\jinput\2.0.5\jinput-2.0.5.jar;C:\Users\myuser\Desktop\MC1-12-2\libraries\net\java\jutils\jutils\1.0.0\jutils-1.0.0.jar;C:\Users\myuser\Desktop\MC1-12-2\libraries\com\google\code\gson\gson\2.8.0\gson-2.8.0.jar;C:\Users\myuser\Desktop\MC1-12-2\libraries\com\mojang\authlib\1.5.25\authlib-1.5.25.jar;C:\Users\myuser\Desktop\MC1-12-2\libraries\com\mojang\realms\1.10.22\realms-1.10.22.jar;C:\Users\myuser\Desktop\MC1-12-2\libraries\org\apache\commons\commons-compress\1.8.1\commons-compress-1.8.1.jar;C:\Users\myuser\Desktop\MC1-12-2\libraries\org\apache\httpcomponents\httpclient\4.3.3\httpclient-4.3.3.jar;C:\Users\myuser\Desktop\MC1-12-2\libraries\commons-logging\commons-logging\1.1.3\commons-logging-1.1.3.jar;C:\Users\myuser\Desktop\MC1-12-2\libraries\org\apache\httpcomponents\httpcore\4.3.2\httpcore-4.3.2.jar;C:\Users\myuser\Desktop\MC1-12-2\libraries\it\unimi\dsi\fastutil\7.1.0\fastutil-7.1.0.jar;C:\Users\myuser\Desktop\MC1-12-2\libraries\org\apache\logging\log4j\log4j-api\2.8.1\log4j-api-2.8.1.jar;C:\Users\myuser\Desktop\MC1-12-2\libraries\org\apache\logging\log4j\log4j-core\2.8.1\log4j-core-2.8.1.jar;C:\Users\myuser\Desktop\MC1-12-2\libraries\org\lwjgl\lwjgl\lwjgl\2.9.4-nightly-20150209\lwjgl-2.9.4-nightly-20150209.jar;C:\Users\myuser\Desktop\MC1-12-2\libraries\org\lwjgl\lwjgl\lwjgl_util\2.9.4-nightly-20150209\lwjgl_util-2.9.4-nightly-20150209.jar;C:\Users\myuser\Desktop\MC1-12-2\libraries\com\mojang\text2speech\1.10.3\text2speech-1.10.3.jar;C:\Users\myuser\Desktop\MC1-12-2\version\1.12.2.jar" -Xmx2G -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:G1NewSizePercent=20 -XX:G1ReservePercent=20 -XX:MaxGCPauseMillis=50 -XX:G1HeapRegionSize=32M "-Dlog4j.configurationFile=C:\Users\myuser\Desktop\MC1-12-2\version\client-1.12.xml" net.minecraft.client.main.Main --version 1.12.2 --accessToken NO_TOKEN --gamedir C:\Users\myuser\Desktop\MC1-12-2 --assetsDir C:\Users\myuser\Desktop\MC1-12-2\assets --assetIndex 1.12 --uuid 4290304c-2bb5-4f73-b5cc-1e545bd766a1 --userType msa --versionType release

Какая именно команда? Можете ли вы запустить другие программы с графическим интерфейсом, такие как Блокнот или Firefox?

Joseph Sible-Reinstate Monica 12.02.2023 08:24

«который работает при вставке в терминал» недостаточно - ProcessBuilder и Runtime НЕ используют терминал, команда НЕ запускается программой-оболочкой (например, cmd.exe или bash) - все уловки такой программы-оболочки не работают ( например, перенаправление и обработка ввода/вывода, конвейеры команд,...)

user16320675 12.02.2023 09:30

@JosephSible-ReinstateMonica Я добавил ссылку на команду. Другие программы с графическим интерфейсом работают корректно.

user14328040 13.02.2023 00:22

@user14328040 user14328040 «Ошибка, это личная паста или ожидает модерации. Если эта паста принадлежит вам, войдите в Pastebin, чтобы просмотреть ее». Почему вы не можете просто отредактировать команду прямо в своем вопросе?

Joseph Sible-Reinstate Monica 13.02.2023 00:39

@JosephSible-ReinstateMonica Когда я создал вопрос, вставка моей команды привела к тому, что блок кода занял всю высоту экрана текста, но, похоже, теперь он остается на одной строке, вероятно, из-за ошибки форматирования. Извини за это. Это там, сейчас. Моя паста также по какой-то причине находится в состоянии «Ожидает модерации».

user14328040 13.02.2023 02:52

Когда вы пытались использовать перегрузку, которая принимает массив строк, вы делали это как Runtime.getRuntime.exec(new String[] {"java", "-Dox.name=Windows 10", ...}); или как Runtime.getRuntime.exec(new String[] {"java", "\"-Dox.name=Windows 10\"", ...});?

Joseph Sible-Reinstate Monica 13.02.2023 02:55

@JosephSible-ReinstateMonica Он обрабатывается как new String[] {"java", "\"-Dox.name=Windows 10\"", ...}); из-за того, как он считывался из моего файла конфигурации. После удаления кавычек из строк в моем файле конфигурации все работает! Спасибо за помощь, я отвечу на свой вопрос.

user14328040 13.02.2023 03:11
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

При чтении из моего файла конфигурации некоторые строки (и, следовательно, некоторые аргументы) заключались в кавычки. Таким образом, они считывались в массив строк arguments как new String[] {"java", "\"-Dos.name=Windows 10\"", ...};.

Удаление кавычек из моих аргументов решило проблему, в результате чего аргументы были построены как new String[] {"java, "-Dos.name=Windows 10", ...}.

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