2011-12-16 10 views
11

URLClassLoaderを使用して外部jarファイルをロードして実行します。Javaからjarファイルのメインクラスの名前を取得する方法は?

"Main-Class"を取得する最も簡単な方法は何ですか?

+3

私はそれがあなたが探しているものかどうかはわかりませんが、jarが正しく構成されていれば、jarファイルにmainクラスを指定するマニフェストファイルがあると思います。したがって、あなたはそれを理解する必要はありません。 – hovanessyan

+0

私はそのファイルをマニュアルで読むことなく簡単な方法を探しています。 'java -jar'はいくつかのライブラリ関数を使ってマニフェストから属性を読み込みますか? –

+0

私は知らない、それは本当らしい。公式の文書だけが言います:マニフェストのMain-Classヘッダーを設定したら、javaコマンドの次の形式を使用してJARファイルを実行します: java -jar JAR名 指定されたクラスのメインメソッドMain-Classヘッダーの中で実行されます。その瓶にマニフェストの存在を強制することができれば、これは最も簡単な(そしておそらくより良い)方法になります。 – hovanessyan

答えて

5

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

'( - >(java.util.jar.JarFile。" myjarfile.jar ")(.getManifest)(.getMainAttributes)(.getValue" Main-Class "))' ' –

5

これは、jarが自己実行型である場合にのみ可能です。その場合には、メインクラスは、キーMain-Class:

いくつかの参考情報とマニフェストファイルで指定されますが、ここで提供されています。それにアクセスするためにjava.util.JarFileを使用 http://docs.oracle.com/javase/tutorial/deployment/jar/appman.html

あなたはjarファイルをダウンロードする必要があります。このため、いくつかのJavaコードは次のようになります。

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

はい、自己実行型です。私は思考マニフェストファイルを手動で解析することなくその名前を取得したい。 –

6

から私はこの古い質問ですが、少なくともJDK 1.7で、以前に提案されたソリューションが動作するようには思えませんでした知っています。このため は、私は私を掲示しています:

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

j.getManifest().getEntries()はMain-Class属性が含まれていないことが判明しているため、他のソリューションは、私がいたために機能しなかった理由、それは代わりに返すリストに含まれていましたgetMainAttributes()メソッド

関連する問題