Правильный способ выполнения исполняемого файла (.exe) в различных ситуациях


Такого рода проблемы уже некоторое время беспокоят меня, поэтому мне было любопытно, как вы подходите к решению следующей ситуации:

Представьте себе, что у меня есть два разных проекта eclipse в одном рабочем пространстве под названием ProjectA и ProjectB. Проект Б содержит .exe-файл в корне, который вызывается из ProjectA следующим образом:
Process p = Runtime.getRuntime().exec( "../ProjectB/ProjectB.exe" );
Проблема сейчас в том, что после развертывания структура немного меняется: ProjectA теперь a .кувшин. Рядом с этой баночкой теперь лежит папка с Проект Б, который содержится в проекте б с ее .исполняемый, .банки и так далее. Теперь правильный вызов должен выглядеть следующим образом:
Process p = Runtime.getRuntime().exec( "ProjectB/ProjectB.exe" );
Поскольку мне нужно, чтобы эти структуры оставались такими, как они есть, и я не хочу, чтобы они были разными .вызовы exec в моем приложении для каждого случая я попробовал несколько вещей, чтобы обойти эту ситуацию:

1) Добавление ProjectB в качестве папки классов в ProjectA и предоставление ContextClassLoader выяснить, где найти ProjectB.exe вот так:

URL url= Thread.currentThread().getContextClassLoader().getResource( "ProjectB.exe" );
file = new File( url.toURI() );
Process p = Runtime.getRuntime().exec( file.getAbsolutePath() );

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

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: URI has an authority component
    at java.io.File.<init>(Unknown Source)

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

URL url= Thread.currentThread().getContextClassLoader().getResource( "ProjectB.exe" );
File file = new File( url.getFile() );
Process p = Runtime.getRuntime().exec( file.getAbsolutePath() );

Это казалось многообещающим, но, к сожалению, до тех пор, пока мой путь оставался без тире (" " ), так как этот оценщик, казалось, преобразовывал каждый тире в "%20", что runtimeexecutor, похоже, не очень нравится. Конечно, я мог бы заменить каждый "%20 " в "" потом,но это кажется мне немного банальным.

Другое требование состоит в том, что оба приложения должны выполняться в разных JVM, поэтому я называю их .exe-файл от Runtimeexecution. Итак, мой последний вопрос: есть ли способ очистить вызовы ProjectB без каких-либо обходных путей?
1 4

1 ответ:

Самый простой способ-определить путь поиска (несколько экземпляров File, которые указывают на разные каталоги). Добавьте имя exe к каждому пути и проверьте, существует ли результирующий File, и используйте этот путь для его выполнения.

Исключение составляет уровень безопасности Windows: он не позволяет запускать неизвестные exe-файлы из сетевого пути. Обратитесь к своему системному администратору за решением.

Обратите внимание, что вы не всегда можете загрузить exe-файлы из пути к классу. Например, если они находятся внутри банки, это не сработает. Windows ' launcher не знает, как обращаться с файлами JAR. Решение здесь состоит в том, чтобы распаковать ресурс во временный файл и запустить его оттуда.