Précédent   Forum des professionnels en informatique > Java > Général Java
Général Java Java SE, Java ME, APIs, Persistance, JDBC, Spring, XML. Avant de poster -> FAQ Java, Sources Java
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/02/2012, 10h32   #1
Nouveau Membre du Club
 
Inscription : octobre 2005
Messages : 113
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 113
Points : 28
Points : 28
Par défaut CSVReader dans un jar

Bonjour à tous,

Pour lire un fichier csv, j'utilise la librairie opencsv 2.3. Tout fonctionne très bien quand j'exécute mon code dans Eclipse. Je souhaite maintenant créer un jar exécutable, et là mes ennuis commencent.

J'ai déjà eu un problème avec les images sur des JButton que j'ai résolu de la façon suivante :
Code :
1
2
3
4
5
// Ancienne version (ne fonctionne pas dans le jar)
this.setIcon(new ImageIcon("img/truc.png"));
 
// Nouvelle version (fonctionne dans le jar)
this.setIcon(new ImageIcon(ClassLoader.getSystemResource("img/truc.png")))
Maintenant je souhaiterais que la ligne suivante (qui marche très bien dans Eclipse), puisse être exécutée dans le jar :
Code :
reader = new CSVReader(new FileReader("data/truc.csv"));
En regardant sur internet j'ai testé, sans succès, les deux solutions suivantes :
Code :
1
2
3
4
5
6
7
8
// Methode 1 - La même que celle utilisée pour les images
reader = new CSVReader(new FileReader(ClassLoader.getSystemResource("data/truc.csv").getFile()));
 
// Methode 2 - Utiliser un BufferedReader
InputStream is = getClass().getResourceAsStream("data/truc.csv");
InputStreamReader isr = new InputStreamReader(is);
BufferedReader buf = new BufferedReader(isr);
reader = new CSVReader(buf);
Dans le premier cas, cela fonctionne dans Eclipse mais pas en exécutant le .jar (NullPointerException).
Dans le deuxième cas, même dans Eclipse j'ai un NullPointerException (à la création de "isr").

Auriez-vous une petite idée pour me sortir de là ? Où est-ce que je me suis planté ?

Merci d'avance !

EDIT : Dans la méthode utilisant le BufferedReader, si je remplace "data/truc.csv" par "../data/truc.csv", cela fonctionne dans Eclipse mais pas dans le .jar
SAKDOSS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 10h52   #2
Nouveau Membre du Club
 
Inscription : octobre 2005
Messages : 113
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 113
Points : 28
Points : 28
J'ai trouvé un contournement plutôt moche. Je met le fichier truc.csv dans le même package que la classe qui l'utilise. Ainsi la méthode utilisant le BufferedReader fonctionne si je met comme chemin "truc.csv".

Je ne pense pas que cela soit très propre mais en attendant ça fonctionne.
Si quelqu'un a une meilleure idée, je suis toujours très intéressé !
SAKDOSS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 11h04   #3
Modérateur
 
Homme Mathieu
Ingénieur développement logiciels
Inscription : avril 2004
Messages : 850
Détails du profil
Informations personnelles :
Nom : Homme Mathieu
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : avril 2004
Messages : 850
Points : 1 155
Points : 1 155
Si ta resource est dans le package "data" ce code est censé fonctionner :

Code :
1
2
3
4
5
// Methode 2 - Utiliser un BufferedReader
InputStream is = getClass().getResourceAsStream("data/truc.csv");
InputStreamReader isr = new InputStreamReader(is);
BufferedReader buf = new BufferedReader(isr);
reader = new CSVReader(buf);

Peux tu faire une arborescence de ton jar ?
Normalement tu devrais avoir
Code :
1
2
3
4
5
6
7
8
9
10
 
+ un
|   |
|   - package
|           |
|           - UneClasse.class
|
+ data
    |
    - truc.csv
Le chemin que tu passes à getResourceAsStream(...), si tu n'indique pas qu'il est relatif (avec .. par exemple) est le chemin absolu dans le classpath de ton application.
Mathieu.J est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 11h42   #4
Nouveau Membre du Club
 
Inscription : octobre 2005
Messages : 113
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 113
Points : 28
Points : 28
Ca donne ça :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
- projet
       |
       - src
           |
           - model
           |    |
           |    - classeUtilisantLeCSV.class
           |
           - data
                |
                - truc.csv
SAKDOSS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 11h50   #5
Expert Confirmé Sénior
 
Inscription : septembre 2004
Messages : 5 099
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 5 099
Points : 7 026
Points : 7 026
Dans ce cas ce devrait être "/data/truc.csv" avec un / devant.
Sinon il va aller chercher /model/data/truc.csv et ce n'est pas là qu'il se trouve.
thelvin est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h38.


 
 
 
 
Partenaires

Hébergement Web