最近有个springboot项目需要发布一个对应的客户端js(给客户端网页引用,方便集成),作为客户端,这个js里需要在部署时指定服务端的地址,所以有两个方案:
1. springboot打成可执行jar,部署时解压jar包,修改客户端js,重新打包
2. 将此js放在一个tomcat里,那顺便把springboot项目也部署进去
由于只是听过springboot能打包成war,没实际操作过,所以选择方案2
配置SpringBootServletInitializer
@SpringBootApplication
@ComponentScan(basePackages= {"com.xxx"})
public class Application extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(Application.class);
}
}
依赖配置
目前使用的springboot版本是2.0.7.RELEASE
依据springboot的文档只需要配置denpendencies,从spring-boot-starter-web里将内置tomcat排除
dependencies{
implementation'org.springframework.boot:spring-boot-starter-web'
providedRuntime'org.springframework.boot:spring-boot-starter-tomcat'
}
为了使用providedRuntime配置,需要有war plugin,可参考gradle文档
plugins{
id'war'
}
Gradle配置
“providedRuntime”函数需要gradle5或6,公司目前统一使用的是Gradle打包,为避免不同项目干扰,推荐使用wrapper方式,每个项目可以指定自己的gradle版本,每次都用gradlew命令,因为之前使用的版本是4.x,就索性升级到了最新版
./gradlew wrapper--gradle-version6.2.2
打包命令
使用如下命令打包war,打包出来的结果还在build/libs/
./gradlew clean bootWar
使用如下命令打包可执行jar
./gradlew clean bootJar
前端相关
对于前后端分离的系统,前端发rest请求到后端时需要拼接url,当前方案有个问题就是当打包成war并部署在一个service的目录里时,访问所有资源的url都多了一段/service
比如原本http://localhost/abc/efg.html就会变成http://localhost/service/abc/efg.html,这样以war和以jar运行,前端拼接的url会有区别,解决办法就是
准备一个正则表达式用于切分url
var urlRegex=/([a-z]+\:\/+)([^\/\s]*)(\/[a-z0-9\-@\^=%&;~\+]*)([\.a-z0-9\-@\^=%&;\/~\+]*)[\?]?([^ \#]*)#?([^ \#]*)/i
解析结果为
0: "http://abc.com:90/abc/efg/hij.html?ddd=999&nnn=888"
1: "http://"
2: "abc.com:90"
3: "/abc"
4: "/efg/hij.html"
5: "ddd=999&nnn=888"
6: ""
获取当前页面的url,并切分,将tomcat里项目目录的名称拼接在正常后端的url前面
let tomcatFolder=location.href.match(urlRegex)[3];
这样不管以war还是jar,前端都能顺利拼装url调到后端接口了
@SpringBootApplication
@ComponentScan(basePackages= {"com.xxx"})
public class Application extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(Application.class);
}
}