Accéder à des fichiers depuis un .jar exécutable [Résolu]

profiter 211 Messages postés mercredi 15 juin 2011Date d'inscription 15 mars 2013 Dernière intervention - 17 sept. 2011 à 03:13 - Dernière réponse : cs_GodConan 2116 Messages postés samedi 8 novembre 2003Date d'inscriptionContributeurStatut 6 octobre 2012 Dernière intervention
- 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
Afficher la suite 

Votre réponse

10 réponses

Meilleure réponse
cs_Julien39 6450 Messages postés mardi 8 mars 2005Date d'inscription 17 mai 2018 Dernière intervention - 17 sept. 2011 à 10:19
3
Merci
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");

Merci cs_Julien39 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 74 internautes ce mois-ci

Commenter la réponse de cs_Julien39
Meilleure réponse
cs_Julien39 6450 Messages postés mardi 8 mars 2005Date d'inscription 17 mai 2018 Dernière intervention - 19 sept. 2011 à 08:56
3
Merci
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.

Merci cs_Julien39 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 74 internautes ce mois-ci

Commenter la réponse de cs_Julien39
profiter 211 Messages postés mercredi 15 juin 2011Date d'inscription 15 mars 2013 Dernière intervention - 17 sept. 2011 à 10:37
0
Merci
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
Commenter la réponse de profiter
Fauchmanne 39 Messages postés vendredi 27 février 2009Date d'inscription 26 septembre 2011 Dernière intervention - 17 sept. 2011 à 11:10
0
Merci
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
Commenter la réponse de Fauchmanne
profiter 211 Messages postés mercredi 15 juin 2011Date d'inscription 15 mars 2013 Dernière intervention - 17 sept. 2011 à 11:35
0
Merci
merci
et tu peux me donner une solution pour l'erreur
Commenter la réponse de profiter
profiter 211 Messages postés mercredi 15 juin 2011Date d'inscription 15 mars 2013 Dernière intervention - 19 sept. 2011 à 16:07
0
Merci
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
Commenter la réponse de profiter
cs_Julien39 6450 Messages postés mardi 8 mars 2005Date d'inscription 17 mai 2018 Dernière intervention - 21 sept. 2011 à 10:44
0
Merci
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
Commenter la réponse de cs_Julien39
Fauchmanne 39 Messages postés vendredi 27 février 2009Date d'inscription 26 septembre 2011 Dernière intervention - 21 sept. 2011 à 12:20
0
Merci
"tes classes ne sont pas organisées en fonctionalités métier"

+1
Il n'y a qu'une classe, en fait ...
Commenter la réponse de Fauchmanne
cs_Julien39 6450 Messages postés mardi 8 mars 2005Date d'inscription 17 mai 2018 Dernière intervention - 21 sept. 2011 à 12:38
0
Merci
Oui, c'est bien ca le problème
Commenter la réponse de cs_Julien39
cs_GodConan 2116 Messages postés samedi 8 novembre 2003Date d'inscriptionContributeurStatut 6 octobre 2012 Dernière intervention - 21 sept. 2011 à 22:12
0
Merci
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)
Commenter la réponse de cs_GodConan

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.