简体   繁体   中英

program runs fine in Eclipse but not when exported to .jar file

I have a small GUI that include some JSliders and what have you. I could export it as a .jar and it would run without any problems. I then decided to add some images and I put them in a subfolder within my package in eclipse. Now when I export the file and try and run it I get the following errors (when run in terminal)

Henry-MAC:desktop 2010imac01$ java -jar trust.jar
Exception in thread "main" java.lang.IllegalArgumentException: input == null!
    at javax.imageio.ImageIO.read(ImageIO.java:1362)
    at trust.GUI.<init>(GUI.java:75)
    at trust.main.main(main.java:11)

After a lot of googling I think it is something to do with a .jar not being included in my manifest (that eclipse generates). How do I see/add the necessary class-paths in the manifest.

This is the part where I open images (what I think is the error)

try {
        n  = ImageIO.read((this.getClass().getResource("smiles/n.png")));
        s5 = ImageIO.read((this.getClass().getResource("smiles/5.png")));
        s4 = ImageIO.read((this.getClass().getResource("smiles/4.png")));
        s3 = ImageIO.read((this.getClass().getResource("smiles/3.png")));
        s2 = ImageIO.read((this.getClass().getResource("smiles/2.png")));
        f5 = ImageIO.read((this.getClass().getResource("smiles/-5.png")));
        f4 = ImageIO.read((this.getClass().getResource("smiles/-4.png")));
        f3 = ImageIO.read((this.getClass().getResource("smiles/-3.png")));
        f2 = ImageIO.read((this.getClass().getResource("smiles/-2.png")));

        smile = new Easel(n);
    } catch (IOException e) {
        System.out.println("error");
    }

When the images are packaged in a JAR, the classloader can find your image if you are using something like this:

 this.getClass().getResource("/resources/icon.png")

                 OR

 this.getClass().getResourceAsStream("/resources/icon.png")

That is in your case, the code should be as shown below:

try {
        n  = ImageIO.read((this.getClass().getResource("/smiles/n.png")));
        s5 = ImageIO.read((this.getClass().getResource("/smiles/5.png")));
        s4 = ImageIO.read((this.getClass().getResource("/smiles/4.png")));
        s3 = ImageIO.read((this.getClass().getResource("/smiles/3.png")));
        s2 = ImageIO.read((this.getClass().getResource("/smiles/2.png")));
        f5 = ImageIO.read((this.getClass().getResource("/smiles/-5.png")));
        f4 = ImageIO.read((this.getClass().getResource("/smiles/-4.png")));
        f3 = ImageIO.read((this.getClass().getResource("/smiles/-3.png")));
        f2 = ImageIO.read((this.getClass().getResource("/smiles/-2.png")));

        smile = new Easel(n);

} catch (IOException e) {
       System.out.println("error");
}

OR

try {
        n  = ImageIO.read((this.getClass().getResourceAsStream("/smiles/n.png")));
        s5 = ImageIO.read((this.getClass().getResourceAsStream("/smiles/5.png")));
        s4 = ImageIO.read((this.getClass().getResourceAsStream("/smiles/4.png")));
        s3 = ImageIO.read((this.getClass().getResourceAsStream("/smiles/3.png")));
        s2 = ImageIO.read((this.getClass().getResourceAsStream("/smiles/2.png")));
        f5 = ImageIO.read((this.getClass().getResourceAsStream("/smiles/-5.png")));
        f4 = ImageIO.read((this.getClass().getResourceAsStream("/smiles/-4.png")));
        f3 = ImageIO.read((this.getClass().getResourceAsStream("/smiles/-3.png")));
        f2 = ImageIO.read((this.getClass().getResourceAsStream("/smiles/-2.png")));

        smile = new Easel(n);

} catch (IOException e) {
       System.out.println("error");
}

Hope this serves your purpose...

Thank you!

Try this:

BufferedImage n  = ImageIO.read(new File("./smiles/n.png"));

I assume that the image n.png is inside the smiles folder under your project folder.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM