一尘不染

Java 读我自己的Jar清单

java

我需要阅读该Manifest文件,该文件提供了我的课程,但是当我使用时:

getClass().getClassLoader().getResources(...)

我MANIFEST从第一个.jar加载到Java运行时中就得到了。
我的应用程序将从appletWebstart运行,
所以我无法访问自己的.jar文件。

我实际上是想Export-package.jar启动Felix OSGi的中读取属性,因此可以将这些包公开给Felix。有任何想法吗?


阅读 432

收藏
2020-03-08

共2个答案

一尘不染

你可以执行以下两项操作之一:

调用getResources()并遍历返回的URL集合,将它们作为清单读取,直到找到你的URL:

Enumeration<URL> resources = getClass().getClassLoader()
  .getResources("META-INF/MANIFEST.MF");
while (resources.hasMoreElements()) {
    try {
      Manifest manifest = new Manifest(resources.nextElement().openStream());
      // check that this is your manifest and do what you need or get the next one
      ...
    } catch (IOException E) {
      // handle
    }
}

你可以尝试检查是否getClass().getClassLoader()是的实例java.net.URLClassLoader。Sun的大多数类加载器包括AppletClassLoader。然后,你可以对其进行转换并调用findResource()已知的(至少对于applet而言)直接返回所需的清单:

URLClassLoader cl = (URLClassLoader) getClass().getClassLoader();
try {
  URL url = cl.findResource("META-INF/MANIFEST.MF");
  Manifest manifest = new Manifest(url.openStream());
  // do stuff with it
  ...
} catch (IOException E) {
  // handle
}
2020-03-08
一尘不染

你可以先找到课程的URL。如果是JAR,则从那里加载清单。例如,

Class clazz = MyClass.class;
String className = clazz.getSimpleName() + ".class";
String classPath = clazz.getResource(className).toString();
if (!classPath.startsWith("jar")) {
  // Class not from JAR
  return;
}
String manifestPath = classPath.substring(0, classPath.lastIndexOf("!") + 1) + 
    "/META-INF/MANIFEST.MF";
Manifest manifest = new Manifest(new URL(manifestPath).openStream());
Attributes attr = manifest.getMainAttributes();
String value = attr.getValue("Manifest-Version");
2020-03-08