Load files External To The Distribution Jar

2019-07-30 00:44发布

I have written a Java program which I package and run from a JAR file. I need to have some user-changeable configuration files which are simply text lines of:

key = value

format. To load these files I used the class described here. When I run my program through Netbeans IDE all works fine as I have included the directory where I store the configuration files in the Project properties.

The problem comes when I build my application into a JAR file. As I want the configuration files to be user-editable I keep them OUTSIDE of the JAR but in the same directory but now when I run my application from the command line it cannot find the configuration files. If I manually add the files to JAR file at the ROOT folder then all is well.

So how can I tell Java to look outside of the JAR for my loadable files? The -classpath option has no effect.

3条回答
We Are One
2楼-- · 2019-07-30 00:50

That's because the way you are loading them requires that they be inside the .jar when running from a jar, or inside the project directory if not; it's relying on the classloader to tell it where to find the file.

If you want to open a file outside the .jar, you need to just open it as a File and read it in.

One of the ways we've approached this is to take the external filename as an option on the command line (e.g. java -jar myJar.jar -f filename). This allows you to explicitly state where the file is located. You can then decide whether or not to also look in a default location, or inside the .jar if the file isn't specified on the command line.

查看更多
forever°为你锁心
3楼-- · 2019-07-30 00:59

I had the same problem and saw your post, but the answer in the end, was simple.

I have an application deployed via Java Webstart and am building it in Netbeans 7.3.

I have a properties file config.xml that will be updated during run time with user preferences, for instance, "remember my password". Hence it needs to be external to the jar file.

Netbeans creates a 'dist' folder under the project folder. This folder contains the project jar file and jnlp file. I copied over the config.xml to the dist folder and the properties file was loaded using standard

    FileInputStream in = new FileInputStream("config.xml");
    testData.loadFromXML(in);
    in.close();
查看更多
唯我独甜
4楼-- · 2019-07-30 01:13

I resolved it by referring to this question. I Added the current directory to the MANIFEST file of the jar and it works.

Why is the -classpath option ignored in this case I wonder? Security?

查看更多
登录 后发表回答