IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Accéder à un fichier de ressource dans un jar exécutable


Sujet :

Entrée/Sortie Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 68
    Points : 42
    Points
    42
    Par défaut Accéder à un fichier de ressource dans un jar exécutable
    Bonjour,

    je souhaite accéder à des fichiers de ressources dans mon application d'abord dans eclipse puis à partir du jar executable

    dans eclipse, avec le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    		URL url_base = TestURL.class.getResource("/listecours.xsl");
    		System.out.println("url_base  ->" + url_base.getPath());
    		File file_base = new File (url_base.getPath());
    		System.out.println("chemin de file base" + file_base.getAbsolutePath());
    		if (!(file_base.exists()))
    			throw new Exception("pas bon");
    j'obtiens

    pour forcer la recherche dans le jar, avec le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    		URL url = new URL("jar:file:/D:/Users/Gilbert/java/AtelierMyosotis/AtelierMyosotis.jar!/listecours.xsl");
    		System.out.println("url 0 ->" + url.getPath());
    			URI uri = url.toURI();
    			System.out.println("uri path ->" + uri.getPath());
    			System.out.println("uri sheme ->" + uri.getSchemeSpecificPart());
    			String s = uri.getSchemeSpecificPart();
    			String protocol = url.getProtocol();
    			File f = new File(uri.getSchemeSpecificPart());
    			System.out.println("chemin de f ->" + f.getAbsolutePath());
    			if (!(f.exists()))
    				throw new Exception("pas bon");
    		} catch (URISyntaxException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
     
    	}
    j'obtiens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    url 0 ->file:/D:/Users/Gilbert/java/AtelierMyosotis/AtelierMyosotis.jar!/listecours.xsl
    uri path ->null
    uri sheme ->file:/D:/Users/Gilbert/java/AtelierMyosotis/AtelierMyosotis.jar!/listecours.xsl
    chemin de f ->D:\Users\Gilbert\java\workspace\AtelierMyosotis\AtelierMyosotisApplication\file:\D:\Users\Gilbert\java\AtelierMyosotis\AtelierMyosotis.jar!\listecours.xsl
    java.lang.Exception: pas bon
    	at org.atelier.myosotis.application.TestURL.main(TestURL.java:36)
    je ne vois pas ou est l'erreur : serait-ce un bug comme je crois l'avoir lu sur internet

    pour l'instant je contourne le problème en référençant les fichiers ressources dans le répertoire du projet dans Eclipse avec une variable d’environnement

    existe il une autre solution que de changer de jdk


    Merci pour vos réponses Cordialement,

    Gilbert Pêche
    os : windows 10
    jdk : 1.6
    eclipse : Helios

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    URL url_base = TestURL.class.getResource("/listecours.xsl"); jusque là ça va. Tout le reste, tu peux oublier. Déjà, dans un jar, il n'y a pas de fichier. Ensuite, la méthode getResource() te permet d'obtenir une URL de ta resource : utilise-la directement pour la charger. L'URL sera différente lors de l'exécution sous Eclipse ou externe, mais elle pointera bien sur la même resource.

    Pour ce qui est du test d'existence, pas besoin : si la resource n'existe pas, l'URL sera null. Pour charger la resource, utiliser URL.openStream() qui te donnera un InputStream. Que tu pourras utilisr ensuite via un Reader si c'est un fichier texte, via ImageIO (ou ImageIcon) si c'est une image, etc. D'ailleurs tu peux directement obtenir le stream : TestURL.class.getResourceAsStream( path ).
    Ensuite, il est juste important que :
    • la resource soit dans le classpath. En général, on la met dans le dossier source (dans un sous-dossier pour faire propre) ;
    • l'identfiant de la resource (le paramètre qu'on passe à getResource()) doit être relatif, soit à la classe elle-même, soit à la racine.


    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    package fr.developpez.exemple;
     
    import java.awt.GridLayout;
    import java.awt.image.BufferedImage;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.io.StringWriter;
     
    import javax.imageio.ImageIO;
    import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.JTextPane;
     
    public class Exemple {
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame("Démo");
     
    		JPanel panel = new JPanel(new GridLayout(2,0));
     
    		// cas 1 : référence à un dossier de ressources (note le / au début du path)
    		panel.add(new JLabel( new ImageIcon(Exemple.class.getResource("/images/suricate.png"))));
     
    		// cas 2 : référence à un une resource où se trouve la classe
    		panel.add(new JLabel( new ImageIcon(Exemple.class.getResource("suricate.png"))));
     
    		// cas 3 : utilisation d'un stream
    		try(InputStream stream = Exemple.class.getResourceAsStream("suricate.png")) {
     
    			BufferedImage image = ImageIO.read(stream);
    			panel.add(new JLabel( new ImageIcon(image)));
     
    		} catch (IOException | IllegalArgumentException e) {
    			StringWriter writer = new StringWriter();
    			e.printStackTrace(new PrintWriter(writer));
    			JTextPane pane = new JTextPane();
    			pane.setText(writer.toString());
    			pane.setEditable(false);
    			panel.add(new JScrollPane(pane));
    		}
     
    		// cas 4 : lecture d'un fichier text
    		try(BufferedReader reader = new BufferedReader(new InputStreamReader(Exemple.class.getResourceAsStream("suricate.txt")))) {
     
    			JTextArea text = new JTextArea();
    			text.setLineWrap(true);
    			text.setEditable(false);
     
    			for(String line = reader.readLine(); line!=null; line=reader.readLine()) {
    				if ( text.getDocument().getLength()!=0 ) {
    					text.append("\n");
    				}
    				text.append(line);
    			}
     
    			panel.add(new JScrollPane(text));
     
    		} catch (IOException | NullPointerException e) {
    			StringWriter writer = new StringWriter();
    			e.printStackTrace(new PrintWriter(writer));
    			JTextPane pane = new JTextPane();
    			pane.setText(writer.toString());
    			pane.setEditable(false);
    			panel.add(new JScrollPane(pane));
    		}		
     
    		frame.getContentPane().add(panel);
    		frame.pack();
    		frame.setLocationRelativeTo(null);
     
    		frame.setVisible(true);
     
     
     
    	}
     
    }
    Nom : Capture.PNG
Affichages : 2365
Taille : 7,3 Ko
    Dans le zip attaché, il y a le dossier src (avec les images) et le jar exécutable.
    Fichiers attachés Fichiers attachés
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 68
    Points : 42
    Points
    42
    Par défaut
    Bonsoir,

    Merci pour votre réponse .

    pour charger la feuille xsl désirée, j'utilise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    public void transforme(String fichier, String fichierXSL) {
    StreamSource stylesource = new StreamSource(ClassLoader.class.getResourceAsStream(fichierXSL));
    et cela fonctionne

    Encore merci,
    et cordialement
    G. Pêche

    P. S. je ne trouve pas pour marquer réslu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 29/08/2014, 15h04
  2. fichier de properties dans un jar
    Par davman_63 dans le forum Langage
    Réponses: 2
    Dernier message: 23/05/2007, 16h42
  3. ressource dans le jar de mon appli
    Par laclac dans le forum Langage
    Réponses: 4
    Dernier message: 18/04/2007, 16h36
  4. Réponses: 6
    Dernier message: 06/03/2007, 17h57
  5. [IO et JAR] Fichier d'entrée dans le JAR ?
    Par L. Sierra dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 25/09/2006, 17h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo