2011-12-16 27 views
11

Tôi muốn tải và thực thi tệp jar bên ngoài bằng cách sử dụng URLClassLoader.Cách lấy tên của lớp chính của tệp jar từ Java?

Cách dễ nhất để lấy "Main-Class" từ nó là gì?

+3

Tôi không chắc chắn đó là những gì bạn đang tìm kiếm, nhưng nếu bình được soạn một cách chính xác, bạn sẽ mong đợi có một tệp kê khai trong bình, chỉ định đó là lớp chính. Vì vậy, bạn sẽ không cần phải tìm ra điều đó. – hovanessyan

+0

Tôi đang tìm những cách đơn giản mà không cần đọc thủ công tệp đó. Có 'java -jar' sử dụng một số chức năng thư viện để đọc các thuộc tính từ tệp kê khai không? –

+0

Tôi không biết, rất có thể đó là trường hợp. Tài liệu chính thức chỉ cho biết: Sau khi bạn đã đặt tiêu đề Lớp chính trong tệp kê khai, bạn hãy chạy tệp JAR bằng cách sử dụng biểu mẫu java sau: java -jar JAR-name Phương thức chính của lớp được chỉ định trong tiêu đề Main-Class được thực hiện. Nếu bạn có thể thực thi sự hiện diện của biểu hiện trong cái bình đó, thì cách này sẽ dễ nhất (và có lẽ tốt hơn) để đi. – hovanessyan

Trả lời

5

Từ here - Listing the main attributes of a jarfile

import java.util.*; 
import java.util.jar.*; 
import java.io.*; 

public class MainJarAtr{ 
    public static void main(String[] args){ 
     BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
     try { 
      System.out.print("Enter jar file name: "); 
      String filename = in.readLine(); 
      if(!filename.endsWith(".jar")){ 
       System.out.println("File not in jar format."); 
       System.exit(0); 
      } 

      File file = new File(filename); 
      if (file.exists()){ 
       // Open the JAR file 
       JarFile jarfile = new JarFile(filename); 

       // Get the manifest 
       Manifest manifest = jarfile.getManifest(); 

       // Get the main attributes in the manifest 
       Attributes attrs = (Attributes)manifest.getMainAttributes(); 

       // Enumerate each attribute 
       for (Iterator it=attrs.keySet().iterator(); it.hasNext();) { 
        // Get attribute name 
        Attributes.Name attrName = (Attributes.Name)it.next(); 
        System.out.print(attrName + ": "); 

        // Get attribute value 
        String attrValue = attrs.getValue(attrName); 
        System.out.print(attrValue); 
        System.out.println(); 
       } 
      } 
      else{ 
       System.out.print("File not found."); 
       System.exit(0); 
      } 
     } 
     catch (IOException e) {} 
    } 
} 
+1

Sử dụng '(-> (java.util.jar.JarFile." Myjarfile.jar ") (.getManifest) (.getMainAttributes) (.getValue" Main-Class "))' –

5

Điều này chỉ có thể thực hiện nếu bình được tự thực hiện; trong trường hợp lớp chính sẽ được xác định trong file manifest với các thông tin Main-Class:

Một số tài liệu tham khảo quan trọng được cung cấp ở đây: http://docs.oracle.com/javase/tutorial/deployment/jar/appman.html

Bạn sẽ cần phải tải về jarfile sau đó sử dụng java.util.JarFile truy cập vào nó; một số mã java cho điều này có thể là:

JarFile jf = new JarFile(new File("downloaded-file.jar")); 
if(jf.getManifest().getEntries().containsKey("Main-Class")) { 
    String mainClassName = jf.getManifest().getEntries().get("Main-Class"); 
} 
+0

Có, nó tự thực hiện. Tôi muốn lấy tên đó mà không cần phân tích cú pháp tệp kê khai suy nghĩ theo cách thủ công. –

6

Tôi biết đây là một câu hỏi cũ nhưng, ít nhất là với JDK 1.7, các giải pháp đề xuất trước đó dường như không làm việc. Vì lý do này tôi gửi tôi:

JarFile j = new JarFile(new File("jarfile.jar")); 
String mainClassName = j.getManifest().getMainAttributes().getValue("Main-Class"); 

Lý do tại sao các giải pháp khác không làm việc cho tôi là vì j.getManifest().getEntries() hóa ra không chứa các thuộc tính Main-Class, được thay vì chứa trong danh sách trả về bởi phương thức getMainAttributes().

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