简单部署

请确保 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

如果使用 表格导出操作 扩展组件导出 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. build.gradle 文件中的 plugins 添加 war 插件:

    plugins {
        // ...
        id 'war'
    }
  3. 在项目的根目录打开命令行工具,执行以下命令:

    ./gradlew -Pvaadin.productionMode=true bootWar

WAR 文件创建在 /build/libs 文件夹中。文件名按照 前一节 中的描述生成。

从 Jmix 2.0 开始,部署应用需要 Tomcat 10 以上的版本,才能支持 Jakarta EE 9(jakarta.* 命名空间),参阅 Tomcat 文档

请使用最新的 Tomcat 10 部署 Jmix WAR。

使用 JNDI 数据源

将应用程序部署为 WAR 时,可以使用应用程序服务提供的 JNDI 数据源将连接设置交于外部管理。

下面示例展示如何使用 Spring 的 profiles 功能配置应用程序的开发环境和生产环境的主 DataSource

  1. 在你的主应用程序类中,将 @Profile("!prod") 注解添加到 dataSourcePropertiesdataSource 方法上,以确保这些 bean 仅在开发环境中创建:

    @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 bean 的方法:

    @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. 当运行应用程序服务器时,在 spring.profiles.active 应用程序属性中将启用的配置文件设置为 prod

下面是在 Tomcat 中部署 demo.war 应用程序并做配置的示例。

  1. 复制 demo.wartomcat/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>

    注意,Resource 元素的 name 属性定义 JNDI 名称,在创建 DataSource bean 时,由 JndiDataSourceLookup.getDataSource() 方法使用。

  4. 将合适的 JDBC 驱动程序文件(例如,postgresql-42.2.9.jar)复制到 tomcat/lib

启动 Tomcat 时,应用程序将使用 tomcat/conf/Catalina/localhost/demo.xml 文件中定义的数据源。