Partage
  • Partager sur Facebook
  • Partager sur Twitter

Créer un jar éxecutable avec un dossier ressources

Sujet résolu
15 décembre 2016 à 21:06:20

Bonjour,

J'ai terminé mon projet JAVA et je souhaiterais créer un jar exécutable qui inclus un dossier ressources.

Je travail avec Eclipse et voici un copie d'écran de l'arborescence :

Le soucis c'est que le projet tourne très bien quand je le lance depuis eclipse mais plante (fichier introuvable) si je tente de le lancer directement depuis la ligne de commande. Même chose pour créer un jar que ce soit en ligne de commande ou directement en export depuis eclipse.

Etant donné que j'accède à mes fichiers de la même manière dans tout le projet, je suppose que la même solution va s'appliquer partout.

Et voici un bout de code où j'accède à un fichier :

    /**
     * Retourne le chemin vers l'icône de la catégorie donnée.
     *
     * @param categorie
     *            la catégorie
     * @return le chemin absolu de l'icône de la catégorie donnée
     */
public String getIconFullPath(String categorie) {
        return "ressources" + File.separator + "pictogrammes" + File.separator + categorie + ".png";
}

Si ça à une incidence, je signal que le projet est censé s'exécuter sous le windows et linux et que j'accède à des fichiers depuis des méthodes statiques.

Voila pour mon problème, quelqu'un à une (ou plusieurs) solution à me proposer ?

Cordialement,

Hardman2541

-
Edité par hardman2541 15 décembre 2016 à 21:07:34

  • Partager sur Facebook
  • Partager sur Twitter
15 décembre 2016 à 21:13:55

Bonjour.

Sujet évoqué plusieurs fois par semaine sur le forum.

Pour information, la concaténation de chemin pour les répertoires se fait avec Paths.get() ou Path::resolve().
Ou si tu utilises les fonctionnalités vieilles de 10 ans (Java<=6) tu as le constructeur de File.

  • Partager sur Facebook
  • Partager sur Twitter
Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
15 décembre 2016 à 22:29:37

Bonjour,

merci pour l'info, c'est deja plus lisible avec Paths.get() cependant mon  problème reste le même et je n'ai pas trouvé de solution qui soit valable dans mon cas.

De plus, je suis peut être juste aveugle, mais la fonction rechercher se fait sur TOUT le forum ce qui fait qu'il y a pas mal d'autres langages et faire le tri c'est pas trop mon trip :D . J'ai lu dans d'autres forum que l'on pouvais utilisé la fonction getClass().getClassLoader().getResource() mais toujours le même résultat. Je dois surement mal m'y prendre et aussi, vu que je dois lire un fichier dans une classe statique, getClass() n'existe pas du coup je ne sais pas si passer un ClassLoader en paramètre ne cause pas de soucis.

En tout cas chez moi (comme je l'ai utilisé) ça ne fonctionne pas.

Pour prouver que j'essaye de trouver une solution voici un autre bout de code que je vient de modifier pour utiliser getResource()

 /**
     * Retourne la liste des valeurs de propriete (sans doublons) lues dans les fichiers files.
     * 
     * @param files
     *            les noms des fichiers à lire
     * @param propriete
     *            la propriété recherchée
     * @return La liste des valeurs de la propriété trouvées dans les fichiers.
     */
    public static String[] readPropriete(String[] files, String propriete, ClassLoader classLoader) {
        TreeSet<String> list = new TreeSet<>();
        for (String file : files) {
            try {
                InputStreamReader isr = new InputStreamReader(classLoader.getResourceAsStream(file));
                BufferedReader br = new BufferedReader(isr);

 Je précise que j'ai déplacé mon dossier "ressources" qui se trouve maintenant dans src/projet, eclipse me l'affiche donc comme si c'était un package (projet.ressources).

Cela dit comme avant sous eclipse tout va bien mais le jar exécutable exporté me renvois toujours un NullPointerException à l'instanciation de l'InputStreamReader. J'ai essayé avec getResourceAsStream("/"+file) et getResourceAsStream("ressources/"+file) ou encore getResourceAsStream("/ressources/"+file) bref pas moyen que ça marche. Mieux encore si j'essaye avec ce que je vient de dire, même sous eclipse ça ne marche plus.

Une autre piste ?

Cordialement,

Hardman2541

-
Edité par hardman2541 16 décembre 2016 à 15:41:36

  • Partager sur Facebook
  • Partager sur Twitter
17 décembre 2016 à 12:57:39

Bonjour,

Si c'est dans "src/projet" :
=> getResourceAsStream("/projet/ressources/"+file)

"eclipse me l'affiche donc comme si c'était un package (projet.ressources)."<===

bonne continuation.

  • Partager sur Facebook
  • Partager sur Twitter
17 décembre 2016 à 18:52:58

Bonjour,

en m'inspirant de ta réponse j'ai réussi à faire fonctionner le projet, en fait il y avait 2 problèmes :

Le premier c'était de trouver où était les ressources, j'ai déplacer mon dossier directement à la racine du dossier src d'eclipse (à côté du dossier projet donc) et les ressources ont été trouvées par le jar éxecutable.

Le second problème c'est (pour ne pas être insulant) la connerie de mes profs qui ont jugés bon de foutre des accents partout et donc ça oblige à ajouter cette une option à l'éxecution (et donc oblige d'être en ligne de commande...au revoir double clic)

Donc pour info à ceux que ça intéresse (ou ceux qui ont ce problème), dans le code j'accède à mes ressources à l'aide de getClass().getClassLoader().getResource("ressources/" + nomDuFichier).

Pour créer le jar : clic-droit sur le projet, export, runnable jar file. Et on peut cocher la case save an ant script qui permet ensuite de lancer un script qui construit direct le .jar sans passez par d'autre menus.

Pour lancer le jar : java -Dfile.encoding=UTF-8 -jar App.jar

C'est dommage qu'il y ai un soucis avec System.setProperty("file.encoding", "UTF-8"), si quelqu'un à une solution que je puisse "coder" je suis preneur (sauf la solution d'enlever tout les accents, qui est tentante mais pas acceptée).

Bref merci pour votre aide.

Cordialement,

Hardman2541

-
Edité par hardman2541 17 décembre 2016 à 18:53:13

  • Partager sur Facebook
  • Partager sur Twitter
22 février 2023 à 13:24:24 - Message modéré pour le motif suivant : Message complètement hors sujet


22 février 2023 à 15:10:07

Bonjour,

Le message qui suit est une réponse automatique activée par un membre de l'équipe de modération. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose, ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention.
Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé.

Pour plus d'informations, nous vous invitons à lire les règles générales du forum

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter

Pas d'aide concernant le code par MP, le forum est là pour ça :)