文章目录

  • 1. 打成 jar 包
  • 2. 打成 war 包
  • 2.1 入口类继承SpringBootServletInitializer重写configure方法
  • 2.2 配置pom.xml文件
  • 2.3 IDEA生成war包
  • 2.4 部署环境配置tomcat运行项目
  • 2.5 配置Tomcat开机自启动(非必须,根据自己情况)
  • 3. Tomcat同时部署多个war包
  • 4. 警告 [main] org.apache.catalina.webresources.Cache.getResource 无法将位于[/WEB-INF/classes/static/layui/images/face/25.gif]的资源添加到Web应用程序[]的缓存中,因为在清除过期缓存条目后可用空间仍不足 - 请考虑增加缓存的最大空间。


1. 打成 jar 包

简单一步

直接使用IDEA的快捷方式>>install即可

一个springboot项目能有多个controller吗 springboot多个项目打成一个jar_java

这样就出来了两个包,我们只要.jar的即可

一个springboot项目能有多个controller吗 springboot多个项目打成一个jar_spring boot_02

那么.jar.original是什么?

该解释参考blog

一个springboot项目能有多个controller吗 springboot多个项目打成一个jar_tomcat_03

谷歌翻译: 您还应该在target目录中看到一个更小的文件myproject-0.0.1-SNAPSHOT.jar.original。这是Maven在Spring Boot重新打包之前创建的原始jar文件 。 (只包含少量用户的类,不包含依赖)

.jar.original 是普通jar包,不包含依赖
.jar 是可执行jar包,包含了pom中的所有依赖,可以直接用java -jar 命令执行
如果是部署,就用.jar
如果是给别的项目用,就要给.jar.original这个包

2. 打成 war 包

参考blog:

这里的部署环境已经准备好了JDK8+Tomcat9的环境

2.1 入口类继承SpringBootServletInitializer重写configure方法

如果要进行生产环境部署,需要单独配置一下Spring Boot 的入口类,需要继承SpringBootServletInitializer类,重写configure方法,因为默认情况外部Tomcat不能读取到Spring Boot 入口类的main方法启动程序加载,使用需要继承,代码如下:

package com.onemsg.hncj;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
/**
 * 启动类,程序入口
 */
@SpringBootApplication
public class DemoApplication extends SpringBootServletInitializer{
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    /**
     * 重写configure方法,加载启动类
     * @param application
     * @return
     */
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(DemoApplication.class);
    }
}

2.2 配置pom.xml文件

(1)先让IDEA知道你这次要配war包

<packaging>war</packaging>

(2) 需要排除一下内置tomcat的jar包,防止打包之后与外面Tomcat jar 包冲突,导致项目启动失败,配置如下

<!--排除内置tomcat jar包-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>

(3) 修改生成文件的文件名称,可以设置build下的finalName属性,代码如下

<build>
    <finalName>hncj-data-visualization</finalName>
</build>

2.3 IDEA生成war包

(1)Build>>Build Artifacts

一个springboot项目能有多个controller吗 springboot多个项目打成一个jar_java_04

(2)选中war>>Build

一个springboot项目能有多个controller吗 springboot多个项目打成一个jar_apache_05

出现下面就OK

一个springboot项目能有多个controller吗 springboot多个项目打成一个jar_spring boot_06

2.4 部署环境配置tomcat运行项目

(1)把war文件复制到tomcat的webapps目录下

(2)配置conf/server.xml

在Host标签内添加Context设置,docBase属性填写war文件名称,配置如下:

<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">    
    <Context path="" docBase="hncj-data-visualization" debug="0" privileged="true" reloadable="true" />
    <!--
    其他代码
    -->
</Host>

(3)启动Tomcat

Tomcat安装目录>>bin/startup.bat

浏览器输入localhost:8080/hncj-data-visualization(刚刚配的项目名)

到此jar包和war包都都打好了

2.5 配置Tomcat开机自启动(非必须,根据自己情况)

(1)进入tomcat安装目录/bin中,找到service.bat批处理文件

(2)打开cmd命令窗口,将service.bat文件拖动到cmd命令窗口中,接着输入空格 install tomcat9回车,进行服务安装。

(3)安装完成后,在windows服务中进行查看是否安装成功,也可以通过命令查看。

自启动的开启可以通过服务管理界面用鼠标完成,也可以用命令行

启动服务:net start 服务名

停止服务:net stop 服务名

服务自启:sc config 服务名 start=auto

禁用服务:sc config 服务名 start=disabled

3. Tomcat同时部署多个war包

注:鄙人不是运维相关专业技术人员,大佬勿喷,仅提供基本的学习和使用,欢迎指出不足

网上有很多种方法,很遗憾,在我这儿都不好用,总是出现冲突问题(可能是版本等一系列问题,不是这方面的技术人员,我也不太懂底层的原理,不过最终还是成功了),我这里依然还是Tomcat9+Jdk8的环境

开发环境和我一样的朋友可以参考blog最后的server.xml文件进行大致的部署(这里是两个war包)

我这里为了减少出错,直接一个项目一个端口

原来的server.xml默认给了一个Service(端口是8080,包存放位置是webapps),上面介绍war包部署的时候就是用的这个,我直接复制两份Service粘贴到了下面,下面说一下部署到localhost需要注意的配置

  1. service_name我没改,还是用的Catalina,为了区分开,最好改一下,例如Catalina1和Catalina2

一个springboot项目能有多个controller吗 springboot多个项目打成一个jar_tomcat_07

  1. 接下来我以其中一个为例讲一哈

(1)port。端口号修改,我这里第一个项目修改为8083
(2)host-name。默认是localhost,需要部署到外网的话需要修改,这里先不动
(3)host-appBase。默认是webapps,我这里为了区分开就另外新建项目文件夹叫hncjrygj

一个springboot项目能有多个controller吗 springboot多个项目打成一个jar_spring boot_08

(4)Context。和上面介绍war包部署的时候一样,配置一下docBase(war包名)就可以了

<Service name="Catalina">
      
      <!-- 1.端口号。我这里修改为8083 -->
    <Connector port="8083" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <Engine name="Catalina" defaultHost="localhost">
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>
        <!-- 2.host-name。默认是localhost,需要部署到外网的话需要修改,这里先不动 -->
        <!-- 3.host-appBase。默认是webapps,我这里为了区分开就另外新建项目文件夹叫hncjrygj -->
      <Host name="localhost"  appBase="hncjrygj"
            unpackWARs="true" autoDeploy="true">
        <!-- 4.Context。配置一下docBase(war包名)就可以了 -->
    <Context path="" docBase="hncj-data-visualization-rygj" debug="0" privileged="true" reloadable="true" />
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t "%r" %s %b" />
      </Host>
    </Engine>
  </Service>
  1. 接下来相信应该就可以比葫芦画瓢,想同时部署几个就部署几个了吧。。。
  2. 最后附上我的server.xml文件(仅供参考,请根据实际需求进行配置)
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
  <GlobalNamingResources>
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>

  <Service name="Catalina">
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <Engine name="Catalina" defaultHost="localhost">
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t "%r" %s %b" />
      </Host>
    </Engine>
  </Service>
    
  <Service name="Catalina">
    <Connector port="8084" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <Engine name="Catalina" defaultHost="localhost">
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>
        
      <Host name="localhost"  appBase="hncjmqjc"
            unpackWARs="true" autoDeploy="true">
    <Context path="" docBase="hncj-data-visualization-mqjc" debug="0" privileged="true" reloadable="true" />

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t "%r" %s %b" />
      </Host>
    </Engine>
  </Service>
    
  <Service name="Catalina">
    <Connector port="8083" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <Engine name="Catalina" defaultHost="localhost">
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>
        
      <Host name="localhost"  appBase="hncjrygj"
            unpackWARs="true" autoDeploy="true">
    <Context path="" docBase="hncj-data-visualization-rygj" debug="0" privileged="true" reloadable="true" />
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t "%r" %s %b" />
      </Host>
    </Engine>
  </Service>
</Server>

我这里配的是localhost,远程部署到学校数据中心的话修改一下对应的host就可以了

4. 警告 [main] org.apache.catalina.webresources.Cache.getResource 无法将位于[/WEB-INF/classes/static/layui/images/face/25.gif]的资源添加到Web应用程序[]的缓存中,因为在清除过期缓存条目后可用空间仍不足 - 请考虑增加缓存的最大空间。

部署的时候如果出现此错误

一个springboot项目能有多个controller吗 springboot多个项目打成一个jar_java_09

只用在../conf/context.xml里加一行

<Resources cachingAllowed="true" cacheMaxSize="1000000" />

即可

一个springboot项目能有多个controller吗 springboot多个项目打成一个jar_war包_10