无法使用 java.util.jar.JarFile 读取 jar 清单
Unable to read jar manifest with java.util.jar.JarFile
我在使用 java.util.jar.JarFile
class 读取 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
不同的 class 吗?
您MANIFEST.MF中的所有内容都是main attributes。所以你可以使用这个函数来获取属性getMainAttributes()
。从那里你可以获得键集,然后尝试迭代它并从键中获取值。
我在使用 java.util.jar.JarFile
class 读取 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
不同的 class 吗?
您MANIFEST.MF中的所有内容都是main attributes。所以你可以使用这个函数来获取属性getMainAttributes()
。从那里你可以获得键集,然后尝试迭代它并从键中获取值。