Блоги

Интеграция Liferay 7 и библиотеки docx4j

docx4j - это продукт на Java с открытым исходным кодом, предназначенный для работы с файлами Microsoft Open XML. У продукта существуют бесплатная и платная версии. Нас, по большому счёту, интересовал функционал замены плейсхолдеров и генерация pdf. Если замену плейсхолдеров успешно делает сама библиотека docx4j, то для генерации надо использовать отдельный продукт из стека docx4j - https://github.com/plutext/docx4j-export-FO. 

Из того, что хотелось бы рассказать в рамках этого блога - это инкапсуляция зависимостей в бандл и работа с плагинами Maven для сборки проекта. Для работы docx4j требует внушительного количества зависимостей в classpath. Деплоить их все в Liferay достаточно проблематично - часть из них не имеют версии для OSGi, часть конфликтуют с другими развёрнутыми бандлами. Решено было использовать возможность встраивания зависимостей в бандл. Скажу сразу - эту задачу можно решить как минимум 2-мя путями при помощи Maven. Первый путь - совместное использование плагинов сборки:

<plugin>

 <groupId>org.apache.felix</groupId>

 <artifactId>maven-scr-plugin</artifactId>

 <version>1.20.0</version>

 <executions>

   <execution>

    <id>generate-scr-scrdescriptor</id>

    <goals>

     <goal>scr</goal>

    </goals>

    <configuration>

     <generateAccessors>false</generateAccessors>

    </configuration>

   </execution>

 </executions>

</plugin>

 и

maven-bundle-plugin.

maven-scr-plugin нам даёт возможность генерации xml описаний для Declarative Services(DS). Это xml файлы, которые создаются в папке OSGI-INF во время сборки по найденным в коде аннотациям @Component, @Reference... В maven-bundle-plugin плагине, в разделе Embed-Dependency мы можем определить список зависимостей для включения в собранный jar. К сожалению этот плагин не даёт возможность определить специфичные для Liferay пункты, например Liferay-Releng-Module-Group-Title. Для этого можно использовать возможность объединения файлов MANIFEST.MF - при помощи настройки:

<_include>src/main/resources/META-INF/MANIFEST.MF</_include>

мы задаём путь к файлу MANIFEST.MF, в котором прописаны все специфичные для Liferay пункты. Во время сборки этот файл будет добавлен к сгенерённому. 

Как итог получается достаточно толстый jar, готовый к разворачиванию в Liferay, в корне которого будут все наши зависимости в виде jar файлов. 

Тоже самое можно сделать при помощи bnd-maven-plugin и файла bnd.bnd.

Хочется отметить ещё один момент - уже по работе с Microsoft Word. Если при редактировании шаблона вводить символ за символом плейсхолдер вида ${placeHolder}, то с большой долей вероятности, при сохранении в формат docx(а как известно это xml) - плейсхолдер не будет монолитной строкой, так как Microsoft Word вставляет свои символы между открытием и закрытием плейсхолдера. Помогает копи-паст - скопировать строку в текстовый редактор и вставить целиком её в файл шаблона.

07.02.2018