Статьи

Hollowjars, сканер развертывания и почему Рой Wildfly это круто

В предыдущем посте я описал, как вы можете использовать OpenLiberty и maven для запуска сервера, как автономного или как часть сборки maven, и как создать пакет fatjar.

В этом посте я расскажу, как это сделать с помощью роя Wildfly. Я все еще пытаюсь запустить MicroProfile на Wildfly , поэтому пока этот пример работает не так, как пример OpenLiberty.

Я использую тот же пример проекта с большим количеством профилей maven для запуска различных вариантов развертывания.

(см. https://github.com/phillip-kruger/javaee-servers-parent )

Пример проекта

Я хотел включить некоторые функции MicroProfile, так что это приложение «Цитата дня» вместо простого «Hello world». Мое приложение использует фабрику для загрузки провайдера котировок (пока только один). Текущий поставщик получает предложение от forismatic.com . Я использую MicroProfile Configuration API для настройки таких вещей, как URL-адрес и поставщик для загрузки. Я использую MicroProfile Fault Tolerance API, чтобы убедиться, что мы выживем, когда источник поставщика недоступен.

Вы можете получить полный пример проекта здесь: https://github.com/phillip-kruger/quote-service

Запуск как часть сборки Maven

Вы можете использовать плагин wildfly-swarm-plugin для запуска ( mvn wildfly-swarm:run ) экземпляра роя wildfly как части сборки. Этот плагин будет выполнять «обнаружение дроби», то есть будет смотреть, какие части сервера приложений вам нужны, и создавать только развертывание с включенными дробями. Таким образом, вы все еще можете включать зонтичные API в свои зависимости и кодировать их, но во время развертывания вы получите правильное распределение по размеру. Здорово !

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
<dependencies>
        <!-- Java EE -->
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>${java-ee.version}</version>
            <scope>provided</scope>
        </dependency>
        <!-- MicroProfile -->
        <dependency>
            <groupId>org.eclipse.microprofile</groupId>
            <artifactId>microprofile</artifactId>
            <version>${microProfile.version}</version>
            <type>pom</type>
            <scope>provided</scope>
        </dependency>
    </dependencies>

Я всегда использую фильтрацию, когда включаю HTML-файлы, которые ссылаются на веб-файлы , но похоже, что плагин использует исходный файл до применения фильтра, поэтому мне пришлось искать альтернативу.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.0.0</version>
        <configuration>
            <webResources>
                <resource>
                    <directory>${basedir}/src/main/webapp</directory>
                    <filtering>true</filtering>
                    <includes>
                        <include>**/*.css</include>
                        <include>**/*.jsp</include>
                    </includes>
                </resource>
            </webResources>
        </configuration>
    </plugin>

В этом примере я использую Semantic UI для создания веб-страницы, которая отображает цитату дня:

Я использую свойства maven для версий CSS и JS в HTML, и мне нужно заменить их реальным значением при сборке:

1
2
3
<link rel="stylesheet" type="text/css" href="webjars/semantic-ui/${semantic-ui.version}/dist/semantic.min.css">
    <script type="text/javascript" src="webjars/jquery/${jquery.version}/dist/jquery.min.js" />
    <script type="text/javascript" src="webjars/semantic-ui/${semantic-ui.version}/dist/semantic.min.js"></script>

В качестве альтернативы я использую цель пакета, а затем exec-maven-plugin для запуска jar.

Это также позволяет мне передать standalone.xml для любой дополнительной конфигурации:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<plugin>
        <groupId>org.wildfly.swarm</groupId>
        <artifactId>wildfly-swarm-plugin</artifactId>
        <executions>
            <execution>
                <id>1</id>
                <phase>pre-integration-test</phase>
                <goals>
                    <goal>package</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
 
    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>1.6.0</version>
        <executions>
            <execution>
                <id>1</id>
                <phase>post-integration-test</phase>
                <goals>
                    <goal>exec</goal>
                </goals>
            </execution>
        </executions>
        <configuration>
            <executable>java</executable>
            <arguments>
                <argument>-jar</argument>
                <argument>${project.build.directory}${file.separator}${project.artifactId}-swarm.jar</argument>
                <argument>-c</argument>
                <argument>${project.build.directory}${file.separator}standalone.xml</argument>
            </arguments>
        </configuration>
    </plugin>

В моем случае standalone.xml содержит только конфигурацию регистрации, но теперь вы можете включить любую другую конфигурацию.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
<server xmlns="urn:jboss:domain:4.0">
        <profile>
            <subsystem xmlns="urn:jboss:domain:logging:3.0">
                <periodic-rotating-file-handler name="FILE" autoflush="true">
                    <file path="${wildfly-swarm.logfile}"/>
                    <suffix value=".yyyy-MM-dd"/>
                    <append value="true"/>
                </periodic-rotating-file-handler>
                <root-logger>
                    <level name="INFO"/>
                    <handlers>
                        <handler name="FILE"/>
                    </handlers>
                </root-logger>
                <logger category="${log.name}">
                    <level name="${log.level}"/>
                </logger>
            </subsystem>
        </profile>
    </server>

Итак, в qoute-service с qoute-service вы можете просто сделать это (так же, как в примере с OpenLiberty):

mvn clean install -P wildfly-swarm-fatjar

Hollowjar

Wildfly рой позволяет вам создавать hollowjar. (см. эту статью ) То есть фатжар без вашего приложения, только часть сервера приложений. Затем вы можете предоставить приложение в виде командной строки:

1
java -jar myapp-hollow-swarm.jar myapp.war

Таким образом, если мы сможем перезагрузить часть приложения, у нас может быть та же модель разработки, что и для полного приложения (горячее развертывание).

Сканер развертывания

В Wildfly Swarm есть фракция, называемая сканером развертывания , которую вы можете включить в свой дистрибутив (жирный или пустой).

Обнаружение фракции не будет автоматически обнаруживать это (поскольку в коде нет ссылки на это). К счастью, вы можете определить дополнительные дроби в Maven:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
<plugin>
        <groupId>org.wildfly.swarm</groupId>
        <artifactId>wildfly-swarm-plugin</artifactId>
        <executions>
            <execution>
                <phase>pre-integration-test</phase>
                <goals>
                    <goal>package</goal>
                </goals>
            </execution>
        </executions>
        <configuration>
            <hollow>true</hollow>
            <additionalFractions>scanner</additionalFractions>
        </configuration>
    </plugin>

Чтобы эта фракция сканера работала, добавьте ее в ваш standalone.xml

1
2
3
4
5
6
7
8
<subsystem xmlns="urn:jboss:domain:deployment-scanner:2.0">
    <deployment-scanner
        scan-enabled="true"
        scan-interval="5000"
        path="/tmp/quote-service/wildfly-swarm/deployments"
        name="quote-service"
        auto-deploy-xml="false"/>
    </subsystem>

Если вы сейчас переместите обновленную версию своего приложения по указанному пути, вы будете использовать горячее развертывание.

В примере с цитатой это означает, что вы можете:

  • mvn clean install -P wildfly-swarm-start (для запуска сервера)
  • mvn clean install -P wildfly-swarm-deploy (для горячего развертывания на работающем сервере)
  • mvn clean install -P wildfly-swarm-stop (чтобы остановить работающий сервер)

Вы также можете создать фиджар:

  • mvn clean install -P пакет

Экономия времени

Для создания и запуска фатжара требуется около 10 секунд . Горячее развертывание занимает около 2,7 секунды .
Это значительно экономит время, делая процесс изменения времени между изменениями намного быстрее.

Опубликовано на Java Code Geeks с разрешения Филиппа Крюгера, партнера нашей программы JCG . См. Оригинальную статью здесь: Hollowjars, сканер развертывания и почему Swarm Wildfly это круто.

Мнения, высказанные участниками Java Code Geeks, являются их собственными.