angle-left

Добавляем WildFly-модули в Keycloak

Доброе утро!

Работая над „форком“ такого чудесного проекта, как 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, нашими модулями и настройками.

На этом всё, спасибо за внимание.