2012-05-03 6 views
1

Je sais qu'il y a un certain nombre de questions similaires et ont été à travers eux sans succès. Il me manque probablement quelque chose de très basique. J'ai des fichiers html dans un paquet de ressources dans le fichier jar de l'application et j'ai besoin de récupérer leurs chemins pour les lire et les mettre à jour. Voici mon code:Comment obtenir le chemin des ressources dans un pot

URL url = ClassLoader.class.getResource("/com/lamalva/ressources/test.html"); 
System.out.println(url);   
java.awt.Desktop.getDesktop().browse(java.net.URI.create(url.toString())); 

Quand je lance ce code de NetBeans IDE, la sortie est: fichier: /Users/Philippe/NetBeansProjects/Test/build/classes/com/lamalva/ressources/SatelliteQuotaMonitor.html et le fichier html est ouvert dans le navigateur comme prévu, mais lorsque je lance le fichier jar à partir du terminal OSX, la sortie est: jar: fichier: /Users/Philippe/.Trash/Test/Test.jar!/Com/lamalva/ressources/SatelliteQuotaMonitor.html et le fichier html ne s'ouvre pas. Quoi que je fasse, je n'arrive pas à obtenir le chemin correct. J'ai toujours le "Test.jar!" au milieu. J'apprécierai grandement l'assistance

+1

Pourquoi votre fichier JAR en cours d'exécution de votre poubelle OSX? Dans tous les cas, je suis à peu près certain que votre navigateur par défaut ne saura pas comment récupérer les ressources HTML à partir d'un fichier JAR. – Perception

+0

Je ne sais pas pourquoi le fichier jar est exécuté à l'extérieur de la corbeille. Le problème que j'ai n'a pas de réponse simple. Je vais déplacer mes fichiers hors du pot et les inclure dans le fichier zip qui est facile et devrait fonctionner. – philippehenri

Répondre

0

Avez-vous besoin de lire et mettre à jour les ressources dans le fichier jar?

Vous pouvez lire le contenu d'un flux d'entrée - utilisez un chemin relatif si la ressource réside dans le même package que le fichier de classe.

InputStream in = this.getClass().getResourceAsStream("/class/path/to/file"); 

Pour écrire, vous aurez probablement besoin de lire dans le contenu du pot existant, modifiez les parties que vous souhaitez ensuite écrire le contenu mis à jour à l'aide JarInputStream et JarOutputStream.

+0

Mes ressources sont des fichiers html que je dois mettre à jour et ouvrir dans le navigateur par défaut. Je n'ai pas besoin de les lire dans l'application mais j'ai besoin de leur chemin pour les ouvrir dans le navigateur. Les fichiers html sont stockés dans les ressources car ils ont besoin de javascripts dans les ressources/scripts – philippehenri

+0

Une URL dans java n'est pas nécessairement une URL qu'un navigateur Web peut comprendre. Vous devrez extraire le fichier jar dans un emplacement temporaire, car le navigateur ne pourra pas afficher les fichiers dans le fichier jar. Jetez un oeil à java.util.jar.JarFile - vous aurez besoin de parcourir la méthode entries() et d'extraire le contenu. – cvanes

0

Vous devez utiliser plusieurs ClassLoader si vous voulez une ressource dans un pot. Ce fragment fonctionne également dans AppServers.

Dans cet exemple, je lis à partir de sqlite-jdbc-3.7.2.jar le fichier situé dans le paquet org.sqlite.

public class Main { 

private static InputStream getResourceAsStream(String resource) throws FileNotFoundException { 
    String stripped = resource.startsWith("/") ? resource.substring(1) : resource; 
    InputStream stream = null; 
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
    if (classLoader != null) { 
     stream = classLoader.getResourceAsStream(stripped); 
    } 
    if (stream == null) { 
     stream = MyClass.class.getResourceAsStream(resource); 
    } 
    if (stream == null) { 
     stream = MyClass.class.getClassLoader().getResourceAsStream(stripped); 
    } 
    if (stream == null) { 
     throw new FileNotFoundException("File not found: " + resource); 
    } 
    return stream; 
} 

public static void main(String[] args) throws FileNotFoundException { 
    // Read file from JAR sqlite-jdbc-3.7.2.jar 
    Scanner sc = new Scanner(getResourceAsStream("org/sqlite/NativeDB.c")); 
    while(sc.hasNextLine()) { 
     System.out.println(sc.nextLine()); 
    } 
} 

}

Pour plus de détails lire Java Classloader

Si vous voulez mettre à jour le contenu, peut Jar Inspector vous aider.

0

Une URL avec le sous-protocole de décompression ! ne peut pas être utilisée dans un navigateur normal. Tout comme ssh: (accès terminal) ou smtp:/mailto: (e-mail). Aussi "file: ..../my.jar! ..." est une telle extension inutilisable des URL normales.

Il existe le JTextPane/JEditorPane avec un support HTML limité. Et quelques projets de navigateur Java.

Peut-être que l'intégration du serveur web java Jetty pourrait être utilisée.

0

Pour ouvrir une ressource à partir du classpath dans le navigateur Web de la plateforme par défaut, vous avez deux options. Extrayez et copiez cette ressource vers un emplacement temporaire sur un système de fichiers et transmettez le fichier: url. Un autre et probablement une meilleure option est d'exécuter un serveur Web intégré (tel que Jetty) et de servir les ressources directement à partir de votre chemin de classe.

2

L'une réponse de la ligne est -...

chemin de corde = this.getClass() getClassLoader() getResource() toExternalForm().

Fondamentalement, la méthode getResource donne l'URL. Depuis cette URL, vous pouvez extraire le chemin en appelant toExternalForm().

Références: https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getResource(java.lang.String)https://docs.oracle.com/javase/7/docs/api/java/net/URL.html#toExternalForm()

+0

Apparaît pour fonctionner dans mon IDE, mais pas à partir d'un fichier jar solo lui-même. – Woodrow

Questions connexes