读我自己的Jar's Manifest

问题

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

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

我将MANIFEST从第一个.jar加载到Java运行时。
我的应用程序将从applet或webstart运行,
所以我想我无法访问自己的.jar文件。

我实际上想要阅读启动Felix OSGi的.jar中的Export-package属性,所以我可以将这些包暴露给Felix。有任何想法吗?


#1 热门回答(104 赞)

你可以先找到你班级的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");

#2 热门回答(94 赞)

你可以做以下两件事之一:

  • 调用getResources()并迭代返回的URL集合,将它们作为清单读取,直到找到你的:枚举<URL> resources = getClass()。getClassLoader()
      .getResources( "META-INF / MANIFEST.MF");
    while(resources.hasMoreElements()){
        尝试{
          清单清单= new Manifest(resources.nextElement()。openStream());
          //检查这是你的清单,做你需要的或者下一个
          ...
        } catch(IOException E){
          //句柄
        }
    }
  • 你可以尝试检查getClass()。getClassLoader()是否是java.net.URLClassLoader的实例。大多数Sun类加载器都包括AppletClassLoader。然后,你可以将其转换并调用已知的findResource() - 至少为applet - 直接返回所需的清单:URLClassLoader cl =(URLClassLoader)getClass()。getClassLoader();
    尝试{
      URL url = cl.findResource("META-INF / MANIFEST.MF");
      清单清单=新清单(url.openStream());
      //用它做点什么
      ...
    } catch(IOException E){
      //句柄
    }

#3 热门回答(18 赞)

你可以使用Manifests fromjcabi-manifests并从任何可用的MANIFEST.MF文件中读取任何属性,只需一行:

String value = Manifests.read("My-Attribute");

你需要的唯一依赖是:

<dependency>
  <groupId>com.jcabi</groupId>
  <artifactId>jcabi-manifests</artifactId>
  <version>0.7.5</version>
</dependency>

此外,请参阅此博客文章了解更多详细信息:http://www.yegor256.com/2014/07/03/how-to-read-manifest-mf.html