web-dev-qa-db-fra.com

Le fichier JAR Runnable exporté par Eclipse ne contenant pas d'images

Mes images ne se chargeront pas lors de l'exécution d'un fichier JAR exporté depuis Eclipse.

J'ai les images dans un package de classe de ressources. J'ai aussi essayé un dossier source d'images sans aucune chance.

Fonctionne parfaitement lorsqu'il est chargé depuis Eclipse. Les images sont dans le fichier JAR exporté, elles sont donc correctement exportées.

J'ai essayé:

label.setIcon(new ImageIcon(MainFrame.class.getResource("/resources/header.jpg")));

J'ai aussi essayé:

URL url = getClass().getResource("/resources/header.jpg");
Image image = Toolkit.getDefaultToolkit().getImage(url);
label.setIcon(new ImageIcon(image));

Et:

try
{
    label.setIcon(new  ImageIcon(ImageIO.read(getClass().getResource("/resources/header.jpg"))));
}
catch (IOException e1)
{
    e1.printStackTrace();
}

Aucune suggestion?

30
DeNitE Appz

Le problème était que j'avais ce projet dans mon profil Windows ... qui avait un "!" dedans ... (DeNitE! -> était le nom de mon profil Windows)

Dès que je l'ai changé pour DeNitE (sans le!), Cela a bien fonctionné ...

1
DeNitE Appz

Fonctionne bien pour moi. Vérifiez ce que vous pouvez avoir différent. 

Exemple 1: (ressources dans src)

Pas:

  1. Structure de fichier

    enter image description here

  2. Code

    package com.stackoverflow.test;
    
    import Java.net.URL;
    import javax.swing.*;  // Wild carded for brevity. 
                           // Actual code imports single classes
    public class Main {
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable(){
                public void run() {
                    URL url = Main.class.getResource(
                                         "/resources/stackoverflow.png");
                    ImageIcon icon = new ImageIcon(url);
                    JFrame frame = new JFrame();
                    frame.add(new JLabel(icon));
                    frame.pack();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    }
    
  3. [Faites un clic droit sur le projet] → [Exporter] → [Fichier Jar exécutable] → [Configurer la configuration de lancement]

    enter image description here

  4. Profit

    enter image description here

Pour votre information, la même configuration fonctionne bien dans Eclipse


Exemple 2: (ressources pas dans src - mais dans le projet)

Pas:

  1. Structure de fichier (les ressources de notification ressemblent à un dossier ordinaire)

    enter image description here

  2. Ce que nous devons faire maintenant, c’est placer les ressources sur le chemin de la construction. Ce que cela fait est de tout mettre dans le dossier (à l'exclusion du dossier lui-même) sur le classpath

    • Faites un clic droit sur le projet et allez à [Chemin de la construction] → [Configurer le chemin de la construction]

      enter image description here

    • Dans l'onglet [Sources] de la boîte de dialogue, sélectionnez [Ajouter un dossier], puis dans la nouvelle boîte de dialogue, sélectionnez le dossier [Ressources].

      enter image description here

    • Maintenant le contenu du dossier de ressources est dans le chemin de construction (remarquez le petit paquet dans le dossier maintenant

      enter image description here

  3. Le nouveau code n'utilise plus le préfixe des ressources pour le chemin

    URL url = Main.class.getResource("/stackoverflow.png");
    
  4. Identique aux étapes 3 et 4 ci-dessus, et profitez-en!


METTRE À JOUR

Configuration de la configuration de lancement

En règle générale, une fois que vous exécutez la classe (cliquez avec le bouton droit de la souris sur Exécuter en tant qu’application Java), une configuration d’exécution est configurée. Vous en aurez besoin pour définir le point de départ du manifeste. Mais voici comment le faire manuellement.

Pas:

  1. [Projet clic droit] → [Propriétés] → [Paramètres d'exécution/de débogage]

    enter image description here Vous pouvez voir que j’ai déjà une configuration d’exécution (implicitement définie par le simple fait d’exécuter la classe). Mais pour en créer un nouveau, sélectionnez [Nouveau] → [Application Java].

  2. Créez un nom pour la configuration d'exécution et parcourez ou tapez une classe de lancement principale. Dans mon cas c'est la classe com.stackoverflow.test.Main

    enter image description here

  3. Maintenant, lorsque vous exportez comme indiqué dans l'exemple ci-dessus, vous sélectionnez la configuration d'exécution.

    enter image description here

  4. Exécutez le pot comme ci-dessus.


MODIFIER

Résultat à rechercher

Manifeste:

Manifest-Version: 1.0
Rsrc-Class-Path: ./
Class-Path: .
Rsrc-Main-Class: com.stackoverflow.test.Main
Main-Class: org.Eclipse.jdt.internal.jarinjarloader.JarRsrcLoader

Pot extrait:

enter image description here

72
Paul Samsotha

J'ai trouvé ça quand tu as changé: 

Intégrer les bibliothèques requises dans le fichier jar généré

à

Extraire les bibliothèques requises dans le fichier jar généré

dans la configuration Lancement lancement cela a fonctionné pour moi.

 Extract Required Libraries Button

2
sazzy4o

Un autre moyen de contourner le problème est que si vous placez votre fichier de ressources, un fichier .jar au même emplacement, cela devrait fonctionner. Le seul inconvénient est que vous devez disposer des ressources avec le fichier jar à tout moment.

Si ce n'est pas un problème, vous pouvez le faire de cette façon.

1
Nevets17

J'ai le même problème ... vous pouvez l'utiliser ...

Image Icon= new ImageIcon(new WE4().getClass().getResource("IC.jpg"))

Ici, WE4 est le nom de mon constructeur de classe . J'espère que cela vous aidera.

1
Md. Sakib Hossain

Pour créer un fichier JAR exécutable à partir d’Eclipse, reportez-vous à l’article "Création de fichiers jar exécutables dans Eclipse (ou autre IDE ... ou à la main):" ( https://www.cefns.nau.edu/~edo /Classes/CS477_WWW/Docs/RunnableJarsinEclipse.html ), il est mentionné que nous devons faire quatre choses comme

  1. Assurez-vous de créer un package pour notre code et pas seulement de créer un projet dans Eclipse.
  2. Créez le sous-dossier (sous-dossier) pour nos fichiers de ressources sous le package principal de notre code (notez que le sous-package est sous le package principal, non seulement dans le projet)
  3. obtenir toutes les références de fichier à partir de getResource () (obtenir la référence de l'URL)
  4. Exportation de fichiers sous forme de fichiers JAR exécutables dans Eclipse (Fichier -> Exporter ... -> sélectionner Fichiers JAR exécutables -> suivant -> ...)

Mais pour un fichier image dans l'exemple de code de l'article ci-dessus, il ne crée que l'ImageIcon, il ne crée pas l'image SWT. Internet pose de nombreuses questions sur la façon d'obtenir une image SWT à partir d'une URL ou sur la conversion d'ImageIcon en image SWT. Voici l'exemple de code permettant d'obtenir l'image SWT à partir d'une URL,

Image imgSWT=null;  // Image class is the SWT Image class
ImageDescriptor imgDesc=null;
Java.net.URL imgURL = YourClassName.class.getResource("path/image_filename");

if (imgURL != null) {
    imgDesc = ImageDescriptor.createFromURL(imgURL);
    imgSWT = imgDesc.createImage();
}
1
phchen2

Deux étapes simples:

1 - Ajouter le dossier au chemin de construction;

2 - Utilisez ceci:

    InputStream url = this.getClass().getResourceAsStream("/load04.gif");
    myImageView.setImage(new Image(url));
0
Michel Fernandes