天天看点

springBoot项目打war包,部署到外部tomcat;解决打包后resources下的文件全部丢失

2018-08-29  小赖   文档初始化
           
springBoot 带有内置Tomcat 服务器,可以直接将项目打包成jar运行,但是如果在需要把项目达成war包该怎么办呢?下面是将springboot项目部署为war项目的一些步骤

1. pom.xml中将打包形式jar修改为war

修改前:

修改后:

2. 移除原有内置Tomcat

将springboot内置的Tomcat依赖移除 ,需要注意的是,使用不同的模板引擎的时候,需要移除的依赖位置也不同,下面是原生的依赖和thymeleaf 模板引擎移除依赖的一些方法 (后面打包发现。 可以不需要在依赖中去除tomcat 依赖直接添加)。
# 原生Tomcat依赖移除
<dependency>
       <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
         <exclusions>
             <exclusion>
                   <groupId>org.springframework.boot</groupId>
                   <artifactId>spring-boot-starter-tomcat</artifactId>
           </exclusion>
      </exclusions> 
      </dependency>
       <dependency>
     <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
      <scope>provided</scope>
  </dependency>

# thymeleaf 模板引擎依赖移除
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-thymeleaf</artifactId>
      <exclusions>
          <exclusion>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-tomcat</artifactId>
          </exclusion>
      </exclusions>
  </dependency>
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
      <scope>provided</scope>
  </dependency>
           

添加的依赖:

<!--因配置外部TOMCAT 而配置-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>
<!--因配置外部TOMCAT 而配置-->
           

3. 设置打包后的项目访问名称

设置打包后的项目访问名称,在build节点里设置文件名

<finalName>ROOT</finalName>

(这里是一个特别需要注意的地方,由于开始的时候是使用的单模块程序,所以可以对项目命名,但是在多模块打包中发现,如果添加项目名称 这个结点。打包好的程序在tomcat中运行的时候会发生错误,war 包的目录格式有问题,建议finalName设置的名称 == artifactId名称)
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
    <finalName>ROOT</finalName>
</build>
           

4. 初始化 Spring 应用上下文

由于我们需要使用外部Tomcat服务器部署war包,所以不能使用创建项目的application.java 这个main方法了,需要重写一个类似于 web.xml 文件配置的方式来启动 Spring 应用上下文,此时我们需要声明一个类,这个类的作用与在 web.xml 中配置负责初始化 Spring 应用上下文的监听器作用类似。

我们平常用main方法启动的方式,都有一个App的启动类,代码如下:

@SpringBootApplication
public class BootWithActivitiApplication extends WebMvcConfigurerAdapter
{

    public static void main(String[] args) {
        SpringApplication.run(BootWithActivitiApplication.class, args);
    }
}
           

Application类的同级添加一个SpringBootStartApplication类,其代码如下:

public class SpringBootStartApplication extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        // 注意这里要指向原先用main方法执行的Application启动类
        return builder.sources(BootWithActivitiApplication.class);
    }
}
           

5. 部署

略。

基本上到这步就算是成功了,没有遇到下述问题可略过。

6.解决打包后resources下的文件全部丢失

打包后resources下的文件全部丢失,如下图所示:
springBoot项目打war包,部署到外部tomcat;解决打包后resources下的文件全部丢失
classes文件夹下只有com开头的class文件,resources中的配置文件、静态资源都没有打包进来。

解决办法:Application类上面的有注解@ComponentScan导致文件丢失,去掉此注解即可。(不一定只有这一个原因,其他原因还未发现。) 网上还有另一个造成此问题

修改前:

@SpringBootApplication
@ComponentScan({"org.activiti.rest.diagram","com.spcx.activiti"})
public class BootWithActivitiApplication extends WebMvcConfigurerAdapter{
}
           

修改后:

@SpringBootApplication
public class BootWithActivitiApplication extends WebMvcConfigurerAdapter{
}
           

继续阅读