2009-06-08 21 views
5

Tôi muốn chạy một kho lưu trữ jar có thể chạy được từ bên trong ứng dụng Java đang chạy của tôi. Tôi cần có khả năng kiểm soát các lớp đang chạy từ bên trong ứng dụng của mình (ví dụ: Dừng, bắt đầu chúng, v.v.).Chạy một kho lưu trữ jar trong một ứng dụng Java đang chạy

Về cơ bản, tôi cần thực hiện "eqvilient" của "java -jar X.jar".

Tôi không thể sử dụng Runtime.getRuntime(). Exec ("...") vì tệp jar sẽ được mã hóa và chúng cần phải được giải mã trước.

Trả lời

4

Một 'Jar thực thi' là tệp jar đơn giản trong đó tệp kê khai có thuộc tính đặc biệt xác định 'lớp' chính.

Vì vậy, bạn chỉ cần đặt jar thực thi của bạn trên đường dẫn lớp, xác định lớp 'chính' và gọi phương thức tĩnh chính của lớp này.

+1

Có thể muốn sử dụng một tùy chỉnh ClassLoader hoặc URLClassLoader.newInstance để tải các lớp động. –

9

Dưới đây là một ví dụ về kéo tên của Main-Class từ file jar sử dụng một JarFile sau đó tải các lớp từ jar sử dụng một URLClassLoader và sau đó gọi static void main sử dụng phản ánh:

package test; 

import java.io.File; 
import java.lang.reflect.Method; 
import java.net.URL; 
import java.net.URLClassLoader; 
import java.util.jar.Attributes; 
import java.util.jar.JarFile; 

public class JarRunner { 

    public static void main(String[] args) throws Exception{ 
     File jar = new File(args[0]); 
     URLClassLoader classLoader = new URLClassLoader(
      new URL[]{jar.toURL()} 
     ); 

     JarFile jarFile = new JarFile(jar); 
     Attributes attribs = jarFile.getManifest().getMainAttributes(); 
     String mainClass = attribs.getValue("Main-Class"); 

     Class<?> clazz = classLoader.loadClass(mainClass); 
     Method main = clazz.getMethod("main", String[].class); 
     main.invoke(null, new Object[]{new String[]{"arg0", "arg1"}}); 
    } 
} 
+2

+1 cho trình diễn tuyệt vời cho Classloader, JarFile và sự phản chiếu. Nhưng tất cả mọi người là người mới đến Java nên lưu ý, rằng các mục tiêu chính mathod được gọi với các đối số 'arg0' và 'arg1'. Việc thực hiện thế giới thực phải thay thế các Chuỗi bằng các đối số thực. –

+0

Một sửa chữa nhỏ là bắt buộc nếu "lớp chính" cũng xảy ra trên đường dẫn lớp của bạn: "URLClassLoader classLoader = new URLClassLoader (URL mới [] {jar.toURL(), null});". Điều này ngăn cản ủy quyền cho trình nạp lớp hiện tại, có thể gây ra các lớp phụ thuộc trong tệp JAR để không tải được. – plinehan

Các vấn đề liên quan