Including Images with an executable jar
Files in a Jar are not files in the sense of a file on disk. They are simply a (possibly) compressed stream of bytes.
Java makes it easy to extract these "resources" from Jar files through the use of the ClassLoader
background = ImageIO.read(getClass().getResource("/wood.jpeg"));
Should work...
This will return a URL
which ImageIO
can use to load the resource.
You could also have a read of
- Classpath resource within jar
- Jar get image as resource
- Load a resource in Jar
And I could list some more. So, yeah, it gets asked a lot ;)
Including image Icons in executable jar file
Most likely you pass an incorrect resource name, and since the class loader can't find it, getResource()
will return null
.
Class.getResource(String name)
expects a resource name relative to the location the class is loaded from. So if your resource is called image.jpg
, then image.jpg
must be in the same folder where the class is whose getResource()
method you're calling.
You can also specify an absolute folder inside the jar if you start it with the /
character:
getClass().getResource("/resources/images/image.jpg");
In this case the image.jpg
must be in the /resources/images
folder inside the jar or in your source folder (which will be copied to the bin
folder by your IDE).
You can also navigate up one (or more) folder compared to the folder of the class with the ".."
literal, e.g.:
getClass().getResource("../images/image.jpg");
In this case the image.jpg
file must be in the images
subfolder of the parent folder compared to the folder of the class.
Note: The Class
object whose getResource()
method you call can be acquired like YourClassName.class
or if you want to refer to the class of the current instance: getClass()
.
Where do I store images so that an executable jar file can access them?
Put them in the jar, and then use Class.getResource
, Class.getResourceAsStream
, ClassLoader.getResource
or ClassLoader.getResourceAsStream
to access them. Which is most appropriate depends on what else you're doing, but you might want something like:
Image image = new Image(Program.class.getResource("/images/foo.jpg"));
... where Program.class
is any class within the same jar file. Or if you're storing your images in the same folder as your classes (by the time you're deployed) you could just use:
Image image = new Image(GameCharacter.class.getResource("knight.jpg"));
That's a relative resource name. (Relative to the class in question.)
How to bundle images in jar file
It seems like there are two questions here:
How do I get NetBeans to include an image file in the jar produced when I build my project?
How do I access an image file from a jar?
This answer applies to NetBeans 6.8 and addresses both of the subquestions.
Assume that you have an ant based Java Application Project.
Here is the 'Files' view of the project
JP
+ images
+ test.jpg
+ nbproject
+ src
+ jp
+ Main.java
+ test
+ build.xml
+ manifest.mf
Inside your Main.java you have code like this:
public static void main(String[] args) throws IOException {
// find the file in the file system.. probably not a good idea
File f = new File("images/test.jpg");
System.out.println(f.getCanonicalPath()+" "+f.exists());
When you run this project from inside NB you get this output:
/export/home/vkraemer/NetBeansProjects/JavaApplication2/images/test.jpg true
When you run the code packed into the jar, you get something like this:
bash-3.2$ pwd
/export/home/vkraemer/nbhg/web-main
bash-3.2$ java -jar /export/home/vkraemer/NetBeansProjects/JavaApplication2/dist/JavaApplication2.jar
/export/home/vkraemer/nbhg/web-main/images/test.txt false
To get something better when the jar is executed, you need to do the following:
Add the images directory as a source root for you project.
Right click on the project and select the Properties item. A dialog will appear.
Select 'Sources' in the list that is on the left side of the dialog. This will change the content of the panel on the right side of the dialog.
Press the 'Add Folder...' button that appears next to the 'Source Package Folders' table. A FileChooser will appear.
Use this chooser to select the images folder and press the OK button. An entry for the images folder will be added table.
Use the OK button on the Project Properties dialog to accept the changes and dismiss the dialog.
Change your code to use Class.getResource().
public static void main(String[] args) throws IOException {
// find the file in the file system.. probably not a good idea
File f = new File("images/test.jpg");
System.out.println(f.getCanonicalPath()+" "+f.exists());
URL url = Main.class.getResource("/test.jpg");
System.out.println(url);
When you run the project from inside the IDE, you should see something like this:
/export/home/vkraemer/NetBeansProjects/JavaApplication2/images/test.jpg true
file:/export/home/vkraemer/NetBeansProjects/JavaApplication2/images/test.jpg
When you run the code packed into the jar, you will get something like this:
bash-3.2$ pwd
/export/home/vkraemer/nbhg/web-main
bash-3.2$ java -jar /export/home/vkraemer/NetBeansProjects/JavaApplication2/dist/JavaApplication2.jar
/export/home/vkraemer/nbhg/web-main/images/test.jpg false
jar:file:/export/home/vkraemer/NetBeansProjects/JavaApplication2/dist/JavaApplication2.jar!/test.jpg
After you get the URL for the test.jpg file, you can use ImageIcon(URL) to create the icon
Related Topics
Servlet Seems to Handle Multiple Concurrent Browser Requests Synchronously
How to Read Input Character-By-Character in Java
Singleton Design Pattern: Pitfalls
Simple Way to Count Character Occurrences in a String
How to Use Java to Read from a File That Is Actively Being Written To
Sorting a List with Stream.Sorted() in Java
Tomcat 8 Is Not Able to Handle Get Request with '|' in Query Parameters
Java8: Ambiguity with Lambdas and Overloaded Methods
Jdbc Connection to Mssql Server in Windows Authentication Mode
How to Demonstrate Java Multithreading Visibility Problems
How to Set Icon in a Column of Jtable
Using Scala Traits with Implemented Methods in Java
Adding an Http Header to the Request in a Servlet Filter
How to Configure Tomcat to Connect with MySQL
Java Swing; Two Classes, Where to Put If Statements and New Actionlisteners