проблема в том, что теперь мы больше не можем загружать некоторые файлы шрифтов из пути к классам.
У нас есть папка шрифтов внутри 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();
Код: Выделить всё
private final ResourceLoader resourceLoader;
Код: Выделить всё
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…
Внутри него у нас есть класс 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);
}
};
Код: Выделить всё
new Thread(runnable).start(); // this works
Код: Выделить всё
executorService.submit(runnable).get(); // this works
Код: Выделить всё
THREAD_POOL.submit(runnable).get(); // Throws FileNotFoundException exception when running with Tomcat
Если я создаю файл .war с помощью команды:
Код: Выделить всё
./gradlew clean build -x test
Итак, подведем итог:
- Он работал с Java 8, Tomcat 8 и Spring Boot 2.
- Он больше не работает после обновления до Java 17, Tomcat 10 и Spring Boot 3.< /li>
Ошибка возникает только при попытке загрузить ресурс из Thread внутри ForkJoinPool и при работе с Tomcat.
Я пытался использовать несколько разных подходов для загрузки ресурсов:
Используйте класс ResourceUtils Spring, а также используйте getClass().getClassLoader(), но я получаю то же самое проблема.
Ожидаемый результат — возможность загрузки ресурса пути к классам, когда приложение развертывается в Tomcat 10, а поток выполняется внутри ForkJoinPool.
Подробнее здесь: https://stackoverflow.com/questions/776 ... ource-from