在将应用程序导出为可运行的jar后,我遇到了加载资源的问题。
方案如下:
我有一个位于类路径中的资源文件夹。在资源文件夹内有另一个文件夹,其中包含几个代表数据库查询的文件。我的第一个获取目录的解决方案如下:
URI queryResource = this.getClass().getResource("/queries/").toURI();
File queryDir = new File(queryResource);
当我在eclipse中测试代码时,这工作正常。一旦我将应用程序导出到一个可运行的char中,我就得到NullPointerExceptions
。对该问题的研究产生了一种使用getResourceAsStream
而不是getResource
方法的解决方案。
我首先在一些用于配置目的的XML文件上对此进行了测试。所以我用过:
InputStream in = this.getClass().getResourceAsStream(/config/xml/configFile.xml);
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
parser.parse(in, this);
此解决方案适用于eclipse和导出的jar中的配置文件。为了加载查询文件,我写了一个小实用工具方法来使用InputStream
创建一个临时目录,我将查询文件复制到其中。该方法如下所示:
public static URI createDirectory(Class<?> resourceClass, String directory) throws IOException {
//create temp dir to store the files
File tempDir = FileUtility.createTempDir();
InputStream in = resourceClass.getResourceAsStream(directory));
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String readLine = null;
while((readLine = reader.readLine()) != null) {
InputStream inputFileStream = resourceClass.getResourceAsStream(resource + readLine);
File tempFile = new File(tempDir.getAbsolutePath() + "\\" + readLine);
tempFile.createNewFile();
tempFile.deleteOnExit();
FileOutputStream fos = new FileOutputStream(tempFile);
IOUtils.copy(inputFileStream, fos);
}
return tempDir.toUri();
}
现在我从那里使用我的常规代码来读取文件:
URI queryResource = createDirectory(this.getClass, "/queries/");
queryDir = new File(queryResource);
在eclipse中运行应用程序时再次正常工作。但是,在导出的jar中,InputStream
方法中的第一个createDirectory
为空。该流不是null
它已实例化但没有内容。
有没有人知道出了什么问题?请告诉我。
问候
PS:目前使用IDE的机器无法访问网络,所以我手动输入了这个。可能会有一些错误。我写的代码没有任何语法错误。如果你在这篇文章的代码中找到任何内容,那么他们就是我的错误。