Базовое развертывание

Убедитесь что файл build.gradle вашего проекта содержит следующий код:

vaadin {
    optimizeBundle = false
}

Он требуется для продакшн-сборки.

Создание исполняемого JAR

Откройте терминал в корневом каталоге проекта и выполните следующую команду:

./gradlew -Pvaadin.productionMode=true bootJar

Имя исполняемого JAR будет состоять из имени и версии вашего проекта. Например, если в settings.gradle указано следующее:

rootProject.name = 'myapp'

а в build.gradle:

group = 'com.company'
version = '0.0.1-SNAPSHOT'

то именем JAR будет myapp-0.0.1-SNAPSHOT.jar.

Исполняемый JAR-файл создается в папке /build/libs. Его можно скопировать в любое место и запустить следующим образом:

java -jar myapp-0.0.1-SNAPSHOT.jar

Если вы хотите настроить процесс упаковки или создать развертываемый WAR-файл, обратитесь к документации Spring Boot.

Создание образа Docker

Откройте терминал в корневом каталоге проекта и выполните следующую команду:

./gradlew -Pvaadin.productionMode=true bootBuildImage

По умолчанию созданный образ будет иметь имя вашего проекта и соответствующий версии проекта тег

Например, если в settings.gradle указано следующее:

rootProject.name = 'myapp'

а в build.gradle:

group = 'com.company'
version = '0.0.1-SNAPSHOT'

то созданным образом будет myapp:0.0.1-SNAPSHOT.

Если вы используете дополнение Grid Export Actions для экспорта в Excel, вам может понадобиться добавить следующую конфигурацию в build.gradle, чтобы образ содержал все необходимые шрифты:

tasks.named("bootBuildImage") {
    builder = "paketobuildpacks/builder-jammy-full"
}

Более подробная информация о создании образа и его настройке доступна в документации Spring Boot.

Развертывание WAR

Чтобы создать WAR-файл для развертывания на сервере приложения, выполните следующие действия:

  1. Убедитесь, что ваш основной класс приложения расширяет SpringBootServletInitializer, например:

    @SpringBootApplication
    public class MyApplication
            extends SpringBootServletInitializer
            implements AppShellConfigurator {
        // ...
    }
  2. Добавьте плагин war в раздел plugins вашего файла build.gradle:

    plugins {
        // ...
        id 'war'
    }
  3. Откройте терминал в корневом каталоге проекта и выполните следующую команду:

    ./gradlew -Pvaadin.productionMode=true bootWar

WAR-файл будет создан в папке /build/libs. Имя файла генерируется по описанному в предыдущем разделе принципу.

Для запуска приложений Jmix необходим как минимум Tomcat 10, так как начиная с Jmix 2.0 требуется поддержка Jakarta EE 9 (пространство имен jakarta.*). Подробности см. в документации Tomcat.

Использование источника данных JNDI

При развертывании приложения в WAR вы можете использовать предоставляемый сервером приложений источник данных JNDI для выноса из приложения настроек подключения.

Ниже представлена настройка основного DataSource приложения для сред разработки и производственных сред с помощью функции профилей Spring.

  1. В основном классе приложения добавьте аннотацию @Profile("!prod") к методам dataSourceProperties и dataSource, чтобы удостовериться, что эти бины создаются только в среде разработки:

    @Profile("!prod")
    @Bean
    @Primary
    @ConfigurationProperties("main.datasource")
    DataSourceProperties dataSourceProperties() {
        return new DataSourceProperties();
    }
    
    @Profile("!prod")
    @Bean
    @Primary
    @ConfigurationProperties("main.datasource.hikari")
    DataSource dataSource(DataSourceProperties dataSourceProperties) {
        return dataSourceProperties.initializeDataSourceBuilder().build();
    }
  2. Добавьте метод, создающий бин DataSource для производственной среды:

    @Profile("prod")
    @Bean(name = "dataSource")
    @Primary
    DataSource prodDataSource(ApplicationContext context) {
        JndiDataSourceLookup lookup = new JndiDataSourceLookup();
        DataSource dataSource = lookup.getDataSource("java:comp/env/jdbc/demo"); (1)
    
        // to avoid org.springframework.jmx.export.UnableToRegisterMBeanException:
        for (MBeanExporter mbeanExporter : context.getBeansOfType(MBeanExporter.class).values()) {
            if (JmxUtils.isMBean(((Object) dataSource).getClass())) {
                mbeanExporter.addExcludedBean("dataSource");
            }
        }
    
        return dataSource;
    }
    1 JNDI-имя источника данных, предоставляемого сервером приложения.
  3. При запуске сервера приложений установите для активного профиля значение prod в свойстве приложения spring.profiles.active.

Ниже приведен пример конфигурации Tomcat для развертывания приложения demo.war.

  1. Скопируйте demo.war в папку tomcat/webapps.

  2. Создайте файл tomcat/bin/setenv.sh со следующим содержимым:

    CATALINA_OPTS="-Dspring.profiles.active=prod"
  3. Создайте файл tomcat/conf/Catalina/localhost/demo.xml, определяющий источник данных, и установите соответствующие параметры подключения к БД (имя XML-файла должно совпадать с именем WAR):

    <Context>
        <Resource type="javax.sql.DataSource"
                  name="jdbc/demo"
                  driverClassName="org.postgresql.Driver"
                  url="jdbc:postgresql://localhost/demo"
                  username="root"
                  password="root"
                  maxIdle="2"
                  maxTotal="20"
                  maxWaitMillis="5000"
        />
    </Context>

    Обратите внимание, что атрибут name элемента Resource определяет имя JNDI, используемое в методе JndiDataSourceLookup.getDataSource() при создании бина DataSource.

  4. Скопируйте соответствующий файл JDBC-драйвера (например, `postgresql-42.2.9.jar) в tomcat/lib.

При запуске Tomcat приложение будет использовать источник данных, определенный в файле tomcat/conf/Catalina/localhost/demo.xml.