2016-10-07 3 views
1

Я использую 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? Или я делаю что-то неправильно?

ответ

1

Я нашел способ обхода проблемы. Я не уверен, что это неправда или что-то подобное, но это работает. Обходной путь основан на том факте, что File.getAbsolutFile() по умолчанию возвращает каталог, разрешенный для каталога, определенного параметром user.dir. Поэтому мне нужно каким-то образом передать этот параметр при запуске службы Tomcat. Единственный способ, которым я нашел это, - добавить -Duser.dir=/%CATALINA_HOME/ в переменную CATALINA_OPTS, определенную в файле %CATALINA_HOME/bin/setenv.sh. После этого процесс сканирования шрифтов занял нормальное время, и мое приложение начало работать нормально.

Смежные вопросы