Bek*_*eko 2 java jar file path maven
我有,我有一个一流的Maven项目SomeClass中src/main/java是应该读出位于文件src/main/resources.
这是我的第一个方法:
private static void someMethod() {
// ... [context] ...
String fileName = "src/main/resources/some_file.txt";
for(String line : Files.readAllLines(Paths.get(fileName))) {
System.out.println(line);
}
}
Run Code Online (Sandbox Code Playgroud)
这在Eclipse控制台上运行时工作正常,但是当我在Windows控制台上执行jar文件(由Maven生成)时(它IOException被抛出)它不会.
我认为它与文件路径有关,所以我将代码更改为:
private static void someMethod() {
// ... [context] ...
String fileName = "C:/Users/.../workspace/.../src/main/resources/some_file.txt";
for(String line : Files.readAllLines(Paths.get(fileName))) {
System.out.println(line);
}
}
Run Code Online (Sandbox Code Playgroud)
这适用于Eclipse和Windows控制台.但显然这不适用于另一台机器.
在搜索时我将静态方法更改为非静态方法,并用于ClassLaoder获取文件:
private void someMethod() {
// ... [context] ...
ClassLoader cL = getClass().getClassLoader();
File file = new File(cL.getResource("some_file.txt").getFile());
for(String line : Files.readAllLines(Paths.get(file.getPath()))) { // or getAbsolutePath()
System.out.println(line);
}
}
Run Code Online (Sandbox Code Playgroud)
这个可以在Eclipse控制台上运行,当我System.out.println(file.getPath)打印出正确的路径时.但它在Windows控制台上不起作用.执行jar文件时,我得到了这个:
Exception in thread "main" java.nio.file.InvalidPathException: Illegal char <:> at index 4: file:\C:\Users\...\target\...-SNAPSHOT.jar!\some_file.txt
at sun.nio.fs.WindowsPathParser.normalize(Unknown Source)
at sun.nio.fs.WindowsPathParser.parse(Unknown Source)
at sun.nio.fs.WindowsPathParser.parse(Unknown Source)
at sun.nio.fs.WindowsPath.parse(Unknown Source)
at sun.nio.fs.WindowsFileSystem.getPath(Unknown Source)
at java.io.File.toPath(Unknown Source)
...
Run Code Online (Sandbox Code Playgroud)
因此,长的故事砍短:我怎么可以指定文件路径,这样在Maven构建产生的JAR文件正确执行,独立它的运行平台的?
由于您尝试从类路径资源(即不在文件系统中但嵌入在jar中的资源,如所示src/main/resources)中读取,因此您无法使用Files.lines.Java NIO.2 Path不能用于JAR内的资源.
你需要使用一个InputStream代替.要读取文件中的所有行,可以将其包装成BufferedReader.假设此代码在类中SomeClass,您可以使用以下代码(Java 8):
try (BufferedReader br = new BufferedReader(new InputStreamReader(SomeClass.class.getResourceAsStream("/some_file.txt")))) {
br.lines().forEach(System.out::println);
}
Run Code Online (Sandbox Code Playgroud)