2011-12-16 6 views
11

URLClassLoader를 사용하여 외부 jar 파일을로드하고 실행하려고합니다.Java에서 jar 파일의 기본 클래스 이름을 가져 오는 방법은 무엇입니까?

"Main-Class"를 얻는 가장 쉬운 방법은 무엇입니까?

+3

나는 그것이 당신이 찾고있는 것이 확실치 않지만 항아리가 올바르게 구성되어 있다면 항아리에 메인 클래스를 명시하는 매니페스트 파일이있을 것이라고 기대할 것입니다. 따라서 당신은 그것을 알아낼 필요가 없습니다. – hovanessyan

+0

나는 그 파일을 수동으로 읽지 않고 간단한 방법을 찾고있다. 'java -jar'는 manifest에서 속성을 읽기 위해 라이브러리 함수를 사용합니까? –

+0

나는 그것을 모른다. 가능성이 높다. 공식 문서의 내용 : 매니페스트에 Main-Class 헤더를 설정 한 후 java 명령의 다음 형식을 사용하여 JAR 파일을 실행합니다. java -jar JAR 이름 지정된 클래스의 기본 메소드 Main-Class 헤더가 실행됩니다. 그 항아리에 매니 페스트 (manifest)의 존재를 강요 할 수 있다면, 이것은 갈 수있는 가장 쉽고 (아마도 더 나은) 방법이 될 것입니다. – hovanessyan

답변

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

'(-> (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

당신은 jarfile가를 다운로드해야합니다; 이에 대한 몇 가지 자바 코드는 다음과 같을 수 있습니다

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

here - Listing the main attributes of a jarfile에서 나는 적어도 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() 메소드

관련 문제