IntelliJIDEASpringBoot使⽤第三⽅Tomcat以及部署花了半天时间终于成功,记录以备查阅。
⼀、第三⽅Tomcat部署
部署部分参考的是:
⽬标:把spring-boot项⽬按照平常的web项⽬⼀样发布到tomcat容器下
1. 修改打包形式
在l⾥设置 <packaging>war</packaging>
<groupId>com.study</groupId>
<artifactId>test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
2. 移除嵌⼊式tomcat插件
在l⾥到spring-boot-starter-web依赖节点,在其中添加如下代码:
<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的依赖
下⾯两种⽅式都可以,任选其⼀
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>at</groupId>
<artifactId>tomcat-servlet-api</artifactId>
<version>8.0.36</version>
<scope>provided</scope>
</dependency>
4. 修改启动类,并重写初始化⽅法
我们平常⽤main⽅法启动的⽅式,都有⼀个App的启动类,代码如下:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
直接让启动类继承SpringBootServletInitializer,并覆盖configure()⽅法:
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
// 注意这⾥要指向原先⽤main⽅法执⾏的Application启动类
return builder.sources(Application.class);
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
5. 打包部署
在项⽬根⽬录下(即包含l的⽬录),在命令⾏⾥输⼊:
mvn clean package即可,等待打包完成,出现[INFO] BUILD SUCCESS即为打包成功。
mvn clean package命令可以按需要添加参数,
-DskipTests 不执⾏测试⽤例,但编译测试⽤例类⽣成相应的class⽂件⾄target/test-classes下。
-Dspring.profiles.active=dev 如果配置了多环境,可以设置打包到哪个环境。
然后把target⽬录下的war包放到tomcat的webapps⽬录下,启动tomcat,即可⾃动解压部署。
最后在浏览器中输⼊
localhost:[端⼝号]/[打包项⽬名]/
发布成功
⼆、IntelliJ IDEA下使⽤第三⽅Tomcat运⾏项⽬
1. 完成部署中的1,2,3,4步骤
2. 配置第三⽅Tomcat
IDEA上⽅⼯具栏:Run->Edit Configurations
打开配置界⾯,左边"+"号->Tomcat Server->Local
完成后如下所⽰
然后在Deployment中点击"+"号,选择client:war,这样每次server启动的时候都会去打包⼀次war包(个⼈理解),然后去运⾏war包。
然后保存就可以了,然后启动项⽬就运⾏起来了。
三、部署中遇到的问题
1. log4j.properties中使⽤了环境变量
log4j.appender.dailyFile.File=${catalina.base}/logs/guandata/log.log4j
在启动第三⽅Tomcat时,Tomcat会去环境变量中寻叫CATALINA_HOME、CATALINA_BASE的环境变量,并将它们加⼊到Tomcat到系统变量中,这样我们就能在项⽬中使⽤它们了。
2. 部署后访问静态资源,访问路径URL中多了项⽬名,导致静态资源不到
举例:
原本在springboot内置Tomcat中运⾏项⽬,资源访问路径URL类似于:localhost:8080/css/bootstrap.min.css
但是打包部署到第三⽅Tomcat中,Tomcat默认会在路径中加上项⽬名,类似于:localhost:8080/myproject/css/bootstrap.min.css
这样就导致了访问不到静态资源 404
原因:
由于在前端引⽤资源时使⽤了绝对路径:
<link href="/css/bootstrap.min.css" rel="stylesheet">
解决:
1. 在Java后端定义⼀个,⽤来获取 ContextPath() 然后传到前端,ContextPath() 得到的是项⽬的根路径,具体参考:
1 @Component
2public class CommonIntercepter implements HandlerInterceptor {
3
4private final Logger logger = Class());
5
6 @Override
7public boolean preHandle(HttpServletRequest request,
8 HttpServletResponse response, Object handler) throws Exception {
9return true;
10 }
11
12 @Override
13public void postHandle(HttpServletRequest request,
14 HttpServletResponse response, Object handler,
15 ModelAndView modelAndView) throws Exception {
16 request.setAttribute("ctx", ContextPath());
17 request.setAttribute("version", DateTimeUtils.currentTimeMillis());
18 }
19
20 @Override
21public void afterCompletion(HttpServletRequest request,
22 HttpServletResponse response, Object handler, Exception ex)
23throws Exception {
24
25 }
26
27
log4j2xml配置28 }
2. 前端在静态资源访问url前加上${ctx!},注意我⽤的是freemarker模版
<link href="${ctx!}/css/bootstrap.min.css" rel="stylesheet">
<link href="${ctx!}/css/font-awesome.min.css" rel="stylesheet">
<link href="${ctx!}/css/plugins/bootstrap-table/bootstrap-table.min.css" rel="stylesheet">
<link href="${ctx!}/css/animate.css" rel="stylesheet">
<link href="${ctx!}/css/style.css" rel="stylesheet">
这样就能正确访问到静态资源啦。
3. 要注意给Tomcat/bin路径下的脚本权限,否则可能会出现不可预料的后果sudo chmod 777 /Library/Tomcat/apache-tomcat-9.0.10/bin/*.sh
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论