Как получить имя основного класса jar-файла из Java? - PullRequest
11 голосов
/ 16 декабря 2011

Я хочу загрузить и выполнить внешний JAR-файл, используя URLClassLoader.

Какой самый простой способ получить «Main-Class» из него?

Ответы [ 3 ]

6 голосов
/ 22 января 2014

Я знаю, что это старый вопрос, но, по крайней мере с 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 ().

5 голосов
/ 16 декабря 2011

С здесь - список основных атрибутов 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) {}
    }
}
5 голосов
/ 16 декабря 2011

Это будет возможно только в том случае, если банка выполняется самостоятельно; в этом случае основной класс будет указан в файле манифеста с ключом Main-Class:

Некоторая справочная информация представлена ​​здесь: http://docs.oracle.com/javase/tutorial/deployment/jar/appman.html

Вам необходимо скачать jarfile, а затем использовать java.util.JarFile для доступа к нему; некоторый код 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");
}
...