先,已经有现成的打包成jar的spring boot项目。
我们既然想使用外部servlet容器,那就需要移除SpringBoot的内置tomcat。在pom.xml中添加如下内容:
<!--这里修改了内置Tomcat的作用域-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
scope的可选值以及介绍:
compile:默认就是compile,什么都不配置也就是意味着compile。compile表示被依赖项目需要参与当前项目的编译,当然后续的测试,运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去。
test:scope为test表示依赖项目仅仅参与测试相关的工作,包括测试代码的编译,执行。比较典型的如junit。
runtime:runntime表示被依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。与compile相比,跳过编译而已,说实话在终端的项目(非开源,企业内部系统)中,和compile区别不是很大。比较常见的如JSR×××的实现,对应的API jar是compile的,具体实现是runtime的,compile只需要知道接口就足够了。Oracle jdbc驱动架包就是一个很好的例子,一般scope为runntime。另外runntime的依赖通常和optional搭配使用,optional为true。我可以用A实现,也可以用B实现。
provided:provided意味着打包的时候可以不用包进去,别的设施(Web Container)会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。相当于compile,但是在打包阶段做了exclude的动作。
system:从参与度来说,与provided相同,不过被依赖项不会从maven仓库抓,而是从本地文件系统拿,一定需要配合systemPath属性使用。
/**
* 修改启动类,继承 SpringBootServletInitializer 并重写 configure 方法
*/
public class SpringBootStartApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
// 注意这里要指向原先用main方法执行的Application启动类
return builder.sources([启动类].class);
}
}
当项目打包设置成war后,项目的文件结构还不是我们预期的,缺少WEB-INF,webapp等,有两个方法补齐,一手动创建目录二配置idea自动创建。这里采用第二种。
打开project structure
整体目录结构如下:
启动tomcat,测试一下吧。正常情况下应该是浏览器自动跳转到index.html页面了。
事问了,打成war不能执行,报错,找了好久找不到原因,今天自己也碰到这个问题,一样的。
原因是servlet关联没有,二是启动时调用原始的启动类
解决方案如下:
pom.xml
1、打war
<packaging>war</packaging>
2、去掉关联,可选步骤
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 移除嵌入式tomcat插件 -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
3、添加servlet-api的依赖(下面任一)
<!--要放到tomcat中运行,war的方式,加这个,否则不用加-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-servlet-api</artifactId>
<version>8.0.36</version>
<scope>provided</scope>
</dependency>
4、增加启动再调用原始的main类
若原始的启动类是:AdminApplication,那么在同包中,增加如下的文件
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
/**
* 增加这个类,修改启动类,继承 SpringBootServletInitializer 并重写 configure 方法
*/
public class SpringBootStartApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
// 注意这里要指向原先用main方法执行的Application启动类
return builder.sources(AdminApplication.class);
}
}
或者启动类改成
项目需要将前端部署到tangweb7.0,所以需要将vue前端打包成war包,可以进行如下操作:
1、先生成dist,命令行cmd中切换到项目目录下(cd 项目文件夹),运行命令: npm run build
2、生成完成后在cmd中再切到dist目录下,运行命令:jar -cvf dist.war *,打包完成
3、tangweb7.0 部署完成后报404,还没有解决。。。
如图所示,如果哪位有遇到过此类问题,可以告诉我一下,多谢。
截图2主要提示内容:we're sorry but xxx doesn't work properly without javascript enabled. please enabled it to conitnue 。已百度查过相关问题,加了web.xml文件,然后再打包还是此问题,所以怀疑是哪里配置的不对,或者打包是不是需要做什么修改调整。
ps:如果有其他信创的web容器也可以推荐一下,最好是免费的或者是费用低的。
*请认真填写需求信息,我们会在24小时内与您取得联系。