2017-09-24 4 views
0

Je tente d'exporter un programme qui a trait aux images. Quand j'exporte ce projet, il me donne une exception IllegalArgumentException où l'entrée est null. Je l'ai regardé partout pour la réponse, mais chacun ne semble pas fonctionner avec mon code:java - Impossible d'exporter une image dans un fichier JAR exécutable

package dev.ttt; 

import java.awt.image.BufferedImage; 
import java.io.IOException; 

import javax.imageio.ImageIO; 

public class Assets { 

    public static BufferedImage x, o; 

     public static void init() { //Loads the X and O images 

      System.out.println("Loading Assets..."); 

      x = loadImage("/images/x.png"); 

      o = loadImage("/images/o.png"); 

      System.out.println("Assets loaded."); 

     } 

     public static void sayLoad(String path) { //Prints the image path to the console 
      System.out.println("Loading " + path); 
     } 

    public static BufferedImage loadImage(String path) { 
     try { 
      sayLoad(path); //Prints the image path to the console 
      return ImageIO.read(Assets.class.getResourceAsStream(path)); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
} 

Toute idée comment résoudre ce problème? Cela fonctionne bien dans Eclipse, mais pas dans un pot.

EDIT:

La sortie de java jar "myjar.jar":

Initializing window... 
Size: 330 330 
Initializing Canvas... 
Initialization complete. 
Starting Thread... 
Thread Started. 
Initializing Game... 
Loading Assets... 
Loading /images/x.png 
Exception in thread "Thread-2" java.lang.IllegalArgumentException: input == null! 
    at javax.imageio.ImageIO.read(Unknown Source) 
    at dev.ttt.Assets.loadImage(Assets.java:31) 
    at dev.ttt.Assets.init(Assets.java:16) 
    at dev.ttt.GameLoop.gameInit(GameLoop.java:81) 
    at dev.ttt.GameLoop.run(GameLoop.java:129) 
    at java.lang.Thread.run(Unknown Source) 

EDIT 2:

55 Sun Sep 24 17:47:30 EDT 2017 META-INF/MANIFEST.MF 
1308 Sat Sep 23 20:18:30 EDT 2017 dev/ttt/WinDetection.class 
3719 Sat Sep 23 20:18:30 EDT 2017 dev/ttt/GameLoop.class 
2347 Sun Sep 24 17:47:14 EDT 2017 dev/ttt/Game.class 
1451 Sun Sep 24 17:47:14 EDT 2017 dev/ttt/Assets.class 
503 Sat Sep 23 20:18:30 EDT 2017 dev/ttt/Launcher.class 
2874 Sat Sep 23 20:18:30 EDT 2017 dev/ttt/ai/AI.class 
456 Sat Sep 23 20:18:30 EDT 2017 dev/ttt/player/Player.class 
2875 Sat Sep 23 20:18:30 EDT 2017 dev/ttt/player/MouseInput.class 
1010 Sun Sep 24 12:09:46 EDT 2017 images/O.png 
1034 Sun Sep 24 12:09:46 EDT 2017 images/X.png 
310 Thu Sep 21 12:22:30 EDT 2017 .checkstyle 
385 Thu Sep 21 12:26:28 EDT 2017 .project 
343 Sat Sep 23 21:03:18 EDT 2017 .classpath 
+1

S'il vous plaît lister la sortie de "jar tvf your.jar" –

+0

@OP re édition: ThorbjørnRavnAndersen n'a pas demandé de stacktrace (bien que cela peut aussi être utile donc ne l'enlevez pas), mais sur la structure du fichier JAR qui peut être obtenu via la commande 'jar tvf your.jar' (plus d'infos sur https://docs.oracle.com/javase/tutorial/deployment/jar/view.html). – Pshemo

Répondre

0

Votre fichier jar doit avoir les entrées "/images/x.png" et "/images/o.png" pour que cela fonctionne (elles sont donc sur le chemin de la classe). Ce n'est pas pour une raison quelconque.

En général, la première chose à rechercher dans cette situation est si le monde est réellement comme vous le pensez. Regarder à l'intérieur du pot avec jar tvf my.jar peut révéler beaucoup!

+0

Cela fait sence mais ... je ne sais pas comment exécuter cela, je l'ai mis dans mon invite cmd et il a dit: «jar» n'est pas reconnu comme une commande interne ou externe, fichier exécutable ou par lots. –

+0

Je viens de comprendre, a dû mettre à jour ma variable de chemin! –

+0

Enfin compris ... erreur la plus idiote de ma part .. j'ai oublié de capitaliser mes chemins de fichier, en utilisant le jar tvf my.jar m'a aidé à voir ça. Thak vous pour l'aide! –

-1

On dirait que votre application ne peut pas trouver des images que vous spécifier dans le chemin relatif. Essayez de placer vos images dans le dossier images près de votre fichier jar.

+0

Bien que votre solution fonctionne pour le code affiché, ce n'est pas ce que l'OP a demandé. L'une des principales raisons de créer des fichiers JAR est de les laisser envelopper toutes les choses nécessaires à l'application (comme les images/icônes). Les mettre en dehors de JAR est un pas en arrière de la solution préférée. – Pshemo