2010-11-27 6 views
3

Je voudrais déterminer le nom du fichier jar de mon code java. J'ai trouvé beaucoup de solutions dans le google, mais rien ne fonctionne. Juste pour voir ce que j'ai essayé ici est un forum de stackoverflow où un tas de solutions est posté: stackoverflowJar nom de fichier formulaire java code

J'ai Mac OS X 10.6.5.
Quand je tape java -version je reçois ce résultat:
java version "1.6.0_22"
Java(TM) SE Runtime Environment (build 1.6.0_22-b04-307-10M3261)
Java HotSpot(TM) 64-Bit Server VM (build 17.1-b03-307, mixed mode)

Merci pour votre aide.


Edit: modifier mon poste pour répondre au commentaire.
Certaines des solutions me donne la valeur "null" quand je veux System.out.println le chemin et échoue aussi quand je veux créer une instance d'un fichier.
D'autres solutions quand je demande le chemin ils ne donnent pas quelque chose comme file:/....., à la place ils donnent quelque chose comme rsch:/ ou quelque chose comme ça, je ne sais pas exactement, mais c'est un mot simple de 4 caractères.


Edit 2: Je cours un pot exécutable à partir de la console. Et je voudrais avoir ce nom de fichier jar dans les classes qui sont dans le fichier jar exécuté.


Edit 3:
Le mot de 4 caractères est: rsrc:./

code comment je suis arrivé ceci:

File file = null; 
    try { 
     System.out.println(MyClass.class.getProtectionDomain().getCodeSource().getLocation().toURI()); 
    } catch (URISyntaxException e) { 
     e.printStackTrace(); 
    } 

Edit 4: J'ai aussi essayé ce code:

package core; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.InputStream; 
import java.util.Properties; 

public class MyClass { 

    public String getText(String key) { 
     String path = "" + MyClass.class.getResource("../any.properties"); 
     File file = new File((path).substring(5, path.length())); 

     Properties props = readProps(file); 

     return props.getProperty(key); 
    } 

    private Properties readProps(File file) { 
     Properties props = new Properties(); 
     InputStream in = null; 

     try { 
      in = new FileInputStream(file); 
      props.load(in); 
      in.close(); 
     } catch (FileNotFoundException e1) { 
      e1.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return props; 
    } 

    public static void main(String[] args) { 
     System.out.println(new MyClass().getText("anything")); 
    } 

    } 

Avec ce résultat:

Exception in thread "main" java.lang.reflect.InvocationTargetException 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58) 
Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: -1 
at java.lang.String.substring(String.java:1937) 
at core.PropHandler.getText(MyClass.java:14) 
at core.PropHandler.main(MyClass.java:39) 
... 5 more 

Ce code fonctionne parfaitement dans l'éclipse, mais quand je crée le fichier jar runnable Je pense que vous pouvez voir le problème.

+1

Le lien que vous avez posté offre quelques solutions. Vous dites "rien ne fonctionne" - pouvez-vous expliquer pourquoi ils ne fonctionnent pas? – EboMike

+0

Jar nom de fichier de * quoi *? – bmargulies

+0

Après les modifications, je ne pense pas que la question mérite un -1. – EboMike

Répondre

1

Ok, enfin c'est le code qui a résolu mon problème:

String sConfigFile = "any.properties"; 

InputStream in = MyClass.class.getClassLoader().getResourceAsStream(sConfigFile); 
if (in == null) { 
    System.out.println("ugly error handling :D"); 
} 
Properties props = new java.util.Properties(); 
try { 
    props.load(in); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

Avec cette façon, il fonde mon dossier de propriété.

1

Est-ce ce que vous voulez? http://www.uofr.net/~greg/java/get-resource-listing.html


[email protected]:/tmp$ cat test.java; javac test.java; jar cvf test.jar test.class; java -cp test.jar test 
public class test { 
public static void main(String[] args) { 
    System.out.println(test.class.getResource("test.class")); 
} 
} 
adding: META-INF/ (in=0) (out=0) (stored 0%) 
adding: META-INF/MANIFEST.MF (in=56) (out=56) (stored 0%) 
adding: test.class (in=845) (out=515) (deflated 39%) 
Total: 
------ 
(in = 885) (out = 883) (deflated 0%) 
jar:file:/tmp/test.jar!/test.class 

Pour l'accès aux ressources qui fonctionne indépendamment de la présence d'un fichier jar, j'utilise toujours classname.class.getResourceAsStream(). Mais le document lié montre comment utiliser JarFile() dans le même but.

+0

S'il vous plaît vérifier mon édition 4. –

+0

Je l'ai fait. Vous avez toujours utilisé File(); Si vous aviez utilisé JarFile() à la place, vous auriez pu accéder aux propriétés avec JarEntry.toString(). En tout cas, vous l'avez obtenu avec getResourceAsStream(), qui est simple et fiable. –

+0

Merci pour vos efforts. –