2017-09-24 11 views
0

Ich versuche, ein Programm zu exportieren, das mit Bildern zu tun hat. Wenn ich das Projekt exportiere, gibt es mir eine IllegalArgumentException, bei der die Eingabe null ist. Ich habe alle für die Antwort sah über, aber jeder scheint nicht mit meinem Code zu arbeiten:java - Kann ein Bild nicht in eine ausführbare JAR-Datei exportieren

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; 
    } 
} 

Jede Idee, wie dieses Problem zu lösen? Es funktioniert gut in Eclipse, aber nicht in einem Glas.

EDIT:

Die Ausgabe von 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

Bitte geben Sie die Ausgabe von "jar tvf your.jar" –

+0

@OP red bearbeiten: ThorbjørnRavnAndersen nicht für Stacktrace (obwohl dies auch nützlich sein kann, so entfernen Sie es nicht), aber über JAR-Dateistruktur, die kann erhalten Sie über 'jar tvf your.jar' Befehl (mehr Infos unter https://docs.oracle.com/javase/tutorial/deployment/jar/view.html). – Pshemo

Antwort

0

Ihre JAR-Datei muss die Einträge "/images/x.png" und "/images/o.png" haben, damit dies funktioniert (sie befinden sich also im Klassenpfad). Aus irgendeinem Grund nicht.

Im Allgemeinen ist das erste Ding in dieser Situation zu suchen, wenn die Welt wirklich ist, wie Sie denken, dass es ist. Ein Blick in das Glas mit jar tvf my.jar kann viel verraten!

+0

Das macht Sinn, aber ich habe keine Ahnung, wie man das ausführt, ich legte es in meine Eingabeaufforderung cmd und es hieß: 'jar' wird nicht als interner oder externer Befehl erkannt, ausführbare Programm oder Batch-Datei. –

+0

Habe es gerade herausgefunden, musste meine Pfadvariable aktualisieren! –

+0

Endlich herausgefunden ... der dümmste Fehler meinerseits .. ich vergaß, meine Dateipfade groß zu schreiben, indem ich das jar tvf nutzte. My.jar half mir das zu sehen. Danke für die Hilfe! –

-1

Sieht aus wie Ihre Anwendung keine Bilder finden Sie die Im relativen Pfad angeben. Versuchen Sie, Ihre Bilder in den Ordner Bilder in der Nähe Ihrer JAR-Datei zu platzieren.

+0

Während Ihre Lösung für den gebuchten Code funktioniert, ist OP nicht gefragt. Einer der Hauptgründe für die Erstellung von JARs besteht darin, dass alle von der Anwendung benötigten Dinge (wie Bilder/Symbole) eingebunden werden. Wenn Sie sie außerhalb von JAR platzieren, gehen Sie von der bevorzugten Lösung zurück. – Pshemo

Verwandte Themen