2017-11-29 20 views
0

'outer.jar'파일에 기본 클래스가 있습니다. 이 항아리 안에는 classes/lib 폴더에 'inner.jar'라는 다른 항아리가 있습니다. java -jar outer.jar 명령을 사용하여 외부 jar를 실행할 때 내부 Jar을 실행하려면 어떻게해야합니까?외부 jar을 실행하면 내부 jar을 실행해야합니다

내 메인 클래스가 'inner.jar'라는 다른 항아리를 실행하고 출력을 소비하고 있습니다. 이제 내 응용 프로그램은 또한 'outer.jar'이라는 병으로 포장하고, 나는이 'outer.jar'를 실행하면, 다음 주 클래스는 inner.jar를 실행할 수 없습니다

외부 항아리 메인 클래스 코드 :

public class OuterJarMain{ 
    public static void main(String[] args) { 

      String path = OuterJarMain.class.getProtectionDomain().getCodeSource().getLocation().getPath(); 
      ProcessBuilder pb = new ProcessBuilder("java", "-jar", path.substring(1)+"lib/inner.jar", "1"); 
      try { 
       Process p = pb.start(); 

      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

inner.jar이 target/classes/lib 폴더에서 사용 가능하므로 주 클래스를 IDE에서 실행할 때 코드가 제대로 작동합니다. 그러나 명령 행에서 outer.jar을 실행하면 경로는 /C:/....../outer.jar!/.../classes!/으로 표시되고 inner.jar은 실행되지 않습니다.

답변

1

jar 파일은 아카이브되므로 일반 파일과 동일한 방법으로 액세스 할 수 없습니다. 당신이 할 수있는 일

this post에서 입증 된 바와 같이, 폴더 밖으로 항아리 내부의 항목을 복사 한 다음 항아리가 필요하지 않은 경우 나중에 당신이 호출 할 수 java -jar와 함께 항아리를 실행입니다 File.deleteOnExit()

편집 : 해당 게시물의 코드를 수정하고 아래의 예를 참조하십시오. 내 보낸 jar 파일의 절대 위치를 반환합니다.

public static String exportInnerJar(){ 
    String jarDir = ""; 
    try { 
     //Get the parent directory of the outer jar. 
     jarDir = URLDecoder.decode(ClassLoader.getSystemClassLoader().getResource(".").getPath(),"UTF-8"); 
    } catch (UnsupportedEncodingException e) { 
     System.err.println("Fail to find the outer jar location"); 
     e.printStackTrace(); 
    } 
    //The location of the inner jar 
    //The example means the innar jar is at outer.jar/example/inner.jar where "example" is a folder under the root of the outer jar. 
    InputStream is = ClassName.class.getResourceAsStream("/example/inner.jar"); 

    //The location to be exported to, you can change this to wherever you want 
    File exportInnerJar = new File(jarDir).toPath().resolve("inner.jar").toFile(); 

    //Create the file 
    exportInnerJar.createNewFile(); 

    //Use FileOutputStream to write to file 
    FileOutputStream fos = new FileOutputStream(exportInnerJar); 

    //setup a buffer 
    int readBytes; 
    byte[] buffer = new byte[4096]; 

    //export 
    while ((readBytes = is.read(buffer)) > 0) { 
     fos.write(buffer, 0, readBytes); 
    } 

    // close streams 
    is.close(); 
    fos.close(); 

    return exportInnerJar.getAbsolutePath(); 
} 
+0

안녕하세요, 내부 항아리의 기본 클래스를 외부 항아리의 일부 폴더로 내 보내야합니까? 방금 ​​내부 항아리를 트리거하고 outerjarmain.class의 process.getInputStream()을 사용하여 출력을 사용하려고합니다. – firstpostcommenter

+0

전체 내부 항아리를 내보내고 실행해야합니다. – Judger

+0

이 접근 방식은 내보낼 폴더를 알지 못하기 때문에 linux, docker 등에서 사용할 수 있습니까? – firstpostcommenter