我正在尝试通过检查manifest文件中的某些值来确定一个.jar文件是否有效。使用Java读取和解析文件的最佳方法是什么?我考虑使用以下命令来提取文件:
jar -xvf anyjar.jar META-INF/MANIFEST.MF
但我可以像这样做吗:
?
File manifest = Command.exec("jar -xvf anyjar.jar META-INF/MAINFEST.MF");
然后使用一些缓冲读取器之类的工具来解析文件的行?谢谢任何帮助...
我正在尝试通过检查manifest文件中的某些值来确定一个.jar文件是否有效。使用Java读取和解析文件的最佳方法是什么?我考虑使用以下命令来提取文件:
jar -xvf anyjar.jar META-INF/MANIFEST.MF
?
File manifest = Command.exec("jar -xvf anyjar.jar META-INF/MAINFEST.MF");
使用jar
工具的问题在于需要安装完整的JDK。许多Java用户仅安装了JRE,其中不包括jar
。
此外,jar
必须在用户的PATH中。
因此,我建议使用适当的API,就像这样:
Manifest m = new JarFile("anyjar.jar").getManifest();
那实际上应该更容易!
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类提供的清单字段值之外的其他字段值(例如您自己的Build-Date),则需获取主属性并逐个查找所需字段。以下代码是从类似问题修改而来,可能是在SO上找到的(我想给它归功于原作者,但我忘记了 - 抱歉)。
在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;
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);
}