Чтение файлов из JAR (NoSuchFileException)

Чтение файлов из JAR (NoSuchFileException)

31.01.2020 02:33:31 Просмотров 33 Источник

Я пытаюсь прочитать несколько файлов из файла JAR. Файл jar находится в папке Либ файл сервера 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, так что я не могу действительно копаться в этом. Пожалуйста, посоветуйте! Спасибо!

У вопроса есть решение - Посмотреть?

Ответы - Чтение файлов из JAR (NoSuchFileException) / Reading Files from JAR (NoSuchFileException)

Является ответом!
hell_storm2004

03.02.2020 11:14:39

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

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

file:/H:/...

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

Unix Path-это как:

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;

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

Помочь в развитии проекта:
Закрыть X