Чтение файлов из JAR (NoSuchFileException) - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь прочитать несколько файлов из файла JAR. Файл JAR находится в папке lib Tomcat. Я читаю файл как:

String filePath = DirectoryReader.class.getClassLoader().getResource(directoryPath).getPath();

System.out.println("Directory Path: " + directoryPath);
System.out.println("File Path 1: " + filePath);

filePath = filePath.substring(6, filePath.indexOf("!"));

System.out.println("File Path 2: " + filePath);

Path configJARLocation = Paths.get(filePath);
System.out.println("JAR location: " + configJARLocation.toString());
InputStream inputStream = Files.newInputStream(configJARLocation);
ZipInputStream zipInputStream = new ZipInputStream(inputStream);
InputStreamReader inputStreamReader = null;

Но я получаю исключение в журналах:

Directory Path: META-INF/gmm/xmlFiles/predefined/ipsec/
File Path 1: file:/opt/app/tools/tomcat/lib/appConfigurations.jar!/META-INF/gmm/xmlFiles/predefined/ipsec/
File Path 2: opt/app/tools/tomcat/lib/appConfigurations.jar
JAR location: opt/app/tools/tomcat/lib/appConfigurations.jar
java.nio.file.NoSuchFileException: opt/app/tools/tomcat/lib/appConfigurations.jar
        at sun.nio.fs.UnixException.translateToIOException(UnixException.java:86)
        at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
        at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
        at sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:214)
        at java.nio.file.Files.newByteChannel(Files.java:361)
        at java.nio.file.Files.newByteChannel(Files.java:407)
        at java.nio.file.spi.FileSystemProvider.newInputStream(FileSystemProvider.java:384)
        at java.nio.file.Files.newInputStream(Files.java:152)
        at com.gtc.logicalprovisioning.dac.file.DirectoryReader.process(DirectoryReader.java:72)

Кроме начальных / перед opt, я могу не вижу ничего неправильного. Строка 72 кода:

InputStream inputStream = Files.newInputStream(configJARLocation);

Тот же код работает в Windows. Только когда я развертываюсь в моей среде Unix, он начинает отказывать. Сначала я думал, что это проблема разрешения или доступа. Но, похоже, это не так. Я изменил chmod сначала с 755, а затем на 777 для файла JAR. Затем я изменил разрешение, используя chown. Но это все равно не сработало. Я не Unix эксперт, поэтому я не могу в этом разобраться. Добрый совет! Спасибо!

1 Ответ

0 голосов
/ 03 февраля 2020

Как я сказал выше в своем комментарии. Проблема заключалась в префиксе file:/. Поскольку я выполнял строковые манипуляции с начальным индексом 6, это приводило к тому, что первый / обрезался по пути Unix.

Windows Путь похож на:

file:/H:/...

Не могу сказать, почему путь Windows имеет дополнительный / впереди. Если кто-то может рассказать мне об этом, это было бы неплохо.

Unix Путь подобен:

file:/opt/...

Так что более чистым вариантом будет использование API URL / URI для получения это было сделано. Надо было подумать об этом раньше, так как это более изящный способ решения этой проблемы.

// JAR File Reading
String filePath = DirectoryReader.class.getClassLoader().getResource(directoryPath).getPath();

filePath = filePath.substring(0, filePath.indexOf("!"));

URL url = new URL(filePath);

Path configJARLocation = Paths.get(url.toURI());

InputStream inputStream = Files.newInputStream(configJARLocation);
ZipInputStream zipInputStream = new ZipInputStream(inputStream);
InputStreamReader inputStreamReader = null;

Это сработало для меня.

...