springboot+vue项目在国产机东方通部署详细教程!
一、部署东方通TongWeb
-
上传安装包:TongWeb7.0.4.9_Enterprise_Linux.tar.gz
-
解压:tar -xvf TongWeb7.0.4.9_Enterprise_Linux.tar.gz
-
证书:提供的license 文件是企业版的,企业版支持以 war 包方式部署应用。 解压后,将license.dat 放在安装的根目录下
-
进入bin目录启动:./startserverbg.sh
-
访问页面:http://ip:9060/console
ps:默认账号密码thanos/thanos123.com,首次登陆需要修改账号密码
二、部署TongHttpServer
ps1:TongHttpServer实际上就是nginx在国产机上的替代品,除了名字意外,其他的原理跟nginx是一样的
pa2:nginx也可以直接部署在国产机上,且操作比部署linux上简单。即不需要安装gcc等插件,直接下载,解压,安装,编译即可!详情可见https://blog.csdn.net/weixin_40496191/article/details/121028500
-
由于我是拿linux验证的,国产机其实也差不多,我这里使用的安装包是:TongHttpServer_6.0.0.2_x86_64.tar.gz
-
解压:tar -xvf TongHttpServer_6.0.0.2_x86_64.tar.gz
-
将证书文件license.dat拷贝到TongHttpServer的解压文件夹里面
-
在THS/bin目录下,执行命令查看license信息:./start.sh -l
-
启动指令:./start.sh
-
停止指令:./start.sh stop
-
配置文件:/TongHttpServer/THS/conf/httpserver.conf
-
使用:跟nginx的使用方法一样。相关反向代理直接在httpserver.conf,然后重启TongHttpServer即可!
三、springboot多模块后端打包
-
需要改的配置
1)主要启动模块pom文件添加配置
<packaging>war</packaging>
2)启动类添加SpringApplicationBuilder方法
@Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(WebApplication.class); }
剩下的就是解决bug
-
遇到的坑1:在filter过滤器引入变量的时候,使用@Value导致引入的变量都为null
ps:所有的filter类有涉及@Value的都要改,因为东方通中,filter加载在spring之前,都需要改成静态加载方式才能够读取到
public static String whiteUrl; @Value("${FormXssFilter.url}") public void setWhiteUrl(String whiteUrl) { FormXssFilter.whiteUrl=whiteUrl; }
-
遇到的坑2:遇到ZonedDate转换错误的,需要加下以下这个类
package com.ffcs.biyiict.config; import java.sql.*; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.convert.converter.Converter; /** * String转ZonedDateTime,解决时间条件查询格式转换问题 * @author lym * */ @Configuration public class ZonedDateTimeConverter extends BaseTypeHandler<ZonedDateTime> { private static final Logger log = LoggerFactory.getLogger(ZonedDateTimeConverter.class); @Bean public Converter<String, ZonedDateTime> zonedDateTimeConvert() { return new Converter<String, ZonedDateTime>() { @Override public ZonedDateTime convert(String source) { /*根据需要修改时间格式与时区*/ DateTimeFormatter df = DateTimeFormatter .ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.systemDefault()); ZonedDateTime date = null; try { date = ZonedDateTime.parse(source, df).withZoneSameInstant(ZoneId.of("UTC")); } catch (Exception e) { log.error("can not convert ZonedDateTime to Date",e.getMessage()); } return date; } }; } @Override public void setNonNullParameter(PreparedStatement ps, int i, ZonedDateTime parameter, JdbcType jdbcType) throws SQLException { // 将 ZonedDateTime 转换为适当的数据库类型并设置参数 ps.setObject(i, parameter.toLocalDateTime()); } @Override public ZonedDateTime getNullableResult(ResultSet rs, String columnName) throws SQLException { // 从结果集中获取适当的数据库类型并转换为 ZonedDateTime Timestamp value = rs.getTimestamp(columnName); return value != null ? value.toLocalDateTime().atZone(ZoneId.systemDefault()) : null; } @Override public ZonedDateTime getNullableResult(ResultSet rs, int columnIndex) throws SQLException { Timestamp value = rs.getTimestamp(columnIndex); return value != null ? value.toLocalDateTime().atZone(ZoneId.systemDefault()) : null; } @Override public ZonedDateTime getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { Timestamp value = cs.getTimestamp(columnIndex); return value != null ? value.toLocalDateTime().atZone(ZoneId.systemDefault()) : null; } }
-
遇到的坑3:报错:Caused by:com.mysq1.cj . jdbc.exceptions ,Mysq1DataTruncation: Data truncation: Incorrect datetime value:‘ox. xDNxz0lxl5sr ox1.xlIjava. tiom …erlx2E5] oxe4 xEBA ×xl5 1YxBE2 xlNC x1.xoxpwkxl xlb6 xOlx0xO7xEElx09.xO1x7x03-0fFxlO \x’ for colu…
ps:若是应用用到的库是 mysql 的,需要更改驱动的版本才用正常运行,原先的版本是8.0.22,改成8.0.30
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.30</version> </dependency>
-
遇到的坑4:由于是多模块的,我的system模块重写了jar代码,主模块引入了system模块。发现,以jar的方式引入system模块,会导致重写的类失效
1)修改system的pom,改成war打包方式,避免重写类无效
<packaging>war</packaging>
2)非server模块的其他模块,有引用system模块的,统一加上provided,这样子打包的时候就不会打包system模块
<dependency> <groupId>com.xx.xx</groupId> <artifactId>system</artifactId> <version>1.0.0</version> <scope>provided</scope> </dependency>
3)修改主模块引入system的方式
<dependency> <groupId>com.xx.xx</groupId> <artifactId>system</artifactId> <version>1.0.0</version> <type>war</type> <exclusions> <exclusion> <groupId>*</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency> <!-- 添加 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <configuration> <overlays> <overlay> <groupId>com.xx.xx</groupId> <artifactId>system</artifactId> </overlay> </overlays> </configuration> </plugin>
4)打包的时候,system模块需要先install打一个jar包在target,再install打一个war包到target下,否则有可能报错类找不到
5)然后全局package即可
6)如果还是不行,可能是idea缓存问题,删除.dea文件,重新加载项目
-
遇到的坑5:项目里面的非pom管理的jar包,无法读取,需要在主模块的pom加上以下这串
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy-dependencies</id> <phase>compile</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <includeScope>system</includeScope> <outputDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/lib</outputDirectory> </configuration> </execution> </executions> </plugin>
-
遇到的坑6:存在一些写法,比如public static String xxx= env.getProperty(“xxx”);这种写法可能在java -jar启动的时候正常,但是放在东方通导致null。
因为放入东方通后,spring的加载顺序发生了一些变化。导致env可能获取不到,所以触发了异常。这种情况有两种解决办法
1)使用@value+static静态化加载yml环境变量参数
2)如果只是暂时部署,最差的方法可以写死变量!
注:如果是非yml配置文件参数,可以直接使用final修饰,这样子在编译成class文件时,就自动赋值变量了。 -
报错Request header is too large
原因:springboot项目里面可能已经设置了max-http-header-size,并且没有报错,但是部署到东方通却报错了。这是因为我们springboot设置的这个参数是针对于springboot内置tomcat的,部署到东方通后将不再使用内置的tomcat,所以无效。
正确的做法是在东方通界面上的"虚拟主机管理"和"HTTP通道管理"都配置以下两个参数即可
maxPostSize -1 maxHttpHeaderSize 102400
四、vue前端打包(TongWeb部署)
ps:这种打包方式是针对于TongWeb部署的,如果是nginx或者TongHttpServer部署,跟普通服务器部署方式一样,打个dist包上传解压即可!
-
npm run build 得到 dist
-
dist 文件夹里面,添加文件夹和文件
1)创建文件夹:WEB-INBF
2)进入WEB-INBF创建文件rewrite.config
RewriteRule ^/index\.html$ - [L] RewriteCond %{REQUEST_PATH} !-f RewriteRule (.*) /index.html [L]
-
进入 dist,打开 cmd,运行 jar -cvf dist.war * 得到 dist.war
-
前端一般不会遇到什么bug,直接将dist.war部署上去即可
五、TongWeb部署(前后端一样)
-
参数设置
ps:这里的参数是部署到当前东方通的所有项目共用,可酌情修改,也可以不动
-
创建主机
ps:建议一个应用一个主机,便于区分,参数酌情填写即可
-
创建HTTP通道管理
然后一直下一步,参数自己看着修改,直到最后一步
创建完毕后,需要再重新修改
根据自己项目实际情况进行勾选,然后保存即可!
-
设置服务器文件路径
ps:主要是为了部署项目的时候,文件可以直接从服务器指定路径进行勾选
-
部署项目
1)上传文件,选择服务器的话就默认从上一步选择的路径里面,选择底下的文件)
2)设置前缀
3)选择主机
4)完成
-
部署结束后,直接使用刚刚设置的端口进行测试访问即可!!!