Tomcat 10 выдает ошибку FileNotFoundException при попытке загрузить ресурс из пути к классам внутри ForkJoinPoolJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Tomcat 10 выдает ошибку FileNotFoundException при попытке загрузить ресурс из пути к классам внутри ForkJoinPool

Сообщение Anonymous »

Я хочу рассказать о проблеме, которая начала возникать после обновления Java 8, Tomcat 8 и Spring Boot 2 до Java 17, Tomcat 10 и Spring Boot 3.
проблема в том, что теперь мы больше не можем загружать некоторые файлы шрифтов из пути к классам.
У нас есть папка шрифтов внутри src/main/resources. Когда мы компилируем проект, папка копируется в WEB-INF/classes, которая является правильной папкой для Tomcat.
Просматривая руководства по миграции Tomcat, я не увидел что-либо конкретное, связанное с изменением ресурсов, которое могло бы объяснить это.
Развертывание выполняется как в старые добрые времена: мы компилируем проект в файл .war, а затем сохраняем его в Папка веб-приложений Tomcat. Итак, внутри этой папки у нас есть папка WEB-INF/classes, содержащая все ресурсы приложения, которые будут загружены в путь к классам, включая папку Fonts.
Для загрузки ресурсов мы используем Spring ResouceLoader. Пример:

Код: Выделить всё

String fontPath = resourceLoader.getResource(“classpath:fonts/font.ttf”).getFile().getPath();
ResouceLoader предоставляется Spring посредством внедрения зависимостей:

Код: Выделить всё

private final ResourceLoader resourceLoader;
Итак, до обновления все работало нормально. Итак, я просмотрел документацию Tomcat 10, чтобы узнать, изменился ли способ размещения ресурсов, и кажется, что он остался прежним; то есть файлы в разделе WEB-INF/classes должны быть доступны. Согласно документации:

Код: Выделить всё

WebappX — A class loader is created for each web application that is deployed in a single Tomcat instance. All unpacked classes and resources in the /WEB-INF/classes directory of your web application… are made visible to this web application…
Я создал один пример приложения, чтобы продемонстрировать проблему: tomcat10-test
Внутри него у нас есть класс AppStartupRunner, который демонстрирует проблема.
В строке 16 мы реализуем интерфейс ApplicationRunner, поэтому этот код будет выполняться во время запуска.
В строке 28 мы объявляем Runnable , который пытается загрузить ресурс:

Код: Выделить всё

        Runnable runnable = () -> {
try {
String fontPath = resourceLoader.getResource("classpath:fonts/font.ttf").getFile().getPath();
logger.info("fontPath: {}", fontPath);
} catch (IOException e) {
logger.error("error load font thread", e);
throw new RuntimeException(e);
}
};
В строке 40 мы запускаем его с помощью потока:

Код: Выделить всё

new Thread(runnable).start(); // this works
В строке 44 мы запускаем его с помощью ExecutorService:

Код: Выделить всё

executorService.submit(runnable).get(); // this works
В строке 51 мы запускаем его с помощью ForkJoinPool:

Код: Выделить всё

THREAD_POOL.submit(runnable).get(); // Throws FileNotFoundException exception when running with Tomcat
Если я запускаю этот код непосредственно из своей IDE, он работает.
Если я создаю файл .war с помощью команды:

Код: Выделить всё

./gradlew clean build -x test
а затем развернуть файл в Tomcat 10, это не работает.
Итак, подведем итог:
  • Он работал с Java 8, Tomcat 8 и Spring Boot 2.
  • Он больше не работает после обновления до Java 17, Tomcat 10 и Spring Boot 3.< /li>
    Ошибка возникает только при попытке загрузить ресурс из Thread внутри ForkJoinPool и при работе с Tomcat.
Итак, я не знаю, что изменилось, поскольку теперь Tomcat больше не может загружать ресурсы из пути к классам при запуске потока из ForkJoinPool.
Я пытался использовать несколько разных подходов для загрузки ресурсов:
Используйте класс ResourceUtils Spring, а также используйте getClass().getClassLoader(), но я получаю то же самое проблема.
Ожидаемый результат — возможность загрузки ресурса пути к классам, когда приложение развертывается в Tomcat 10, а поток выполняется внутри ForkJoinPool.

Подробнее здесь: https://stackoverflow.com/questions/776 ... ource-from
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»