阅读我自己的罐子清单

2022-08-31 07:38:26

我需要读取文件,该文件交付了我的类,但是当我使用时:Manifest

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

我从第一个加载到Java运行时中获得。
我的应用程序将从小程序或Webstart运行,
因此我将无法访问自己的文件,我猜。MANIFEST.jar.jar

我实际上想从启动Felix OSGi的属性中读取属性,这样我就可以向Felix公开这些包。有什么想法吗?Export-package.jar


答案 1

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

  1. 调用并循环访问返回的 URL 集合,将它们作为清单读取,直到找到您的:getResources()

    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
        }
    }
    
  2. 您可以尝试检查 是否是 的实例。大多数 Sun 类装入器都是,包括 .然后,您可以强制转换它并调用已知 ( 至少对于小程序而言 - 直接返回所需的清单:getClass().getClassLoader()java.net.URLClassLoaderAppletClassLoaderfindResource()

    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
    }
    

答案 2

您可以先找到课程的 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");

推荐