跳到主要内容

宝兰德 AppServer 部署方案(SpringBoot3)

Version: 3.7+ 版本(SpringBoot 3.x)

JDK版本:17

后台采用 war 包的打包方案,部署到宝兰德 BES AppServer。

本文针对 SpringBoot 3 版本(jakarta.* 命名空间、JDK17)。BES AppServer 的 Web 容器必须为 jakarta(Servlet 5.0+)版本,部署前请确认。

一、后台 JeecgBoot 项目打 war 包

所有改动集中在以下几个文件。

1、修改 jeecg-system-start/pom.xml

<!-- 由 jar 改为 war -->
<packaging>war</packaging>

移除或注释 spring-boot-maven-plugin

<build>
<plugins>
<!--
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
-->
</plugins>
</build>

内嵌 Tomcat 设为 provided

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>

2、解决 Hibernate/JPA 冲突(关键)

BES 容器自带 Jakarta EE API(jakarta.persistence.*),部署 Spring Boot 3 war 时会自动触发 JPA 配置。WAR 中的 hibernate-core-5.6.7.Final.jar 实现的是 javax.persistence.* 命名空间,与容器提供的 jakarta.persistence.* 不兼容,导致 IncompatibleClassChangeError

达梦 JDBC 驱动 DmJdbcDriver18 不动,数据库连接不受影响。

jeecg-boot-base-core/pom.xml — DmDialect 排除 Hibernate 传递依赖(防止重复打包):

<dependency>
<groupId>com.dameng</groupId>
<artifactId>DmDialect-for-hibernate5.0</artifactId>
<version>${dm8.version}</version>
<exclusions>
<exclusion>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
</exclusion>
<exclusion>
<groupId>javax.persistence</groupId>
<artifactId>javax.persistence-api</artifactId>
</exclusion>
</exclusions>
</dependency>

JeecgSystemApplication.java — 禁用 JPA 自动配置:

import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;

@SpringBootApplication(exclude = {HibernateJpaAutoConfiguration.class})

JeecgBoot 使用 MyBatis-Plus,不需要 JPA。禁用 Hibernate JPA 自动配置后,hibernate-core jar 可正常加载供 flowable 使用,但不会触发 JPA 初始化,从而避开命名空间兼容问题。

依赖是否保留原因
hibernate-core-5.6.7.Final.jar✅ 保留flowable 等模块直接依赖 Hibernate 类
javax.persistence-api❌ 排除与 BES 的 jakarta.persistence 冲突
DmDialect-for-hibernate5.0.jar✅ 保留达梦方言类,排除的只是其传递依赖

3、注释 WebSocketConfig 中的 ServerEndpointExporter

打开 jeecg-boot-base/jeecg-boot-base-core 下的 org.jeecg.config.WebSocketConfig,注释掉:

// @Bean
// public ServerEndpointExporter serverEndpointExporter() {
// return new ServerEndpointExporter();
// }

二、生产配置 application-prod.yml

  • 本示例无项目请求前缀
spring:
profiles:
active: prod
datasource:
dynamic:
datasource:
master:
url: jdbc:mysql://<数据库IP>:3306/<库名>?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: <用户名>
password: <密码>
driver-class-name: com.mysql.cj.jdbc.Driver
data:
redis:
host: <redis 主机>
port: 6379
password: <密码>

jeecg:
path:
upload: /home/jeecg/upload
webapp: /home/jeecg/webapp
uploadType: local

SpringBoot 3 的 Redis 配置为 spring.data.redis.*(SpringBoot 2 为 spring.redis.*)。

三、执行打包

  • maven 勾选 prod profile

  • 按照顺序点击 cleaninstall

产物:jeecg-system-start/target/jeecg-system-start-{版本号}.war

四、BES AppServer 标准版安装

标准版仅一个 Java 进程,内存占用 ~1.5G,推荐 8G 以下内存服务器使用。企业版(DMS + Node + Instance 三进程)需要 12G+。

1、上传并解压

# 上传 bes11.0.1-standard-hd.zip 到 /opt
cd /opt
unzip bes11.0.1-standard-hd.zip -d bes11.0.1-standard-hd
cd bes11.0.1-standard-hd/bes11.0.1-standard-hd

2、修改配置(可选)

按需修改 config_install.cfg

# 控制台端口(默认 1901)
ADMIN_PORT="1901"
# 应用端口
APP_PORT="18081"

3、执行安装

chmod +x install_standard_11.0.1.sh
sh install_standard_11.0.1.sh

安装日志输出控制台地址(https://<IP>:1901/console)、用户名 admin、随机密码,请妥善保存。

4、修复外网访问(Host 头校验)

标准版默认开启 Host 头安全校验,只允许安装时绑定的 IP 访问。通过外网 IP 访问时会被拒绝(HTTP 400),必须添加 HostHeaderPreventionFilter 过滤器。

报错现象:

浏览器访问 https://<外网IP>:1901/console 显示空白页或 400 错误。

修复步骤:

vi /home/bes/BES11.1STD/lib/system/apps/console/WEB-INF/web.xml

找到 <!-- Http Header Security Filter --> 注释及其下方的 SecurityFilter 配置:

<!-- Http Header Security Filter -->
<filter>
<filter-name>SecurityFilter</filter-name>
<filter-class>com.bes.enterprise.webtier.filters.HttpHeaderSecurityFilter</filter-class>
<init-param>
<param-name>antiClickJackingOption</param-name>
<param-value>SAMEORIGIN</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SecurityFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

在 SecurityFilter 的 </filter-mapping> 之后<servlet> 之前插入:

<filter>
<filter-name>hostHeaderPreventionFilter</filter-name>
<filter-class>com.bes.enterprise.console.filter.HostHeaderPreventionFilter</filter-class>
<init-param>
<param-name>isCheckHost</param-name>
<param-value>false</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>hostHeaderPreventionFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

重启 BES 生效:

cd /home/bes/BES11.1STD/script && sh stopbes.sh && sh startbes.sh

验证:

# 服务器内 curl 测试
curl -k https://localhost:1901/console/
# 应返回控制台 HTML(HTTP 200),不再返回 400

5、安装后验证

ss -tlnp | grep -E '1901|18081'

控制台:https://<服务器IP>:1901/console

五、部署 war

WAR 包通常 300M+,通过控制台上传容易超时。建议先 SFTP 上传到服务器,再通过控制台本地文件部署。

1、上传 war 到服务器

# SFTP 上传到 /opt
/opt/jeecg-system-start-3.8.5.war

# 复制到 BES 仓库目录,控制台部署时可直接选择
cp /opt/jeecg-system-start-3.8.5.war /home/bes/BES11.1STD/repository/

2、通过控制台部署

  1. 进入「应用管理 → 常用应用」,点击「部署」

  1. 在文件选择器中直接选择仓库中的 war 文件(路径 /home/bes/BES11.1STD/repository/),无需再次上传;选中文件,点「下一步」

  1. 设置应用名称和应用前缀,设置成功之后点击「保存」

  1. 成功部署

六、访问系统

  • 部署完成后前段可通过 http://[服务器IP]:18081/[应用前缀] 访问。

  • 登录页面
  • 登录后首页

附录:常见问题

控制台上传 war 超时

原因:war 包较大(300M+),通过浏览器 HTTP 上传容易超时。

解决:先通过 SFTP 上传到服务器,再复制到 BES 仓库目录 /home/bes/BES11.1STD/repository/,控制台部署时直接选择本地文件。

浏览器访问控制台返回 400

原因:标准版 Host 头校验拦截了外网 IP。

解决:按本文"四、4"节添加 HostHeaderPreventionFilter 并重启。

控制台验证码不显示

原因:缺少字体依赖。

解决yum install -y fontconfig dejavu-sans-fonts,重启 BES。

Hibernate/JPA 冲突

IncompatibleClassChangeError: org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider
does not implement jakarta.persistence.spi.PersistenceProvider

原因:WAR 包含 Hibernate 5(javax 命名空间),BES 容器提供 Jakarta EE API,Spring Boot 3 的 JPA 自动配置无法兼容二者。

解决:按本文"一、2"节修改两处(base-core 排除传递依赖 + 启动类排除 JPA 自动配置),hibernate-core 本身保留在 WAR 中以确保 flowable 等模块正常运行。