Я использую Apache Batik для преобразования SVG в PDF в одном из проектов. Проект - приложение Spring, работающее в Tomcat 7. Все работает нормально на машине разработки, которая работает под Ubuntu с запуском Tomcat с использованием $ CATALINA_HOME/bin/startup.sh. Но когда я пытаюсь запустить приложение на рабочем сервере с CentOS 6, а Tomcat начал использовать команду service tomcat7 start
, приложение попадает в бесконечный цикл конвертации. Я пытался отладить проблему и нашел этот кусок кода:Бесконечное сканирование шрифтов в Apache FOP на CentOS
/**
* Creates the {@link FontInfo} instance for the given configuration.
* @param cfg the configuration
* @param useComplexScriptFeatures true if complex script features enabled
* @return the font collection
* @throws FOPException if an error occurs while setting up the fonts
*/
public static FontInfo createFontInfo(Configuration cfg, boolean useComplexScriptFeatures)
throws FOPException {
FontInfo fontInfo = new FontInfo();
final boolean strict = false;
if (cfg != null) {
URI thisUri = new File(".").getAbsoluteFile().toURI();
InternalResourceResolver resourceResolver
= ResourceResolverFactory.createDefaultInternalResourceResolver(thisUri);
//TODO The following could be optimized by retaining the FontManager somewhere
FontManager fontManager = new FontManager(resourceResolver, FontDetectorFactory.createDefault(),
FontCacheManagerFactory.createDefault());
//TODO Make use of fontBaseURL, font substitution and referencing configuration
//Requires a change to the expected configuration layout
DefaultFontConfig.DefaultFontConfigParser parser
= new DefaultFontConfig.DefaultFontConfigParser();
DefaultFontConfig fontInfoConfig = parser.parse(cfg, strict);
DefaultFontConfigurator fontInfoConfigurator
= new DefaultFontConfigurator(fontManager, null, strict);
List<EmbedFontInfo> fontInfoList = fontInfoConfigurator.configure(fontInfoConfig);
fontManager.saveCache();
FontSetup.setup(fontInfo, fontInfoList, resourceResolver, useComplexScriptFeatures);
} else {
FontSetup.setup(fontInfo, useComplexScriptFeatures);
}
return fontInfo;
}
в PDFDocumentGraphics2DConfigurator
классе. Когда я запускаю приложение на машине разработчика, строка URI thisUri = new File(".").getAbsoluteFile().toURI();
приводит к тому, что thisUri
присваивается папкой ~/tomcat/bin/.
. Когда приложение запущено на производственной машине, оно присваивается значением /.
. Я думаю, что это основная проблема, потому что значение thisUri
- это папка, в которой FOP запускает поиск шрифтов, а на производственной машине - это корень файловой системы, а рекурсивный поиск по всей структуре FS очень медленный. Я попытался добавить файл fop.xconf
в каталог WEB-INF
с конфигурацией шрифтов, но это не повлияло на поведение FOP. И я не могу запустить Tomcat на сервере производства так же, как я начинаю на машине dev. Есть ли идеи о том, как настроить базовый каталог для сканирования шрифтов FOR? Или я делаю что-то неправильно?