Exécutable .jar
sheila
-
sandul Messages postés 4013 Statut Membre -
sandul Messages postés 4013 Statut Membre -
Bonjour,
Je voudrais faire un exécutable .jar en mettant dans le même .jar toutes les classes extérieures et le fichier .properties. Voici le contenu de mon fichier manifest.mf:
Manifest-Version: 1.0
Class-Path: classes12.jar
Created-By: 1.5.0_09 (Sun Microsystems Inc.)
Main-Class: com.pia.west.tools.grilledetauxIHM.InterfaceGrilleDetaux
ça ne marche pas, je n'arrive pas à me connecter à ma base de données. De plus, dois-je rajouter le path du fichier .properties?
Merci
Je voudrais faire un exécutable .jar en mettant dans le même .jar toutes les classes extérieures et le fichier .properties. Voici le contenu de mon fichier manifest.mf:
Manifest-Version: 1.0
Class-Path: classes12.jar
Created-By: 1.5.0_09 (Sun Microsystems Inc.)
Main-Class: com.pia.west.tools.grilledetauxIHM.InterfaceGrilleDetaux
ça ne marche pas, je n'arrive pas à me connecter à ma base de données. De plus, dois-je rajouter le path du fichier .properties?
Merci
A voir également:
- Exécutable .jar
- Télécharger jeux java jar - Télécharger - Jeux vidéo
- Antimalware service executable ram - Forum Antivirus
- Ouvrir fichier jar - Forum Windows
- Désactiver Antimalware Service Executable ✓ - Forum Windows 10
- Jar decompiler - Télécharger - Langages
4 réponses
Salut,
Il faut également mettre ton classpath dans le fichier manifest; pour un exemple, tu peux regarder ici: http://www.commentcamarche.net/forum/affich 6764261 java probleme de jar, post n° 4
A +
Il faut également mettre ton classpath dans le fichier manifest; pour un exemple, tu peux regarder ici: http://www.commentcamarche.net/forum/affich 6764261 java probleme de jar, post n° 4
A +
Oui, tu peux très bien inclure le fichier .properties dans le jar. A ce moment-là, tu peux avoir accès depuis ton code JAva avec quelque chose du genre
File configFile = new File("props/config.xml"); //$NON-NLS-1$
FileInputStream fis = new FileInputStream(configFile);
...
en supposant que le fichier config.xml réside dans un sous répertoire props à la racine du jar.
et j'ai été obligée de créer un sous fichier lib dans lequel je mets ma classe externe <== là je n'ai pas trop compris ce que tu veux faire... Quelle est exactement ta classe externe et quels sont les fichiers annexe dont tu parles? En ce qui concerne le jar, tu peux y inclure tout ton travail (fichiers class, fichiers de configuration comme le .properties, fichiers ressources comme les images...) et avoir dans le classpath du manifest les jars nécessaires (celui avec les drivers de la base de donnée, par exemple).
++
File configFile = new File("props/config.xml"); //$NON-NLS-1$
FileInputStream fis = new FileInputStream(configFile);
...
en supposant que le fichier config.xml réside dans un sous répertoire props à la racine du jar.
et j'ai été obligée de créer un sous fichier lib dans lequel je mets ma classe externe <== là je n'ai pas trop compris ce que tu veux faire... Quelle est exactement ta classe externe et quels sont les fichiers annexe dont tu parles? En ce qui concerne le jar, tu peux y inclure tout ton travail (fichiers class, fichiers de configuration comme le .properties, fichiers ressources comme les images...) et avoir dans le classpath du manifest les jars nécessaires (celui avec les drivers de la base de donnée, par exemple).
++
j'utilise classe12.jar. Avant même de ne pouvoir se connecter à ma base de données, mon jar ne vois toujours pas mon fichier de configuration (connexion.properties). Depuis éclipse, ça marche. Mais dans le jar, non. j'ai bien vérifier le chemin d'accès au fichier; c'est bien à partir le dossier de lancement de l'application. mais rien.
Utilises-tu un manager de connexion (genre DataSource)? Ben, un bout de code peut certainement aider, copie-colle ici la partie connexion à la base (y compris la partie accès à ton fichier properties). Copie-colle également la stack trace de l'erreur obtenue.
Et entoure ton code copié ici par des balises "code" pour la mise en page...
A+
Et entoure ton code copié ici par des balises "code" pour la mise en page...
A+
voici le code qui me permet de lire le fichier properties:
je n'ai pas de message d'erreur à partir d'eclipse
protected String getConfig(String fichier, String key) throws Exception
{
//On construit l'adresse du fichier
// File leFichier = new File(System.getProperty("user.dir") + "/" + fichier);
String leFichier = System.getProperty("user.dir") + "/" +fichier;
File fic = new File(leFichier);
System.out.println(fic.getAbsolutePath()+"fffffffffffffffffffffffffff");
// On fait pointer notre Properties sur ce fichier
FileInputStream fIs = new FileInputStream(leFichier);
Properties config = new Properties();
config.load(fIs);
String tmp = config.getProperty(key);
fIs.close();
leFichier = null;
fIs = null;
config = null;
if (tmp == null)
{
System.out.println("ne veut pas marcher!!!!!!!!");
throw new Exception("La valeur correspondant à '" + key + "' n'existe pas dans le fichier '" + fichier+"'");
}
return tmp;
}
je n'ai pas de message d'erreur à partir d'eclipse
Mé euh, cette paresse... :)
J'avais demandé également:
- le code de connexion à la BD (utilises-tu des valeurs dans le fichier properties?)
- le rapport d'erreur (j'avais bien lu que sous Eclipse il n'y a pas d'erreur, voyons^^ Tu l'exécutes en dehors d'Eclipse et copies-colles le rapport ==> pour ce faire, dans le try..catch tu mets un e.printStackTrace())
A+
J'avais demandé également:
- le code de connexion à la BD (utilises-tu des valeurs dans le fichier properties?)
- le rapport d'erreur (j'avais bien lu que sous Eclipse il n'y a pas d'erreur, voyons^^ Tu l'exécutes en dehors d'Eclipse et copies-colles le rapport ==> pour ce faire, dans le try..catch tu mets un e.printStackTrace())
A+
voici le contenu de mon fichier de connexion
Pour le stacktrace, je ne sais pas comment te le récupérer, vu q je l'exécute comme n'importe quelle autre application depuis mon bureau. à moins que j'ai rien compri...
merci encore pour ton aide
#Dernière mise a jour : #Tue Jun 10 16:23:15 CEST 2008 suffixe=OWN ip=192.15.35.8 sid=pir
Pour le stacktrace, je ne sais pas comment te le récupérer, vu q je l'exécute comme n'importe quelle autre application depuis mon bureau. à moins que j'ai rien compri...
merci encore pour ton aide
Sheila:
1. Le code de connexion fait référence au code Java qui permet l'ouverture de la connexion à la base de données. Exemple pour une base de données Oracle, écrit à la va-vite:
Comme tu vois, il y a un certain nombre de paramètres (dans "jdbc:oracle:thin:user/password@myDBServer:1521/disp2") qui peuvent très bien faire l'objet d'une externalisation dans un fichier properties.
Je souhaiterais voir ce code de connexion.
2. Tu as un jar, disons myJar.jar avec un manifest bien renseigné (la class main, le classpath...) ==> tu peux l'exécuter en double-cliquant. La JVM va démarrer un processus appelé javaw sui l'exécutera, mais tu ne verras pas la sortie console. Pour voir la sortie, en supposant que myJar se situe dans c:\test, tu fais dans une console DOS:
==> tu auras accès à la console.
Oki? :)
1. Le code de connexion fait référence au code Java qui permet l'ouverture de la connexion à la base de données. Exemple pour une base de données Oracle, écrit à la va-vite:
package tests;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.Types;
import oracle.jdbc.pool.OracleDataSource;
public class OracleSPExec {
/**
* @param args
*/
public static void main(String[] args) {
try {
OracleDataSource ods = new OracleDataSource();
ods.setURL("jdbc:oracle:thin:user/password@myDBServer:1521/disp2"); //$NON-NLS-1$
Connection conn = ods.getConnection();
String jobquery = "begin tst(?); end;"; //$NON-NLS-1$
CallableStatement callStmt = conn.prepareCall(jobquery);
int a = 0;
callStmt.setNull(1, Types.INTEGER);
callStmt.execute();
conn.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
// nettoyage des ressources
}
}
}
Comme tu vois, il y a un certain nombre de paramètres (dans "jdbc:oracle:thin:user/password@myDBServer:1521/disp2") qui peuvent très bien faire l'objet d'une externalisation dans un fichier properties.
Je souhaiterais voir ce code de connexion.
2. Tu as un jar, disons myJar.jar avec un manifest bien renseigné (la class main, le classpath...) ==> tu peux l'exécuter en double-cliquant. La JVM va démarrer un processus appelé javaw sui l'exécutera, mais tu ne verras pas la sortie console. Pour voir la sortie, en supposant que myJar se situe dans c:\test, tu fais dans une console DOS:
cd c:\test java -jar myJar.jar
==> tu auras accès à la console.
Oki? :)
oki!
code de connexion:
et pour la stacktrace,
je viens aussi de constater que même si j'arrive à mettre tout ce dont j'ai besoin dans mon jar, avant de l'exécuter, je devrais d'abord extraire ce dont j'ai besoin. ce n'est que comme ça que mon jar arrive à fonctionner. Das le stacktrace, on dit que la connexion n'est pas possible et q'on ne trouve pas le fichier properties. si tu arrive à trouver une autre méthode,....
code de connexion:
public class Bd {
/**
* Constructeur
* @throws Exception
*/
public Bd(String a_base) throws Exception {
initConnection(a_base);
}
/** La connextion partagée par toute les requetes */
protected Connection conn = null;
/** Paramètres de configuration de la connexion aux bases de données */
protected Configuration conf = new Configuration(); //renvoie les paramètres lus dans le fichier de propriétes
protected static String ip = null;
protected static String suffixe = null;
protected static String sid = null;
String base = null;
String url = null;
String user = null;
String pw = null;
protected void initConnection(String a_base) throws Exception {
try {
Class.forName ("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
if(ip == null && suffixe == null && sid == null)
{
ip = conf.getConfig("connexion.properties","ip");
sid = conf.getConfig("connexion.properties", "sid");
suffixe = conf.getConfig("connexion.properties","suffixe");
}
base = a_base;
url = "jdbc:oracle:thin:@" + ip + ":1521" + ":" + sid;
user = "sheil" + base + suffixe;
pw = "pw";
try {
conn = DriverManager.getConnection(url, user, pw);
} catch (SQLException e1) {
// TODO Auto-generated catch block
// e1.printStackTrace();
JOptionPane.showMessageDialog(Connexion.panneau, "La connexion à la base de données a échouée", "Connexion BdD", JOptionPane.ERROR_MESSAGE);
ip = conf.getConfig("connexion.properties","ip");
Connexion.ip.setText(ip);
sid = conf.getConfig("connexion.properties","sid");
Connexion.sid.setText(sid);
suffixe = conf.getConfig("connexion.properties","suffixe");
Connexion.suffixe.setText(suffixe);
}
}
et pour la stacktrace,
java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:164)
at com.pia.west.tools.grilledetauxIHM.Bd.initConnection(Bd.java:50)
at com.pia.west.tools.grilledetauxIHM.Bd.<init>(Bd.java:25)
at com.pia.west.tools.grilledetauxIHM.InterfaceGrilleDetaux.DerniereModi
f(InterfaceGrilleDetaux.java:791)
at com.pia.west.tools.grilledetauxIHM.InterfaceGrilleDetaux.<init>(Inter
faceGrilleDetaux.java:117)
at com.pia.west.tools.grilledetauxIHM.InterfaceGrilleDetaux.main(Interfa
ceGrilleDetaux.java:1418)
E:\Documents and Settings\sheil\Bureau\connexion.propertiesffffffffffffff
fffffffffffff
Exception in thread "main" java.io.FileNotFoundException: connexion.propert
ies (Le chemin d'accÞs spÚcifiÚ est introuvable)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:106)
at com.pia.west.tools.grilledetauxIHM.Configuration.getConfig(Configurat
ion.java:38)
at com.pia.west.tools.grilledetauxIHM.Bd.initConnection(Bd.java:57)
at com.pia.west.tools.grilledetauxIHM.Bd.<init>(Bd.java:25)
at com.pia.west.tools.grilledetauxIHM.InterfaceGrilleDetaux.DerniereModi
f(InterfaceGrilleDetaux.java:791)
at com.pia.west.tools.grilledetauxIHM.InterfaceGrilleDetaux.<init>(Inter
faceGrilleDetaux.java:117)
at com.pia.west.tools.grilledetauxIHM.InterfaceGrilleDetaux.main(Interfa
ceGrilleDetaux.java:1418)
je viens aussi de constater que même si j'arrive à mettre tout ce dont j'ai besoin dans mon jar, avant de l'exécuter, je devrais d'abord extraire ce dont j'ai besoin. ce n'est que comme ça que mon jar arrive à fonctionner. Das le stacktrace, on dit que la connexion n'est pas possible et q'on ne trouve pas le fichier properties. si tu arrive à trouver une autre méthode,....
Bon, OK.
Il y a 2 erreurs dans ton stack trace. La première, ClassNotFound est exclusivement liée à cette ligne:
==> solution: renseigne correctement ton classpath dans le jar en pointant vers classes12.jar (avec le bon chemin, s'il n'est pas déployé dans le même répertoire que le fichier jar contenant le manifest dont on parle)
- Par ailleurs, pourquoi utiliser classes12 et ne pas utiliser les nouveaux drivers bien plus performants (disponibles sur le site d'Oracle)?
- De mémoire, encore, classes12 venait était dispo sous un format zip, l'astuce était de le renommer en .jar, sinon même s'il figurait dans le classpath (avec l'extension zip), il n'était pas pris en compte. Mais je vois qu'il est en .jar dans ton classpath du manifest ==> vérifier que sur le disque il est également en .jar et pas .zip.
- Vérifier également qu'il est au même endroit que ton jar avec le manifest (sinon modifie le classpath dans le manifest).
- Finalement, modifie la partie classpath de ton jar de la manière suivante:
avant
après
La 2ème erreur concerne la localisation du fichier .properties. Je te conseille les étapes suivantes:
- sous Eclipse, crée un folder (pas un package), disons props
- déplace le fichier .properties dans le répertoire props
- modifie ton code de lecture du fichier comme je te l'ai montré au post n° 3
- teste si c'est OK sous Eclipse
- lorsque tu construis ton jar, n'oublie pas de rajouter le répertoire props
- teste si c'est OK en dehors d'Eclipse
Une fois que ça marche, si ton code a pour destin autre chose qu'être du jetable pour l'apprentissage, pense à:
- le nettoyer (finally pour les ressources, pas de code dupliqué, élimination des commentaires et des System.out inutiles etc)
- changer de drivers (plus de classes12!)
- éventuellement: utiliser un DataSource, gérer des pools de connexion etc.
++ (tu me dois 3 bières :-p)
Il y a 2 erreurs dans ton stack trace. La première, ClassNotFound est exclusivement liée à cette ligne:
Class.forName ("oracle.jdbc.driver.OracleDriver");
==> solution: renseigne correctement ton classpath dans le jar en pointant vers classes12.jar (avec le bon chemin, s'il n'est pas déployé dans le même répertoire que le fichier jar contenant le manifest dont on parle)
- Par ailleurs, pourquoi utiliser classes12 et ne pas utiliser les nouveaux drivers bien plus performants (disponibles sur le site d'Oracle)?
- De mémoire, encore, classes12 venait était dispo sous un format zip, l'astuce était de le renommer en .jar, sinon même s'il figurait dans le classpath (avec l'extension zip), il n'était pas pris en compte. Mais je vois qu'il est en .jar dans ton classpath du manifest ==> vérifier que sur le disque il est également en .jar et pas .zip.
- Vérifier également qu'il est au même endroit que ton jar avec le manifest (sinon modifie le classpath dans le manifest).
- Finalement, modifie la partie classpath de ton jar de la manière suivante:
avant
Class-Path: classes12.jar
après
Class-Path: . classes12.jar
La 2ème erreur concerne la localisation du fichier .properties. Je te conseille les étapes suivantes:
- sous Eclipse, crée un folder (pas un package), disons props
- déplace le fichier .properties dans le répertoire props
- modifie ton code de lecture du fichier comme je te l'ai montré au post n° 3
- teste si c'est OK sous Eclipse
- lorsque tu construis ton jar, n'oublie pas de rajouter le répertoire props
- teste si c'est OK en dehors d'Eclipse
Une fois que ça marche, si ton code a pour destin autre chose qu'être du jetable pour l'apprentissage, pense à:
- le nettoyer (finally pour les ressources, pas de code dupliqué, élimination des commentaires et des System.out inutiles etc)
- changer de drivers (plus de classes12!)
- éventuellement: utiliser un DataSource, gérer des pools de connexion etc.
++ (tu me dois 3 bières :-p)
Encore, merci bcp pour ta disponibilité. (tu as mérité 3 bières + 1)
j'ai créé ce repertoire de propriétés ds lequel j'ai mis mon fichier properties. une fois de plus, tout marche sous éclipse. en exportant le tout, je fais bien attention de rien oublier (j'y joins tout ce dont j'ai besoin, y compris le répertoire lib dans lequel se trouvent mes biblio .jar parmi lesquelles classe12.jar). à l'exécution, comme tu as vu sur l'affichage du System.out...... il cherche ce fichier de connexion à partir du répertoire de travail (d'où j'ai lancé l'appication). pour résoudre tout ceci, après avoir exporté mon jar, je fais une extraction de ce dont j'ai besoin vers le répertoire de travail et tout marche nickel. Je pense que l'application va chercher tous les fichiers dont elle a besoin dans le répertoire de lancement. c'est tout à fait ce que je voulais, mais, bon....
merci encore.
à+!
j'ai créé ce repertoire de propriétés ds lequel j'ai mis mon fichier properties. une fois de plus, tout marche sous éclipse. en exportant le tout, je fais bien attention de rien oublier (j'y joins tout ce dont j'ai besoin, y compris le répertoire lib dans lequel se trouvent mes biblio .jar parmi lesquelles classe12.jar). à l'exécution, comme tu as vu sur l'affichage du System.out...... il cherche ce fichier de connexion à partir du répertoire de travail (d'où j'ai lancé l'appication). pour résoudre tout ceci, après avoir exporté mon jar, je fais une extraction de ce dont j'ai besoin vers le répertoire de travail et tout marche nickel. Je pense que l'application va chercher tous les fichiers dont elle a besoin dans le répertoire de lancement. c'est tout à fait ce que je voulais, mais, bon....
merci encore.
à+!
Mais bien sûr, il ne faut pas inclure classes12.jar dans ton jar (jamais des jars dans des jars, en fait). Essaie donc d'y inclure uniquement
- tes .class à toi
- les .properties
- les images
Les bibliothèques (comme classes12.jar) sont à déployer en même temps que ton jar, mais pas à son intérieur.
Ciao
- tes .class à toi
- les .properties
- les images
Les bibliothèques (comme classes12.jar) sont à déployer en même temps que ton jar, mais pas à son intérieur.
Ciao
Ma question est de savoir s'il est possible de mettre dans jar le fichier de propriétés et les classes externes?
Merci