SpringBoot打包成war包

    最近有个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);

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容