乐趣区

关于springboot:springboot-war包部署

利用在共有云上的时候是打成 fatjar, 通过内嵌 tomcat 启动的. 在公有云上须要部署在一个过程中, 通过打成 war 包托管给 tomcat 启动.

1. 代码

首先, Application 启动类须要继承 SpringBootServletInitializer 并重写 configure 办法, sources 的入参为 Application.class.

2. pom

<packaging>${project.packaging}</packaging>

<profiles>
  <profile>
    <id>jar</id>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
      <project.packaging>jar</project.packaging>
    </properties>
  </profile>

  <profile>
    <id>war</id>
    <build>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.0</version>
        </plugin>
      </plugins>
    </build>
    <properties>
      <project.packaging>war</project.packaging>
    </properties>
    <dependencies>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
          <exclusion>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <groupId>org.springframework.boot</groupId>
          </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
      </dependency>
    </dependencies>
  </profile>
</profiles>

在 pom 文件中通过 profile 管制打包行为, -Pwar 时打成 war 包.

3. tomcat

tomcat10 因为 servlet 被募捐后包名改成了 jakarta, 须要升版本和批改依赖, 改变有点大, 因而抉择 tomcat9, 或者 tomcat8.

4. context

留神 war 包名字批改为了 ROOT, 默认状况下, 如果不是 ROOT, 那么 url 会带上该名字作为 context 进行路由, 例如本来的地址为 http://127.0.0.1:8080/test, 会变成 http://127.0.0.1:8080/app/test. 如果带上 context, 一些动态资源因为是绝对路径会找不到, 一些 filter 门路匹配也须要批改, 改变较大, 因而去除 context 躲避这些问题. tomcat 也反对通过批改 conf/server.xml 来去除 context, 这里简略起见采纳了重命名为 ROOT 的形式.
如果利用没有提供 http 服务, 或者应用的是相对路径, 配置上也通过 * 进行门路匹配, 那么就不须要重命名.

5. 多端口

但一个端口内只有一个利用能够不带 context, 如果多个利用都须要不带 context, 那么就须要通过端口进行路由.
批改 tomcat 的 conf/server.xml, 每个端口对应都增加一段如下配置, 留神 name 和 appBase 需不同, 这个配置 port 为 8081

<Service name="Catalina1">
    <Connector port="8081" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />
    <Engine defaultHost="localhost" name="Catalina1">
        <Host appBase="webapps1" autoDeploy="true" name="localhost" unpackWARs="true"/>
    </Engine>
</Service>

6. tomcat 启停

./bin/startup.sh

./bin/shutdown.sh

7. 其余

因为咱们的我的项目都自定义了日志打印, 所以能够去掉 tomcat 的日志打印, 批改 /bin/catalina.sh, 把 CATALINA_OUT 指向 /dev/null.

同样批改 /bin/catalina.sh, 往 JAVA_OPTS 中增加 skywalking 所须要的 agent 等命令, 然而因为多个我的项目被集成在一个过程中, 只能有一个名字. 近程 debug 同理.

JAVA_OPTS="$JAVA_OPTS -javaagent:/skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=app -Dskywalking.collector.backend_service=1127.0.0.1:11800"
退出移动版