151 votes

Lire le propre manifeste de mon bocal

J'ai besoin de lire l' Manifest le fichier, qui ont livré de ma classe, mais lorsque j'utilise:

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

Je reçois l' MANIFEST de la première .jar chargé dans le Java Runtime.
Mon application sera exécuté à partir d'un applet ou un webstart,
donc je n'aurai pas accès à mon propre .jar le fichier, je suppose.

Je veux lire l' Export-package de l'attribut de l' .jar qui a commencé le Felix OSGi, donc je peux exposer ces paquets de Félix. Des idées?

131voto

ChssPly76 Points 53452

Vous pouvez faire une des deux choses:

1) Appelez getResources() et parcourir la collection en retour de l'Url, à les lire que se manifeste jusqu'à ce que vous trouviez le vôtre:

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) Vous pouvez essayer de vérifier si getClass().getClassLoader() est une instance de l' java.net.URLClassLoader. La majorité de Soleil chargeurs de classes, y compris AppletClassLoader. Vous pouvez alors jetez-y et appelez - findResource() qui a été connu pour les applets, au moins, retourner le besoin manifeste directement:

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
}

125voto

ZZ Coder Points 36990

Vous pouvez d'abord trouver l'URL de votre classe. Si c'est un fichier JAR, vous chargez le manifeste à partir de là. Par exemple,

 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");
 

21voto

yegor256 Points 21737

Vous pouvez utiliser Manifests de jcabi-qui se manifeste et lire n'importe quel attribut de l'un de disponible MANIFESTE.MF fichiers avec une seule ligne:

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

La seule dépendance que vous avez besoin est:

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

Aussi, voir ce billet de blog pour plus de détails: http://www.yegor256.com/2014/07/03/how-to-read-manifest-mf.html

11voto

Anthony Juckel Points 251

Je crois que le moyen le plus approprié pour obtenir le manifeste pour tout faisceau (y compris le bundle qui a chargé d'une classe donnée) est d'utiliser l'ensemble ou BundleContext objet.

// If you have a BundleContext
Dictionary headers = bundleContext.getBundle().getHeaders();

// If you don't have a context, and are running in 4.2
Bundle bundle = FrameworkUtil.getBundle(this.getClass());
bundle.getHeaders();

Notez que le module objet fournit également getEntry(String path) pour rechercher les ressources contenues dans un bundle spécifique, plutôt qu'à la recherche de regrouper l'ensemble de classpath.

En général, si vous voulez bundle spécifique de l'information, ne reposent pas sur des hypothèses sur les chargeurs de classes, il suffit d'utiliser OSGi Api directement.

6voto

Uto Points 21

Vous pouvez utiliser getProtectionDomain (). GetCodeSource () comme ceci:

 URL url = Menu.class.getProtectionDomain().getCodeSource().getLocation();
File file = DataUtilities.urlToFile(url);
JarFile jar = null;
try {
    jar = new JarFile(file);
    Manifest manifest = jar.getManifest();
    Attributes attributes = manifest.getMainAttributes();
    return attributes.getValue("Built-By");
} finally {
    jar.close();
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X