2013-09-06 1 views
1

Можете ли вы рассказать мне способ выполнения процесса с Java, независимо от операционной системы? НАПРИМЕР.Выполнять процесс с Java независимо от базовой ОС

Process p = Runtime.getRuntime().exec("cmd /c mvn clean install"); 

Над строкой выполняется Maven в среде Windows, но как я могу выполнить команду выше в любой операционной системе?

Если я не добавляю "cmd/c" в начале, то я не могу работать в среде Windows, и ошибка говорит cannot find mvn.bat, хотя maven home установлен правильно.

ответ

0

Вы действительно не можете буквально «выполнить процесс с Java, независимо от операционной системы», потому что Runtime.exec направляет команду запуска вверху ОС. Затем вам нужно описать процесс, который вы хотите запустить, и метод для этого. Но вы можете «виртуализировать» процесс запуска, реализуя, скажем, интерфейс ProcessLauncher для процессов, которые вы знаете, и запуск подкласса для каждой ОС. С фабрикой, которая определяет, на какой ОС вы работаете, и создайте правильный ProcessLauncher, вы должны быть fine

0

Возможно, вам придется проверить, в какой операционной системе он находится, а затем заменить cmd /c соответствующей командой для этой операционной системы.

Смотрите этот вопрос о том, как определить, какую систему вы бежите на: How do I programmatically determine operating system in Java?

3

Вы можете проверить, что это тип ОС вы имеющие, а затем выполнить оператор командной строки.

Для того, чтобы проверить тип операционной системы, вам необходимо получить значение свойства os.name системы:

String OS = System.getProperty("os.name").toLowerCase(); 

Затем с помощью простого if/else заявления вы можете выполнить оператор командной строки в зависимости от типа ОПЕРАЦИОННЫЕ СИСТЕМЫ.

if (isUnix()) { 
    String statement = new String[] { "/bin/bash", "-c", "mvn clean install" }; 
    Process p = Runtime.getRuntime().exec(statement); 
else if (isWindows()) { 
    Process p = Runtime.getRuntime().exec("cmd /c mvn clean install"); 
} 

... 

методы Helper, чтобы проверить тип ОС:

public boolean isUnix() { 
    return (OS.indexOf("nix") >= 0 || OS.indexOf("nux") >= 0 || OS.indexOf("aix") > 0); 
} 

public boolean isWindows() { 
    return (OS.indexOf("win") >= 0); 
} 

Больше информации вы можете найти here.

0

Выполнение внешних программ - это то, что на определение не зависит от платформы. Могут быть разные места установки программ, разные настройки PATH или другого синтаксиса вызова. (например, /all на окнах и --all на unix). (Не говоря уже о том, что для одной и той же задачи могут быть разные программы от разных людей.)

Лучше всего использовать либо конфигурационный файл для вашей программы, где вы указываете, какую программу и как вы хотите ее называть, либо сделать то же самое с настройкой среды выполнения ваших программ на платформе (например, с использованием start.bat/start.sh) и используйте System.getEnv().

Мой личный фаворит - это первый подход, поскольку он не имеет дело с побочными эффектами. Второй, с другой стороны, позволяет «системным хакерам» поместить там какой-нибудь код ... aehm ... их материал (например, см. В startup.sh/bat Catalina Tomcat.ш/BAT) :)

0

В данном конкретном случае существуют библиотеки, которые могут помочь, например, вы можете использовать библиотеку maven-ant-tasks программно, так как Ant скрывает все для конкретной платформы беспорядок позади своей собственной независимой от платформы API:

Project p = new Project(); 
p.init(); 
Mvn mvnTask = new Mvn(); 
mvnTask.setProject(p); 
mvnTask.setPom(new File("path/to/pom.xml")); 
mvnTask.createArg().setValue("clean"); 
mvnTask.createArg().setValue("install"); 

mvnTask.perform(); 

Это должно работать одинаково на всех платформах, и не требует отдельной установки mvn - вам просто нужно Ant и maven-ant-tasks библиотеки на вашем пути к классам, а Mvn задача будет скачать все остальное, что нужно в первый раз это запускается.

0

Лучше использовать apache commons exec для запуска внешних программ, так как существует множество конкретных проблем платформы ОС, таких как размер буфера вывода, обработка ошибок и т. Д.