Использование Java 8, Tomcat 8 +.
Я столкнулся с такой проблемой - я пытаюсь прочитать ресурс txt внутри jar в lib. Я использовал следующий код:
import java.io.File;
import org.apache.commons.io.FileUtils;
// ....
// code within some class method
File file = new File(superService.getClass().getClassLoader()
.getResource("com/domain/example/sorry/confidential/little_text.txt")
.getFile())
return FileUtils.readFileToString(file, "UTF-8")
Хотя он хорошо работал с моей Intellij IDEA, после развертывания на сервере Tomcat у меня возникло такое исключение:
java .io.FileNotFoundException: файл 'файл: /usr/local/tomcat/webapps/prod-lims/WEB-INF/lib/abc-1.2-SNAPSHOT.jar! com / domain / example / извините / конфиденциально / little_text .txt 'не существует
И после этого я нашел много ответов в SO и других сайтах, которые мне нужно использовать методы ClassLoader.getResourceAsStream () или Class.getResourceAsStream () для ресурсов в JAR . Конечно, я попытался переработать свой код в старом стиле и - вуаля! - теперь работает:
import java.io.BufferedReader;
import java.io.InputStreamReader;
// ....
// code within some class method
InputStream inputStream = superService.getClass().getClassLoader()
.getResourceAsStream("com/domain/example/sorry/confidential/little_text.txt")
StringBuilder resultStringBuilder = new StringBuilder();
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream))
try {
String line;
while ((line = br.readLine()) != null) {
resultStringBuilder.append(line).append("\n");
}
} catch(Exception e) {
//just a formal catch - don't mind for now
}
return resultStringBuilder.toString()
Хорошо, рабочим решением доволен. Но я нигде не могу найти четкого объяснения: почему getResourceAsStream работает, и в то же время подход «Файл» не работает для ресурсов в JAR? Мне любопытно, потому что superService.getClass().getClassLoader().getResource("com/domain/example/sorry/confidential/little_text.txt")
возвращает не null, но в созданном файле есть canRead() == false
и isExist() == false
.