2016-09-17 5 views
6

나는 내가 만든 병을위한 래퍼 항아리를 만드는 중입니다. 기본 애플리케이션 업데이트 및 사용자가 유효한 사용자인지 확인하는 작업을 처리합니다. 비록 외부 항아리가 작동하는 함수를 시작할 수 없기 때문에 중요한 문제가 있습니다. 이것은 내가 지금까지 가지고있는 것입니다 :다른 자바 애플리케이션을 시작하는 자바

ProcessBuilder builder = new ProcessBuilder("java -jar ~/Documents.Java/myJar.jar"); 
try { 
    Process process = builder.start(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

그러나, 나는 단지 파일을 찾을 수없는 예외를 얻고 있습니다.

java.io.IOException: Cannot run program "java -jar ~/Documents/Java/myJar.jar": error=2, No such file or directory 
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048) 
at com.mycompany.DHSLauncher.Launcher.lambda$4(Launcher.java:109) 
at java.util.Optional.ifPresent(Optional.java:159) 
at com.mycompany.DHSLauncher.Launcher.showLogin(Launcher.java:102) 
at com.mycompany.DHSLauncher.Launcher.start(Launcher.java:35) 
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863) 
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326) 
at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295) 
at java.security.AccessController.doPrivileged(Native Method) 
at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294) 
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) 

Caused by: java.io.IOException: error=2, No such file or directory 
at java.lang.UNIXProcess.forkAndExec(Native Method) 
at java.lang.UNIXProcess.<init>(UNIXProcess.java:248) 
at java.lang.ProcessImpl.start(ProcessImpl.java:134) 
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029) 
... 10 more 

java -jar ~/Documents.Java/myJar.jar을 복사하여 터미널에 붙여 넣으면 작동하고 jar가 실행됩니다. 나는 여기서 무슨 일이 벌어지고 있는지 전혀 모른다. 경로가 실행중인 항아리의 위치와 관련이 있다고 생각합니까?

답변

6

tilde- 대한 정확한 지점에 추가 (비) 확장하면 new ProcesssBuilder 한 인수로 전체 커맨드를 전달하는 Java execute process on linux

Difference between ProcessBuilder and Runtime.exec() 근처 속는. String을 특별한 경우로 취급하고 공백으로 구분 된 토큰으로 나누는 Runtime.exec()과는 달리 은 대부분 (정확히는 아니지만) 일반적인 유닉스 셸과 비슷하지만 ProcessBuilder ctor는이 작업을 수행하지 않습니다. 이것은 게시 한 추적의 시작 부분에있는 예외 메시지에서 볼 수 있습니다. 당신은 같은 별도의 인수가 필요합니다 가능성이

ProcessBuilder builder = new ProcessBuilder("java", "-jar", 
    System.getProperty("user.home")+"/Documents.Java/myJar.jar"); 
// three String's passed to vararg, compiler makes array for you 

또는 (하지만 난하지 않는 것이 좋습니다) 전체 경로 이름 경우 원하는 java 프로그램 (또는에 대한 링크가 java

String line = "java -jar " + System.getProperty("user.home")+"/Documents.Java/myJar.jar"; 
ProcessBuilder builder = new ProcessBuilder(line.split(" ")); 
// array of three String's passed directly to vararg 

을 그리고 교체)는 JVM 프로세스에 유효한 PATH를 검색 할 때 처음에는 발견되지 않습니다.

8

틸드 확장 (머리말 ~)은 셸의 기능입니다. 쉘을 통해 java를 호출하지 않으므로 그렇게되지 않습니다. System.getProperty("user.home") 메서드를 사용하여 사용자의 홈 디렉터리를 찾고 물결표 대신 해당 명령을 빌드하십시오.

+0

그래, 아직 파일을 찾을 수 없습니다 예외가 발생하고 있습니다. 네가 제안한 것으로 바뀌었고 그 다음에 허가가 거부되었다. 파일을 실행 파일로 설정하는 방법을 알았지 만 다시 찾을 수없는 파일로 돌아 왔습니다. – Aaron

+0

'user.dir'의 값이 올바른지 확인 했습니까? 경로를 올바르게 구축하고 있음을 확인 했습니까? 'ProcessBuilder'에게 넘겨주는 완전한 최종 어셈블 링 된 명령 줄을 보여주세요. –

+0

예, 경로가 올바르게되었습니다. 나는 그것을 확인했다. – Aaron

1

나는 다소 다른 아이디어를 가지고 있습니다 - 물론 Jim은 "~"에서와 같이 프로세스 작성자 내에서 작동하지 않습니다. 시스템 환경 설정을 사용하는 것이 일반적으로 길입니다.

필자는 다음과 같이 제안했다 : 단순히 을 확인하십시오. 명령 줄에서 사용중인 모든 파일 이름이 기존 파일을 가리키는 것입니다.

왜 JAR을 가리키는 File 객체를 만들지 않습니까? 따라서 IOException이 발생할 때까지 기다릴 필요가 없다. JAR에 대해 함께 사용하는 경로가 올바른지 이해하기 위해 간단한 exists() 호출을 수행한다. 그리고 자바 실행 파일에 대해서도 똑같이 할 수 있습니다!

+0

결국 디버깅 목적으로이 작업을 끝내지 만 제안한 것처럼 유효성을 검사 할 것입니다. – Aaron

관련 문제