Accéder à des fichiers depuis un .jar exécutable

Résolu
profiter Messages postés 205 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 15 mars 2013 - 17 sept. 2011 à 03:13
cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 - 21 sept. 2011 à 22:12
bonjour,

j'ai fait le jar de mon application
dans mon application j'ai besoin de lire des fichiers .jasper (j'utilise jasperreport )
l'execution dans eclipse est parfaite
le probleme c'est que lorsque j'execute le jar dans le repertoire du projet ca marche il lit les fichiers
mais lorsque je l'execute ailleurs (je l'ai copié dans le bureau ou je l'execute dans la ligne de commande) il me genere l'ereur
java.io fileNotFoundException

voila comment je lis le fichier :

<code java>try {

File file = new File("de_irepport");
fis = new FileInputStream(new File(file, "jasperreports/devis.jasper"));
JasperPrint jasperPrint = JasperFillManager.fillReport(fis, mesParametres,
getConnection());

// export de l'état dans un fichier pdf
//JasperExportManager.exportReportToPdfFile(jasperPrint,
//		"C:\\Test1SubReport.pdf");

// Affichage du rapport dans l'objet JasperViewer
 JasperViewer.viewReport(jasperPrint, false);
//JasperViewer.viewReport(jasperPrint);
} catch (Exception ef) {
System.out.println(" fichier introuvable");
ef.printStackTrace();
}

</code>
sachant que le fichier est dans le repertoire source de_irepport/jasperreports/devis.jasper

si vous pouvez me donner une solution

merci

10 réponses

cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
17 sept. 2011 à 10:19
Bonjour,

Le problème vient du fait que ton application utilises le chemin : jasperreports/devis.jasper pour lire les fichiers, cette écriture fait référence au dossier dans lequel se trouve ton application.

Pour t'en sortir, tu peux utiliser les chemins absolus : C:\program files\nomApplication\... ou l'équivalent sous linux. Et ensuite, tu créés un installateur (des logiciels existent InstallAnyWhere par exemple) qui te copie les fichiers au bon endroit.

Ou alors, si tu n'as pas besoin de modifier le fichier que tu lis, tu le place dans un dossier source "ressources" et tu respectes l'arborescence en packages et tu pourras alors appeler getClass().getResource("devis.jasper");
3
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
19 sept. 2011 à 08:56
Pour la question de quelle méthode est la plus pro : la réponse est aucune des deux. Il ne faut pas se demander ce qui "fait pro" mais ce qui est le plus adapté à tes besoins. Dans le cas présent, si tu cherches juste à insérer des images, la méthode 2, plus simple plus efficace est certainement plus adaptée, c'est donc celle qui dans ton cas est la plus pro.

Pour ton erreur, tu ne montres pas le début de ta méthode mais je suis prêt à parier que cette méthode est static ? Quand tu fais getClass() : c'est une méthode incompatible avec une méthode statique puisqu'une méthode statique ne dépend d'aucune classe.

Pour t'en sortir enlèves le mot clé static. Créé éventuellement un singleton avec ta classe. Si tu ne vois pas quoi faire donne moi la totalité du code de cette classe et je te guiderai.
3
profiter Messages postés 205 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 15 mars 2013 8
17 sept. 2011 à 10:37
merci pour les deux solutions efficasses
la premiere c'est la premiere fois que j'ai connu qu'il ya instalateur en java j' ai cru que le point jar fait l'affaire

et elle est a mon avis plus pro que la 2
mais faute de temps je ferai la 2

mon probleme c'est ou estce que je fais getClass().getResource("devis.jasper");

j'ai ecris comme ca mais il ya l'erreur :

try {
//double a =  0;
//Double f = a.divide(2, BigDecimal.ROUND_DOWN) ;
//File file = new File("de_irepport");
fis = new FileInputStream(new File(file, getClass().getResource("devis.jasper"));
System.out.println("suis   suis");
JasperPrint jasperPrint = JasperFillManager.fillReport(fis, mesParametres,
getConnection());

// export de l'état dans un fichier pdf
//JasperExportManager.exportReportToPdfFile(jasperPrint,
//		"C:\\Test1SubReport.pdf");

// Affichage du rapport dans l'objet JasperViewer
 JasperViewer.viewReport(jasperPrint, false);
//JasperViewer.viewReport(jasperPrint);
} catch (Exception ef) {
System.out.println(" suis je fichier introuvable");
ef.printStackTrace();
}

mais il me genere l'erreur
cannot make a static reference to the non static methode getclass from the type object

merci bien
0
Fauchmanne Messages postés 35 Date d'inscription vendredi 27 février 2009 Statut Membre Dernière intervention 26 septembre 2011 1
17 sept. 2011 à 11:10
La 2 est "plus pro" que la 1 ... Parce que dans la 1 tu dois tenir compte de l'environnement local, alors que la 2 est utilisable dans plein de cas de figure, par exemple dans une applet, ou dans un webstart etc etc
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
profiter Messages postés 205 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 15 mars 2013 8
17 sept. 2011 à 11:35
merci
et tu peux me donner une solution pour l'erreur
0
profiter Messages postés 205 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 15 mars 2013 8
19 sept. 2011 à 16:07
bonjour,
merci bien pour votre soutien

voici ma classe :
package com.kha.devis;



import java.awt.Frame;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.HashMap;

import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane;



import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.view.JasperViewer;

public class rapport_devis {

private int id_f , n_commande_f ;
private static HashMap<String, Object> mesParametres;

public rapport_devis(int id, int n) {
this.setId_f(id) ;
this.setN_commande_f(n) ;
mesParametres = new HashMap<String, Object>();
System.out.println("id : "+id +" et n : "+n);
mesParametres.put("id_f", new Integer(""+n));
mesParametres.put("n_commande_f", new Long(""+id));
}

public static void afficher() throws JRException, IOException {
FileInputStream fis = null;
try {
//double a =  0;
//Double f = a.divide(2, BigDecimal.ROUND_DOWN) ;

File file = new File("de_irepport");
fis = new FileInputStream(new File(file, "com/kha/devis/devis.jasper"));
System.out.println("suis   suis");
JasperPrint jasperPrint = JasperFillManager.fillReport(fis, mesParametres,
getConnection());

// export de l'état dans un fichier pdf
//JasperExportManager.exportReportToPdfFile(jasperPrint,
//		"C:\\Test1SubReport.pdf");

// Affichage du rapport dans l'objet JasperViewer
 JasperViewer.viewReport(jasperPrint, false);
//JasperViewer.viewReport(jasperPrint);
} catch (Exception ef) {
System.out.println(" suis je fichier introuvable");
ef.printStackTrace();
}finally {
if (getConnection() != null) {
try {
getConnection().close();
} catch (SQLException ex) {
}
}

//fis.close();
}
}

private static Connection getConnection() {
Connection conn = null;



String dbDriver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/NOUVEAU";
String username= "root";
String password = "monpass";
try{		
Class.forName( dbDriver);
conn = DriverManager.getConnection(url,username, password);
}catch(Exception e){
JOptionPane.showMessageDialog(null, "erreur de connexion à la base de données!","Warning", JOptionPane.WARNING_MESSAGE);
//System.out.println("connexion erreur : "+e);
return null ;
}
return conn;
}

public int getN_commande_f() {
return n_commande_f;
}

public void setN_commande_f(int n_commande_f) {
this.n_commande_f = n_commande_f;
}

public int getId_f() {
return id_f;
}

public void setId_f(int id_f) {
this.id_f = id_f;
}

}


j'ai bien respecter l'arborescente des packages (le meme probleme pour les images est reglé par
private List images = new ArrayList();

public void Lanceur(){
try {
images.add(ImageIO.read(getClass().getResource("facture.png")));  // 0 
images.add(ImageIO.read(getClass().getResource("devis.png")));   // 1

} 
catch (IOException e) {
e.printStackTrace();
}
}

)
comme elle est ci dessus ca marche bien dans eclipse et dans le jar quand je l'execute dans le repertoire de l'appli
et si je l'execute de la ligne de commande ou je lui fais copier coller vers un autre endroit et je l'execute non ca marche pas et si dans la ligne de commande alors c'est le java.io.fileNotfound qui se leve
pour regler je dois remplacé :

File file = new File("de_irepport");
fis = new FileInputStream(new File(file, "com/kha/devis/devis.jasper"));


par qlq comme celle des images
j'ai essayé de mettre les getClass.getRessources mais les erreurs comme
the constructor File(File, URL) is undefined ou l'autre cité dans le premier message .........

merci
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
21 sept. 2011 à 10:44
Je suis désolé de te le dire mais c'est plutot sale comme code.

Tu ne respectes pas les normes de codage en java (cherches sur le site du zero par exmple, il y a un bon tuto)

Et surtout, ce n'est pas de la POO. Tu utilises trop souvent le mot clé "static" et tes classes ne sont pas organisées en fonctionalités métier.

Pour utiliser getClass().getRessource(), il faut que tes ressources soient dans le même package que la classe qui l'appelle, même si le dossier sources et différent
0
Fauchmanne Messages postés 35 Date d'inscription vendredi 27 février 2009 Statut Membre Dernière intervention 26 septembre 2011 1
21 sept. 2011 à 12:20
"tes classes ne sont pas organisées en fonctionalités métier"

+1
Il n'y a qu'une classe, en fait ...
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
21 sept. 2011 à 12:38
Oui, c'est bien ca le problème
0
cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 12
21 sept. 2011 à 22:12
yo ;o)

Brrrr quelle horreur... ;o)
rare de concentrer autant d entorses aux conventions de codage java ;o) ...
(le mieux est de reprendre le basic...) ;o)
Sinon ;o) à la premiere réponse de Julien39, tu peux ajouter aussi l utilisation des chemins relatifs plutot que les absolus... ;o) et l utilisation, dans les 2 cas, d un jar n est pas obligatoire...


GodConan ;o)
0
Rejoignez-nous