Home > other >  relative path to folder won't work when jpackaged java
relative path to folder won't work when jpackaged java

Time:08-11

so my project is here: https://github.com/Potat-OS1/project_thingo and i started the project from a template.

under the champPortrait section is where i'm having my problem. when i run it in the IDE the path works, as i understand it its the relative path of the build folder. does it not use this path when its packaged? what path should i be using?

i can getResourceAsStream the contents of the folder but in this particular case i need the folder its self so i can put all the names of files inside of the folder into a list.

CodePudding user response:

When the application is bundled with jpackage, all classes and resources are packaged in a jar file. So what you are trying to do is read all the entries in a particular package from a jar file. There is no nice way to do that.

Since the contents of the jar file can't be changed after deployment, the easiest solution is probably just to create a text resource listing the files. You just have to make sure the you update the text file at development time if you change the contents of that resource.

So, e.g., if in your source hierarchy you have

resources
    |
    |--- images
            |
            |--- img1.png
            |--- img2.png
            |--- img3.png

I would just create a text file resources/images/imageList.txt with the content

img1.png
img2.png
img3.png

Then in code you can do:

List<Image> images = new ArrayList<>();
String imageBase = "/images/"
try (BufferedReader br = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/images/imageList.txt"))) {
    br.lines().forEach(imageName -> {
        URL imageUrl = getClass().getResource(imageBse   imageName);
        Image image = new Image(imageURL.toExternalForm());
        images.add(image);
    }
} catch (Exception exc) {
    exc.printStackTrace();
}

As mentioned, you will need to keep the text file in sync with the contents of the resource folder before building. If you're feeling ambitious, you could look into automating this as part of your build with your build tool (gradle/Maven etc.).

  • Related