Placement et utilisation propre de resources Eclipse Java

Et exportation vers un fichier jar

a marqué ce sujet comme résolu.

Bonjour, Je travaille toujours sur mon même projet qui utilise une base de donnée H2. J’ai placé le fichier de cette dernière dans un dossier nommé resources de mon projet dans Eclipse et ajusté mon code pour l’utiliser via getResources(). Ça fonctionne bien lorsque j’éxécute mon projet via Eclipse, mais lorsque j’exporte celui-ci en fichier jar exécutable contenant également les resources, il semble que l’éxécutable du jar ne parvienne pas a trouver le fichier de BDD…

J’aimerais avoir votre avis sur la manière la plus propre et efficace pour intégrer des resources a un projet Eclipse de manière à ce que ce dernier puisse être exporté directement en jar éxécutable…

Et si le code doit être différent suivant qu’il est éxécuté à partir d’Eclipse ou à partir du Jar éxécutable, j’aimerais avoir un moyen d’adapter le code pour ne rien avoir à changer préalablement d’un contexte d’éxécution à l’autre…

Voici à quoi ressemble l’arborescence de mon projet:Image utilisateur

Et voici un aperçu du contenu de mon jar exporté, (dans le dossier resources se trouvent bien les fichier de ma BDD: Image utilisateur

Et voici un extrait de mon code qui réfère à l’utilisation de ce fichier BDD en resources:

1
2
static final String DB_URL = "jdbc:h2:" 
+ MainApp.class.getResource("resources/FCEN2015.h2.db").getPath().replaceAll(".h2.db", "").replaceAll("%20", " ");

Note: Je dois supprimer le .h2.db du path que je passe au driver de jdbc car il ne doit pas avoir l’extension du fichier pour fonctionner. Et je fais remplacer le %20 que met le getPath() à la place de l’espace qui se retrouve dans le "Google Drive" qui se retrouve dans le path, sinon ça plante…

J’ai modifié l’option lors de l’export de mon projet en Jar éxécutable de "Package required libraries into generated JAR" à "Extract required libraries into generated JAR" et ça me permet de générer l’url de ma resource avec getResource() qui me retourne une string donnant ceci: "jar:file:/C:/Users/Nemo/Google Drive/Partage/Mes Logiciels/Nutrion/Nutrion v0.3.jar!/ca/nutritix/nutrion/resources/FCEN2015.h2.db". (Ceci lorsqu’éxécuter du Jar exe).

Avec ceci, je génére une nouveau DB_URL qui fonctionne bien lorsqu’éxécuter d’Eclipse mais qui ne charge toujours pas la BD lorsqu’éxécute du Jar…

En espérant que ça vous aide a m’aider…

Je viens d’ajouter l’affiche des trace des Exceptions générées par mon code faisant usage du JDBC sous forme d’alerte dialog donc, disponible également lorsque qu’éxécuté en dehors d’Eclipse et mon code génére l’exception suivante lors de la tentative de connection au fichier de BDD:

1
org.h2.jdbc.JdbcSQLException: IO Exception: "java.io.IOException: La syntaxe du nom de fichier, de répertoire ou de volume est incorrecte"; "jar:file:/C:/Users/Nemo/Google Drive/Partage/Mes Logiciels/Nutrion/Nutrion v0.3.jar!/ca/nutritix/nutrion/resources/FCEN2015.mv.db" [90031-176]

Notez le .mv dans le nom de fichier FCEN2015.mv.db qui en réalité se nomme plutôt FCEN2015.h2.db, je ne sais pas comment analyser cette particularité…

+0 -0

Hello. J’ai pas trop le temps de détailler (repas de Noël oblige) mais :

  • essaie de suivre la convention dite "Maven" pour organiser tes fichiers
  • tu pourras construire ton URL ficher par rapport au classpath de l’application plutôt que ton système de fichiers local

src/main/java, src/main/resources pour la convention "Maven", je te laisse fouiller et pour le point 2 : cherche "Read file from classpath Java" sur Google ça devrait t’aider !

+0 -0

Bonjour à tous,

Merci Javier pour la recommandation à propos de Maven, je vais me pencher sur la question. Concernant l’accès par le classpath, je croyais que mon code le faisait déjà étant mon usage de la fonction getResource() pour définir le nom et chemin de fichier…

Finalement, j’ai trouvé une solution qui pour le moment fonctionne, je ne sais pas si c’est une bonne solution, j’ai posé la question sur le forum de h2database.

Lorsque je construis ma String DB_URL pour la connection du JDBC, dans la String du path du fichier de BDD qui m’est retourné par getResource(), je fais un replaceAll("file:", "zip:") et j’arrive maintenant à faire fonctionner mon logiciel avec la BD incluse à partir d’un fichier JAR éxécutable…

Ce qui me donne une String de connection DB_URL générée lors de l’éxécution semblable à ceci:

1
DB_URL = "jdbc:h2:zip:/C:/Users/Nemo/Google Drive/Partage/Mes Logiciels/Nutrion/Nutrion v0.3.jar!/ca/nutritix/nutrion/resources/FCEN2015"
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte