2013-05-20 2 views
2

Je veux décompresser les ressources de mon fichier jar. La structure de jar ressemble à ceci:getResourceAsStream() ne voit pas la ressource

my.jar 
    META-INF 
    resources 
     my.exe 
     my.dll 
    my 
     namespace 
      UnpackResourceFromThisClass.class 

Je veux décompresser my.exe et my.dll à partir du fichier JAR. J'ai essayé de déballer ces fichiers en utilisant ce code:

try { 
    InputStream is = getClass().getResourceAsStream("/resources/my.exe") 
    OutputStream os = new FileOutputStream(new File(destDir)) 
    Files.copy(is, os) 
    os.close() 
    is.close() 
} 
catch (NullPointerException e) { 
    e.printStackTrace(); 
} 
catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} 
catch (SecurityException e) { 
    e.printStackTrace(); 
} 

mais cela ne fonctionne pas. Des idées? Par conséquent, j'obtiens cette erreur:

java.lang.NullPointerException 
    at java.nio.file.Files.provider(Files.java:65) 
    at java.nio.file.Files.newInputStream(Files.java:106) 
    at java.nio.file.Files.copy(Files.java:2884) 
    at java_nio_file_Files$copy.call(Unknown Source) 
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:42) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:120) 
    at pl.ydp.gradle.Is2k8Task.getResources(Is2k8Task.groovy:84) 
    at pl.ydp.gradle.Is2k8Task.build(Is2k8Task.groovy:30) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90) 
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233) 
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1047) 
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:877) 
    at org.gradle.api.internal.BeanDynamicObject$MetaClassAdapter.invokeMethod(BeanDynamicObject.java:216) 

Il s'agit d'un code groovy qui sera utilisé dans une tâche personnalisée Gradle.

+0

je serais a) vérifier que le fichier .exe est b) vérifier la méthode 'Files.copy()', la version qui accepte un 'InputStream' nécessite que le second paramètre soit un' Path' (pourquoi cela ne provoque pas une erreur de compilation qui me dépasse) http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html – SJuan76

+0

"pourquoi cela ne provoque pas une erreur de compilation est au-delà de moi" Groovy semble être le casting, le numéro de ligne dans la trace de la pile indique le premier argument est un chemin – mauhiz

Répondre

1

Supprimer la barre oblique, getResourceAsStream utilisera le chemin absolu si le premier caractère est une barre oblique.

+1

J'ai également testé cela sans sla leader sh mais ça n'a pas aidé. Comme vous l'avez écrit, l'utilisation de la barre oblique va charger les ressources en utilisant le chemin absolu. Si je comprends bien, utiliser '/' le chargera à partir de jar root dir et sans '/' les chargera de dir où la classe existe? – pepuch

+2

Essayez d'utiliser getClass(). GetClassLoader(). GetResourceAsStream à la place. – kutschkem

2

Vous semblez être écrire Java ... Je ne sais pas si cela vous contourner votre problème, mais ce qui précède pourrait être écrit en Groovy:

this.getClass().getResource('/resources/my.exe').withInputStream { ris -> 
    new File(destDir).withOutputStream { fos -> 
    fos << ris 
    } 
} 
+0

Merci. Je suis nouveau dans le sou gro vous avez raison - son code java est compilé à partir de groovy. J'ai testé cela mais obtenir cette erreur 'Causée par: java.io.FileNotFoundException: ressources d'entrée JAR/my.exe introuvable dans C: \ espace de travail-eclipse-juno \ Is2k8 \ repo \ pl \ ydp \ gradle \ is2k8 \ 0.9 \ is2k8-0.9.jar'. Je suis sûr que 'my.exe' est dans le fichier jar. – pepuch

+0

@ PatrykRoszczyniała Vraiment sûr? On dirait que l'exe n'est pas dans le pot au moment où ce code est en cours d'exécution ... Il n'est pas ajouté plus tard, n'est-ce pas? –

+0

Voici comment je le tester: 1. Compilez jar gradle avec my.exe et my.dll. 2. Publiez ce jar dans le repo maven local. 3. Exécutez gradle build qui charge jar et lance la tâche depuis ce pot. – pepuch