所以我试图通过检查mainfest文件中的一些值来查看.jar是否有效。使用java读取和解析文件的最佳方法是什么?我想过使用这个命令来解压缩文件
jar -xvf anyjar.jar META-INF/MANIFEST.MF
但我可以这样做:
File manifest = Command.exec("jar -xvf anyjar.jar META-INF/MAINFEST.MF");
然后使用一些缓冲的阅读器或其他东西来解析文件的行?
感谢您的帮助......
答案 0 :(得分:11)
使用jar
工具的问题是它需要安装完整的JDK。许多Java用户只安装了JRE,但不包括jar
。
此外,jar
必须位于用户的路径上。
所以我建议使用正确的API,如下所示:
Manifest m = new JarFile("anyjar.jar").getManifest();
这实际上应该更容易!
答案 1 :(得分:4)
java.lang.Package 中的Package类具有执行所需操作的方法。以下是使用java代码获取清单内容的简便方法:
String t = this.getClass().getPackage().getImplementationTitle();
String v = this.getClass().getPackage().getImplementationVersion();
我把它放在共享实用程序类中的静态方法中。该方法接受一个类句柄对象作为参数。这样,我们系统中的任何类都可以在需要时获取自己的清单信息。显然,可以很容易地修改该方法以返回值的数组或散列图。
调用方法:
String ver = GeneralUtils.checkImplVersion(this);
名为 GeneralUtils.java 的文件中的方法:
public static String checkImplVersion(Object classHandle)
{
String v = classHandle.getClass().getPackage().getImplementationVersion();
return v;
}
要获得清单字段值,而不是通过Package类获得的值(例如您自己的构建日期),您将获得主要属性并完成这些操作,并询问您想要的特定属性。以下代码是我发现的类似问题的一个小模块,可能在这里。 (我想赞美它,但我失去了它 - 抱歉。)
将它放在try-catch块中,将classHandle(“this”或MyClass.class)传递给该方法。 “classHandle”的类型为Class:
String buildDateToReturn = null;
try
{
String path = classHandle.getProtectionDomain().getCodeSource().getLocation().getPath();
JarFile jar = new JarFile(path); // or can give a File handle
Manifest mf = jar.getManifest();
final Attributes mattr = mf.getMainAttributes();
LOGGER.trace(" --- getBuildDate: "
+"\n\t path: "+ path
+"\n\t jar: "+ jar.getName()
+"\n\t manifest: "+ mf.getClass().getSimpleName()
);
for (Object key : mattr.keySet())
{
String val = mattr.getValue((Name)key);
if (key != null && (key.toString()).contains("Build-Date"))
{
buildDateToReturn = val;
}
}
}
catch (IOException e)
{ ... }
return buildDateToReturn;
答案 2 :(得分:2)
最简单的方法是使用JarURLConnection类:
String className = getClass().getSimpleName() + ".class";
String classPath = getClass().getResource(className).toString();
if (!classPath.startsWith("jar")) {
return DEFAULT_PROPERTY_VALUE;
}
URL url = new URL(classPath);
JarURLConnection jarConnection = (JarURLConnection) url.openConnection();
Manifest manifest = jarConnection.getManifest();
Attributes attributes = manifest.getMainAttributes();
return attributes.getValue(PROPERTY_NAME);
因为在某些情况下...class.getProtectionDomain().getCodeSource().getLocation();
会给出vfs:/
的路径,所以应该另外处理。
或者,使用ProtectionDomain:
File file = new File(getClass().getProtectionDomain().getCodeSource().getLocation().toURI());
if (file.isFile()) {
JarFile jarFile = new JarFile(file);
Manifest manifest = jarFile.getManifest();
Attributes attributes = manifest.getMainAttributes();
return attributes.getValue(PROPERTY_NAME);
}