My images will not load when running a JAR file exported from Eclipse.
I have the images in a resources class package. I've tried a images source folder as well with no luck.
Works perfectly when loaded from Eclipse. The images are in the exported JAR file, so they're exporting fine.
I've tried:
label.setIcon(new ImageIcon(MainFrame.class.getResource("/resources/header.jpg")));
I've also tried:
URL url = getClass().getResource("/resources/header.jpg"); Image image = Toolkit.getDefaultToolkit().getImage(url); label.setIcon(new ImageIcon(image));
And:
try { label.setIcon(new ImageIcon(ImageIO.read(getClass().getResource("/resources/header.jpg")))); } catch (IOException e1) { e1.printStackTrace(); }
Any suggestions?
To export your project, right-click it and select Export. Select Java > Runnable JAR file as the export destination and click Next. On the next page, specify the name and path of the JAR file to create and select the Launch configuration that includes the project name and the name of the test class.
Launch configurations are presumably used because they describe the main class you want to run, and the libraries the main class needs. They are created automatically when you run your main class inside Eclipse.
Works fine for me. Check what you may have different.
Steps:
File Structure
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); } }); } }
[Right click on project] → [Export] → [Runnable Jar File] → [Set up Launch config]
Profit
FYI, the same setup runs in eclipse just fine also
Steps:
File Structure (notice resources looks like a plain folder)
What we have to do now, is put the resources on the build path. What this does is put everything in the folder (excluding the folder itself) on the classpath
Right click on the project and go to [Build Path] → [Configure Build Path]
From the [Sources] tab in the dialog, select [Add Folder] and in the new dialog, select the [resources] folder
Now the contents of the resources folder is in the build path (notice the little package in the folder now
New code no longer uses the resources prefix for the path
URL url = Main.class.getResource("/stackoverflow.png");
Same as Step 3 and 4 from above, and profit!
UPDATE
Generally, once you run the class (i.e. Right click on class and Run as Java Application), a run configuration will be set up. You will need this to set as the launching point in the manifest. But here's how to do it manually.
Steps:
[Right Click Project] → [Properties] → [Run/Debug Settings]
You can see that I already have a run configruation (that is implicitly set from simply running the class). But to create a new one, select [New] → [Java Application]
Create a name for run configuration and browse or type an main launching class. In my case its the com.stackoverflow.test.Main
class
Now when you export as shown in the above example, you select the run configuration
Run the jar like above.
EDIT
Manifest:
Manifest-Version: 1.0 Rsrc-Class-Path: ./ Class-Path: . Rsrc-Main-Class: com.stackoverflow.test.Main Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader
Extracted jar:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With