这里的第一篇文章,我希望我已经充分形成了这个问题。当我的项目作为一个项目在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之外。非常感谢!