[Из песочницы] Компактный сервер с настроенной перезагрузкой кода и sql-логами одной maven командой для продуктивной разработки

habr.png

Хотелось бы поделиться опытом использования payara-micro в разработке корпоративных приложений. Надеюсь, что кому-то сэкономлю время, так как такое решение пришло далеко не сразу. Если вы уже используете Payara или Glassfish в качестве промышленного сервера, или только собираетесь окунуться в мир javaee, то payara-micro и эта статья для Вас.

Вам понадобится web-приложение, которое собирается посредством maven в war-архив, и Java 8 (на более старших работу не проверял).

Сначала приведу полный текст профиля, после чего мы его разберем на кусочки и дополним недостающими деталями, которые не видны в исходном коде.


maven профиль для payara-micro
        
            micro
            
                
                    
                        maven-dependency-plugin
                        2.6
                        
                            
                                copy-payara-micro
                                package
                                
                                    copy
                                
                                
                                    ${project.build.directory}
                                    true
                                    true
                                    
                                        
                                            fish.payara.extras
                                            payara-micro
                                            jar
                                        
                                    
                                
                            
                        
                    

                    
                        org.codehaus.mojo
                        exec-maven-plugin
                        1.2.1
                        
                            
                                
                                    exec
                                
                            
                        
                        
                            java
                            
                                
                                -XXaltjvm=dcevm
                                -javaagent:hotswap/hotswap-agent.jar
                                -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9009
                                -Duser.language=en
                                -Duser.region=US
                                -Ddb.ora.url=jdbc:p6spy:oracle:thin:@localhost:1521:XE
                                -Ddb.pg.url=jdbc:p6spy:postgresql://localhost:5432/postgres
                                -jar
                                ${project.build.directory}/${project.build.finalName}-microbundle.jar
                                
                                
                                --domainConfig
                                src/main/setup/domain.xml
                                --deploy
                                ${project.build.directory}/${project.build.finalName}.war
                                --rootDir
                                ${project.build.directory}/payaramicro
                            
                        
                    
                    
                        fish.payara.maven.plugins
                        payara-micro-maven-plugin
                        1.0.0
                        
                            
                                
                                    bundle
                                    start
                                
                            
                        
                        
                            4.1.2.173
                            false
                            
                                
                                    p6spy
                                    p6spy
                                    2.3.1
                                
                                
                                    com.oracle
                                    ojdbc6
                                    11.2.0.3
                                
                                
                                    org.postgresql
                                    postgresql
                                    42.2.0
                                
                            
                        
                    
                
            

            
                
                    fish.payara.extras
                    payara-micro
                    4.1.2.173
                    provided
                
                
                    p6spy
                    p6spy
                    2.3.1
                    provided
                
                
                    com.oracle
                    ojdbc6
                    11.2.0.3
                    provided
                
                
                    org.postgresql
                    postgresql
                    42.2.0
                    provided
                
            
                

Первое, что необходимо сделать — скачать сам архив payara-micro. Именно это и делает первый плагин (maven-dependency-plugin). Архив представляет собой полноценный сервер приложений, который может быть запущен из командной строки как простое java-приложение.

Последний плагин (payara-micro-maven-plugin) не имеет никаких особенностей и настроен на стабильно работающую версию payra-micro 4.1.2.173. Из возможностей плагина здесь используется функция запаковки web-приложения в специальный bundle, готовый к запуску. Есть и другие способы запуска payara-micro, но здесь они нам не пригодятся.

Осталось сгенерировать нужную командную строку и собрать все воедино. Для запуска из командной строки как раз и используется exec-maven-plugin. Рассмотрим подробнее параметры командной строки:


                            java
                            
                                
                                -XXaltjvm=dcevm
                                -javaagent:hotswap/hotswap-agent.jar
                                -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9009
                                -Duser.language=en
                                -Duser.region=US
                                -Ddb.ora.url=jdbc:p6spy:oracle:thin:@localhost:1521:XE
                                -Ddb.pg.url=jdbc:p6spy:postgresql://localhost:5432/postgres
                                -jar
                                ${project.build.directory}/${project.build.finalName}-microbundle.jar
                                --domainConfig
                                src/main/setup/domain.xml
                                --deploy
                                ${project.build.directory}/${project.build.finalName}.war
                                --rootDir
                                ${project.build.directory}/payaramicro
                            
                        

Первые два аргумента (-XXaltjvm=dcevm -javaagent: hotswap/hotswap-agent.jar) необходимы для изменения исходного кода без перезагрузки приложения. Благодаря второму аргументу (-agentlib: jdwp=transport=dt_socket, server=y, suspend=n, address=9009) мы сразу запускаем приложение в режиме отладки, что позволит через средства применения изменений кода в отладке в IDE изменять не только тело самих методов, но и добавлять новые поля и многое другое. Необходимо только подключиться отладчиком из IDE, скомпилировать измененный файл с исходным кодом и применить изменения.

Следующие два аргумента (-Duser.language=en -Duser.region=US) нужны для корректной работы jdbc-клиента с Oracle. Настройки подключения к тестовой СУБД передаются через -D аргументы. В своих приложениях я использую ссылку вида ${db.ora.url} на эти параметры в файле ресурсов, который автоматически создает их на старте. Подмена файла, который создает ресурсы с тестовыми или промышленными настройками тоже реализована через профиль в maven и его возможности фильтровать текстовые файлы.

Ключевые аргументы при запуске указывают путь (--domainConfig src/main/setup/domain.xml) до файла настроек домена, а так же путь до war-файла (--deploy ${project.build.directory}/${project.build.finalName}.war), подлежащего деплою на сервер. Настройки домена были мной получены на основании стандартного файла внутри архива. Содержимое приведу в качестве примера. Для использования в разработке указанных настроек более чем достаточно.


domain.xml



    
        
            
                
            
        
    
    
    
    
        
        
            
            
        
        
        
        
        
    
    
        
            
        
    
    
        
            
                
                
                
                
                
                
                
            
            
                
                
            
            
                
                
                
            
                
                
                 
            
            
            
                
            
            
                
            
            
                
                    
                    
                
                
                    
                    
                
                
                
                    
                
                
                
                    
                
                
                    
                        
                        
                        
                        
                        
                        
                    
                    
                        
                        
                        
                        
                        
                        
                        
                    
                    
                        
                        
                        
                        
                        
                    
                    
                        
                        
                        
                        
                        
                        
                    
                
                
            
            
            
            
            
            
                
            
            
                
                
            
            
            
                
                
            
            
                
                    
                        
                            
                               
                    
                    
                        
                            
                        
                        
                    
                
                
                    
                    
                
                
                    
                
            
            
                
                
            
         
    
    
    

Также приведу пример файла описания ресурсов для их автоматического создания на старте приложения.


glassfish-resources.xml



    
    
        
        
        
        
    
    
    
        
        
        
        
    

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

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

Идеи по настройке перезагрузки кода для payara были подчерпнуты отсюда. Но правда только сама идея, так как реализация для payara-micro там не рассматривается.

Благодаря библиотеке p6spy свои sql-логи вы можете найти в корневой папке проекта — файл spy.log. Библиотеку p6spy при необходимости можно настроить, но это уже тема совсем другой статьи.

После размещения описанного выше профиля в вашем pom.xml и дополнительных файлов, рассмотренных выше, в соответствующих папках вы сможете запустить свое приложение следующей командой:

mvn install exec:exec -P micro

И никаких дополнительных плагинов для сервера приложений в IDE не требуется…

© Habrahabr.ru