我的可执行 jar 在 netbeans 外部运行时无法打开资源文件



这里的第一篇文章,我希望我已经充分形成了这个问题。当我的项目作为一个项目在netbeans内部运行时,它会在类路径上找到资源文件,但当我在netbeas外部运行jar时,它找不到资源(我已经检查过了,是的,它们被放入了jar中。(

我已经尝试了.getResource((和.getResourceAsStream((版本的代码。当它们作为一个maven项目在netbeans内部运行时都会成功,但当我移除jar并在netbean外部运行时,却找不到这些资源。

这是我的代码片段,也是我添加资源的pom文件中的片段。当它作为一个项目在netbeans中运行时,一切都是有效的,但当我在其他地方运行jar时就不行了。它找不到资源。

String wholeFile = "";
try {
BufferedReader objReader = new BufferedReader(
new java.io.InputStreamReader(
getClass().getResourceAsStream( sqlFileName ) 
)
);
StringBuilder sb = new StringBuilder();
String strCurrentLine;
while ( (strCurrentLine = objReader.readLine()) != null ) {
sb.append( strCurrentLine );
sb.append( System.getProperty("line.separator") );
}
wholeFile = sb.toString();

或者,优选地。。。

wholeFile = java.nio.file.Files.readString(
java.nio.file.Paths.get( 
getClass().getClassLoader().getResource( sqlFileName ).toURI()
) 
);

// Split that file into individual create
// table strings contained in the file.
// Slit on two newlines.
String newLine = System.getProperty("line.separator");
String[] tables = wholeFile.split( newLine + newLine );

以下是我在pom中添加的内容。但这只有在netbeans中运行时才能解决。为什么?关于这里的maven设置,我缺少什么?在netbeans之外。。。可执行jar不会像在netbeans中运行时那样定位这些资源文件。

提前谢谢。我希望我的问题很清楚。

<resources>
<resource>
<directory>src/my-resources</directory>
<includes>
<include>**/*.txt</include>
<include>**/*.jpg</include>
</includes>
</resource>
</resources>
据我所知,java.nio.file.Files无法读取*.jar文件的内容。您需要通过类加载器作为流访问资源。所以我认为你的第一次尝试应该是好的。

这可能只是路径名的问题。下面是一个没有Maven的工作示例:

文件src/de/stefanfrins/Main.java:

package de.stefanfrings;
import java.io.InputStream;
import java.util.*;
public class Main
{
public static void main(String[] args)
{
InputStream stream=Main.class.getResourceAsStream("/test.txt");
Scanner in=new Scanner(stream);
while (in.hasNextLine())
{
System.out.println(in.nextLine());
}
in.close();
}
}

文件src/de/test.txt:

Hello
World

test.jar的内容:

META-INF/MANIFEST.MF
test.txt
de/stefanfrings/Main.class

输出:

java -jar test.jar
Hello
World

如果我将文件名更改为"../../test.txt",那么它只在IDE中工作,因为IDE从编译器放置输出的(未压缩(文件夹执行程序。

请尝试在文件名前面加上"/"。

StringBuilder sb = new StringBuilder();
InputStream stream = getClass().getResourceAsStream( sqlFileName );
Scanner in=new java.util.Scanner(stream);
while (in.hasNextLine())
{
//System.out.println(in.nextLine());
sb.append( in.nextLine() );
sb.append( System.getProperty("line.separator") );
}
in.close();
wholeFile = sb.toString();

非常感谢,修复了它。这里只使用一个直接的InputStream有一些不同。您的代码有效。

现在工作。。。在netbeans之外。非常感谢!

最新更新