我需要阅读该Manifest文件,该文件提供了我的课程,但是当我使用时:
Manifest
getClass().getClassLoader().getResources(...)
我MANIFEST从第一个.jar加载到Java运行时中就得到了。 我的应用程序将从applet或Webstart运行, 所以我无法访问自己的.jar文件。
.jar
applet
Webstart
我实际上是想Export-package从.jar启动Felix OSGi的中读取属性,因此可以将这些包公开给Felix。有任何想法吗?
Export-package
Felix OSGi
你可以执行以下两项操作之一:
调用getResources()并遍历返回的URL集合,将它们作为清单读取,直到找到你的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 } }
你可以尝试检查是否getClass().getClassLoader()是的实例java.net.URLClassLoader。Sun的大多数类加载器包括AppletClassLoader。然后,你可以对其进行转换并调用findResource()已知的(至少对于applet而言)直接返回所需的清单:
getClass().getClassLoader()
java.net.URLClassLoader
AppletClassLoader
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 }
你可以先找到课程的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");