tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
6
ZUGRIFFE
1111
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    derHarri derHarri ist offline Mitglied
    Registriert seit
    Nov 2004
    Beiträge
    18
    Hallo,

    ich habe folgendes Problem. Ich soll zur Laufzeit Informationen aus einem MANIFEST lesen. Ich habe ein Anwendung die als jar gepackt wird. In ihr befindet sich dementsprechend das zu lesende MANIFEST. Die Klasse, die die Information lesen soll, befindet sich ebenfalls in dem Jar. Ich versuche also nicht auf ein MANIFEST in einem externen jar zuzugreifen sondern auf "das eigene".
    Das klingt, als würde es dafür eine simple und elegante Lösung geben. Ich habe sie nur leider bisher nicht gefunden. Wäre cool, wenn mir jemand weiterhelfen könnte.

    Danke schonmal

    Harri E.
     

  2. #2
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo!

    Ein (sicherer) Weg waere beispielsweise:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    
    /**
     * 
     */
    package de.tutorials;
     
    import java.io.File;
    import java.io.IOException;
    import java.net.URISyntaxException;
    import java.util.jar.JarFile;
    import java.util.jar.Manifest;
     
    /**
     * @author Tom
     * 
     */
    public class ManifestAnalyzer {
     
        /**
         * @param args
         */
        /**
         * @param args
         */
        public static void main(String[] args) throws Exception {
            Manifest manifest = getManifestFileOfJarContaining(ManifestAnalyzer.class);
            System.out.println(manifest.getMainAttributes().getValue("Main-Class"));
        }
     
        /**
         * @return
         * @throws IOException
         * @throws URISyntaxException
         */
        public static Manifest getManifestFileOfJarContaining(Class clazz)
                throws IOException, URISyntaxException {
            JarFile jarFile = new JarFile(new File(clazz.getProtectionDomain()
                    .getCodeSource().getLocation().toURI()));
            Manifest manifest = jarFile.getManifest();
            jarFile.close();
            return manifest;
        }
    }

    Code :
    1
    2
    
    C:\>java -jar manifestAnalyzer.jar
    de.tutorials.ManifestAnalyzer

    Eine andere Moeglichkeit waere ueber den entsprechenden ClassLoader zu gehen... das Problem hierbei ist jedoch, dass der zum Jar gehoerende ClassLoader auch noch andere Jars im Repository hat...:
    Code java:
    1
    2
    3
    
    URL manifestResource = ManifestAnalyzer.class.getClassLoader()
                    .getResource("META-INF/MANIFEST.MF");
            System.out.println(manifestResource);
    Liefert beispielsweise:
    Code :
    1
    2
    
    C:\>java -jar manifestAnalyzer.jar
    jar:file:/C:/Program%20Files/Java/jdk1.5.0_05/jre/lib/rt.jar!/META-INF/MANIFEST.MF

    Code java:
    1
    2
    3
    4
    5
    
        Enumeration manifestResources = ManifestAnalyzer.class.getClassLoader()
                    .getResources("META-INF/MANIFEST.MF");
            while (manifestResources.hasMoreElements()) {
                System.out.println(manifestResources.nextElement());
            }

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    C:\>java -jar manifestAnalyzer.jar
    jar:file:/C:/Program%20Files/Java/jdk1.5.0_05/jre/lib/rt.jar!/META-INF/MANIFEST.MF
    jar:file:/C:/Program%20Files/Java/jdk1.5.0_05/jre/lib/jsse.jar!/META-INF/MANIFEST.MF
    jar:file:/C:/Program%20Files/Java/jdk1.5.0_05/jre/lib/jce.jar!/META-INF/MANIFEST.MF
    jar:file:/C:/Program%20Files/Java/jdk1.5.0_05/jre/lib/charsets.jar!/META-INF/MANIFEST.MF
    jar:file:/C:/Program%20Files/Java/jdk1.5.0_05/jre/lib/ext/dnsns.jar!/META-INF/MANIFEST.MF
    jar:file:/C:/Program%20Files/Java/jdk1.5.0_05/jre/lib/ext/localedata.jar!/META-INF/MANIFEST.MF
    jar:file:/C:/Program%20Files/Java/jdk1.5.0_05/jre/lib/ext/sunjce_provider.jar!/META-INF/MANIFEST.MF
    jar:file:/C:/Program%20Files/Java/jdk1.5.0_05/jre/lib/ext/sunpkcs11.jar!/META-INF/MANIFEST.MF
    jar:file:/C:/manifestAnalyzer.jar!/META-INF/MANIFEST.MF

    Gruss Tom
    Angehängte Dateien Angehängte Dateien
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  3. #3
    Avatar von kroesi
    kroesi kroesi ist offline Mitglied Gold
    Registriert seit
    Jun 2005
    Beiträge
    166
    Hi !

    Es geht,soweit ich weiss, auch mit dem JarFileInputStream ...


    Krösi
     

  4. #4
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo!

    Es geht,soweit ich weiss, auch mit dem JarFileInputStream ...
    AFAIK ist es egal ob man ueber das JarFile oder ein JarInputStream geht um sich mit getManifest das entsprechende Manifest zu besorgen. Der Punkt ist dass man dazu auf jeden Fall das Jar bzw. die Location des jars kennen muss. Um den Speicherort des Jar Files zu erfahren in dem sich eine spezielle Klasse befindet ist es eben eine Moeglichkeit ueber clazz.getProtectionDomain()
    .getCodeSource().getLocation().toURI() zu gehen.

    Gruss Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  5. #5
    flashray flashray ist offline Mitglied Rubin
    Registriert seit
    Sep 2005
    Ort
    Mannheim
    Beiträge
    1.325
    Hallo Tom,

    wieso wird hier das Manifest vom JDK ausgegeben anstatt dessen, von welcher die Main-Class aufgerufen wird?

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    import java.io.*;
     
    public class ReadManifest {
     
        public static void main(String[] args) {
            try {
                InputStream is = ReadManifest.class.getClassLoader()
                        .getResourceAsStream("META-INF/MANIFEST.MF");
                BufferedReader in = new BufferedReader(new InputStreamReader(is));
                String s = "";
                while ((s = in.readLine()) != null)
                    System.out.println(s);
                in.close();
     
            } catch (NullPointerException e) {
                System.out.println("Error: " + e.getMessage());
            } catch (IOException e) {
                System.out.println("Error: " + e.getMessage());
            }
        }
    }

    Ausgabe:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    Manifest-Version: 1.0
    Specification-Title: Java Platform API Specificat
    Created-By: 1.5.0_04 (Sun Microsystems Inc.)
    Implementation-Title: Java Runtime Environment
    Specification-Vendor: Sun Microsystems, Inc.
    Specification-Version: 1.5
    Implementation-Version: 1.5.0_04
    Implementation-Vendor: Sun Microsystems, Inc.
     
    Name: javax/swing/JRadioButtonMenuItem.class
    Java-Bean: True
     
    Name: javax/swing/JList.class
    Java-Bean: True
     
    Name: javax/swing/JPasswordField.class
    Java-Bean: True
     
    ...


    Vg Erdal
     

  6. #6
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo!

    Wie ich schon sagte, der ClassLoader der fuer "dieses" Jar verantwortlich ist hat auch noch andere Jars in seiner URL Liste. Wenn man nun mit getResource(...) eine Resource sucht, dann schaut der ClassLoader mit dem angegebenen Suchmuster in seine URL Liste und gibt den zuerst gefunden Eintrag zurueck...

    Code java:
    1
    2
    3
    4
    5
    
          Enumeration manifestResources = ManifestAnalyzer.class.getClassLoader()
                          .getResources("META-INF/MANIFEST.MF");
                  while (manifestResources.hasMoreElements()) {
                      System.out.println(manifestResources.nextElement());
                  }
    aus meinem Beispiel listet alle Resourcen auf die dem angegebenen Muster entsprechen.

    Gruss Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  7. #7
    flashray flashray ist offline Mitglied Rubin
    Registriert seit
    Sep 2005
    Ort
    Mannheim
    Beiträge
    1.325
    D a n k e .
     

Ähnliche Themen

  1. Jar und Manifest
    Von DerKoenig im Forum Java
    Antworten: 2
    Letzter Beitrag: 17.11.10, 14:33
  2. Frage zu Manifest Datei für Jar-archiv
    Von voodinator im Forum Java
    Antworten: 4
    Letzter Beitrag: 02.09.10, 12:19
  3. Wie zusätzliche Manifest Datei angeben?
    Von buell im Forum .NET Café
    Antworten: 1
    Letzter Beitrag: 26.06.08, 13:46
  4. xp manifest
    Von utzutz im Forum Visual Basic 6.0
    Antworten: 3
    Letzter Beitrag: 10.07.05, 11:31
  5. Datei Zugriff über Applet durch eine Policy - Datei
    Von Kian_the_klingon im Forum Java
    Antworten: 0
    Letzter Beitrag: 31.07.04, 20:23