2011-12-16 18 views
11

URLClassLoader kullanarak harici jar dosyası yüklemek ve yürütmek istiyorum.Java'dan bir jar dosyasının ana sınıfının adı nasıl alınır?

"Ana Sınıf" almanın en kolay yolu nedir?

+3

Aradığın şeyin bu olduğundan emin değilim, ancak kavanoz doğru bir şekilde oluşturulmuşsa, kavanozda, ana sınıfın hangisi olduğunu belirten bir açık dosya olmasını beklersiniz. Böylece bunu anlamaya gerek yok. – hovanessyan

+0

Bu dosyayı elle okumaksızın basit yollar arıyorum. Java -jar, manifestten gelen özellikleri okumak için bazı kütüphane işlevini kullanıyor mu? –

+0

Bilmiyorum, büyük olasılıkla böyle. Resmi doktor şöyle diyor: Ana-sınıf başlığını manifestoda ayarladıktan sonra java komutunun aşağıdaki formunu kullanarak JAR dosyasını çalıştırırsınız: java -jar JAR ismi Belirtilen sınıfın ana yöntemi Ana Sınıf başlıkta yürütülür. Bu kavanozda tezahürün varlığını sürdürürseniz, bu en kolay (ve muhtemelen daha iyi) olacak. – hovanessyan

cevap

5

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

Kullanarak '(-> (java.util.jar.JarFile." Myjarfile.jar ") (.getManifest) (.getMainAttributes) (.getValue" Ana Sınıf "))' –

5

Bu, ancak kavanoz kendi kendine yürütüldüğünde mümkün olacaktır; bu durumda ise ana sınıfı anahtar Main-Class:

Bazı referans bilgileri ile manifest dosyasında belirtilecektir burada sağlanır: o erişmek için java.util.JarFile kullanmak http://docs.oracle.com/javase/tutorial/deployment/jar/appman.html

Sen JARDOSYASI indirmeleri gerekir; Bunun için bazı java kodu olabilir:

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

Evet, kendiliğinden yürütülür. Düşünce bildirim dosyasını elle ayrıştırmadan bu adı almak istiyorum. –

6

here - Listing the main attributes of a jarfile itibaren en az JDK 1.7 ile, daha önce teklif edilen çözümler işe görünmüyordu, bu eski bir soru olduğunu biliyorum ama. Bu nedenle ben benimkini gönderme kulüpler:

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

j.getManifest().getEntries() Ana sınıfı özelliğini içermez çıkıyor çünkü diğer çözümler bendim için işe yaramadı nedeni, bunun yerine tarafından döndürülen listesinde bulunan edildi getMainAttributes() yöntemi.

İlgili konular