无法使用java.util.jar.jar文件读取jar清单

无法使用java.util.jar.jar文件读取jar清单,java,jar,Java,Jar,使用java.util.jar.JarFile类读取jar文件中清单的内容时遇到问题。最终,我试图解决的问题是确定一个特定的jar文件的清单中是否有一个Main Class条目,但在我到达那里之前,我将清单设置为空 考虑这个最小的测试用例: public class ReadJar { public static void main(String[] args) { try { java.util.jar.JarFile jf = new java.util.jar.Ja

使用
java.util.jar.JarFile
类读取jar文件中清单的内容时遇到问题。最终,我试图解决的问题是确定一个特定的jar文件的清单中是否有一个
Main Class
条目,但在我到达那里之前,我将清单设置为空

考虑这个最小的测试用例:

public class ReadJar {
  public static void main(String[] args) {
    try {
      java.util.jar.JarFile jf = new java.util.jar.JarFile("Hello.jar");
      System.out.println("Manifest entries: " + jf.getManifest().getEntries());
    } catch (java.io.IOException e) {
      e.printStackTrace();
    }
  }
}
我正在测试它,如下所示:

$ cat Hello.java 
public class Hello {
  public static void main(String[] args) {
    System.out.println("Hello");
  }
}
$ cat mainifest.txt 
Main-Class: Hello
$ javac Hello.java 
$ jar cfm Hello.jar mainifest.txt Hello.class 
$ java -jar Hello.jar 
Hello
$ javac ReadJar.java 
$ java ReadJar 
Manifest entries: {}
$ 
看来我正确地创建了jar,因为它可以使用
java-jar
命令运行。人工检查舱单对我来说也是正确的:

$ unzip -d temp Hello.jar 
Archive:  Hello.jar
   creating: temp/META-INF/
  inflating: temp/META-INF/MANIFEST.MF  
  inflating: temp/Hello.class        
$ cat temp/META-INF/MANIFEST.MF 
Manifest-Version: 1.0
Created-By: 1.8.0_40-internal (Oracle Corporation)
Main-Class: Hello

$ 

那么你如何才能正确地阅读清单呢?是否有一个不同于java.util.jar.JarFile的类应该使用?MANIFEST.MF中的所有内容都是。因此,您可以使用此函数获取属性
getmaintattributes()
。从那里,您可以获得密钥集,然后尝试迭代它,并从密钥中获取值。

Perfect。谢谢对于稍后看到这一点的人,将我的
println
行更改为
jf.getManifest().getmaintattributes().keySet()
将获得我期望的
[创建人,清单版本,主类]
的输出。