У меня есть проект Maven, в котором у меня есть класс SomeClass
в src/main/java
, который должен считывать файл, расположенный в src/main/resources
.Задание общего пути к файлу для работы с jar-файлом
Это был мой первый подход:
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);
}
}
Это отлично работает при запуске на консоли затмений, но это не делает, когда я исполняю Jar-файл (произведенный Maven) на консоли Windows (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);
}
}
Это работает на обоих, консоль 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);
}
}
Это один работает на консоли 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)
...
Так, долго истории сократить короткий: как я могу указать файл-путь, так что банка-файл, созданный с помощью Maven построить Выполняет правильно, независимо от платформы, на которой он работает?
О парень, я не собирался спать ночью. Спасибо .... Это идеальное решение для Java 8. – Farah