Доброе утро!
Работая над „форком“ такого чудесного проекта, как Keycloak, мы озадачились вопросом добавления модулей WildFly на этапе сборки.
Да, можно класть их после развёртывания на площадке в $WILDFLY_HOME/modules/, можно пытаться деплоить динамически, но особенностью Keycloak является то, что система сборки позволяет получить готовый, настроенный дистрибутив WildFly сразу после сборки. Как следствие, и возникла идея его сделать „пренастроенным“ для наших тестовых площадок.
Посмотрим, как это сделать на примере драйвера к СУБД PostgreSQL.
Нужно поправить всего несколько файлов:
Идём в dependencies/drools-bom/pom.xml
, секция <properties>
, добавим следующую строку:
<postgresql.version>42.2.8</postgresql.version>
Очевидно, это версия используемой зависимости.
В том же файле, секция <dependencies> пополняется следующими строками:
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>${postgresql.version}</version>
</dependency>
Теперь в файле dependencies/server-all/pom.xml
так же добавляем зависимость:
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
Версию указывать не нужно.
Следом идём в distribution/feature-packs/server-feature-pack/pom.xml
и добавляем зависимость уже в нём:
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
Осталось лишь добавить сам feature pack. В distribution/feature-packs/server-feature-pack/src/main/resources/
надо добавить module.xml по пути, будто это $WILDFLY_HOME. В данном случае, получается файл distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/keycloak/org/postgresql/main/module.xml
следующего содержания:
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.1" name="org.postgresql">
<resources>
<artifact name="${org.postgresql:postgresql}"/>
</resources>
<dependencies>
<module name="javax.api"/>
<module name="javax.transaction.api"/>
</dependencies>
</module>
Как видно, вместо привычного
<resource-root path="postgresql-42.2.8.jar"/>
у нас идёт
<artifact name="${org.postgresql:postgresql}"/>
(groupId:artifactId), в остальном всё как обычно.
Ну и завершающим, в данном случае не являющимся необходимым штрихом будет добавить наш модуль в зависимости тому, ради кого это делали. Для commons-io
, например, это <module name="org.apache.commons.io"/>
в секцию <dependencies>
module.xml
соответствующего модуля.
Бонус
Так как мы рассматривали добавление модуля postgresql, думаю, стоит сразу написать, что сделать для изменения дефолтной конфигурации собираемого WildFly на работу с соответствующей СУБД. Keycloak описывает свой datasource, KeycloakDS. Шаблоны, из которых создаются источники данных для standalone.xml находятся в файле wildfly/server-subsystem/src/main/resources/subsystem-templates/keycloak-datasources.xml
. В нашем случае, это переопределение соответствующей секции на использование иного драйвера:
<datasource jndi-name="java:jboss/datasources/KeycloakDS" pool-name="KeycloakDS" enabled="true" use-java-context="true" statistics-enabled="${wildfly.datasources.statistics-enabled:${wildfly.statistics-enabled:false}}">
<connection-url><?KEYCLOAK_DS_CONNECTION_URL?></connection-url>
<driver>postgresql</driver>
<security>
<user-name>user</user-name>
<password>pass</password>
</security>
</datasource>
Правка переменной, содержащей URL соединения:
<replacement placeholder="KEYCLOAK_DS_CONNECTION_URL">
jdbc:postgresql://localhost:5432/keycloak
</replacement>
И указание драйвера postgresql, в дополнение к уже имеющемуся h2:
<drivers>
<driver name="postgresql" module="org.postgresql">
<driver-class>org.postgresql.Driver</driver-class>
</driver>
<driver name="h2" module="com.h2database.h2">
<xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
</driver>
</drivers>
Теперь можно собирать это дело командой в духе mvn install -Pdistribution
, получив WildFly с Keycloak, нашими модулями и настройками.
На этом всё, спасибо за внимание.