Springboot 进行war包部署,以及踩坑历险!!!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Springboot 进行war包部署,以及踩坑历险!!!相关的知识,希望对你有一定的参考价值。

参考技术A 使用springboot也很长时间了,一直都是使用内置Tomcat运行项目,最近由于公司架构需要将项目以war包形式发布封装组件,又不想把自己多天的成功重新用spring造一遍,遂有了将springboot打成war包的想法。参考网上各种方法,自己也在坑里挣扎了许久。脱坑后总结一下,供大家参考,也给自己提醒。
首先需要一个能成功运行的springboot项目,这里不在重新搭建,直接用已知项目作为更改。

springboot默认是使用内部Tomcat启动,如果使用外部Tomcat的话同样存在一个入口的问题,这里我们只需要将启动类继承SpringBootServletInitialize告诉外部Tomcat在这个类下启动(注解并不需要这么多,这里只是为了学习和记录,大家可以参考参考)。

首先我们需要将springboot打包方式更改为war

springboot 内置了Tomcat,为了防止Java包冲突我们需要排除springboot默认Tomcat依赖,然而Tomcat启动有需要一些sevlet或者el等类去编译,因此还需要依赖spring-boot-starter-tomcat,当然这里的作用域需要设置为provided

接着是添加maven插件

pom文件修改就到这里。

不知道你们是否正常启动,如果有问题继续看看我踩的坑

1.启动后无法正常访问
在cmd里面查看我springboot配置的端口8084,使用netstat -ano|findstr "8084",没有找到相关进程。
同样查看Tomcat配置的端口8087,使用
netstat -ano|findstr "8084",看到端口以及被监听,根据进程号可以查看和kill端口。
注意:在application.properties里面配置的端口是springboot内部端口,同外部Tomcat启动的话端口并不是 application.properties的配置端口,而是外部Tomcat所配置的端口。
2.端口问题解决后还是没法访问,于是若若的看了一下Tomcat日志,报错了。。。堆栈日志我就不贴了,告诉大家出现这样的报错
Caused by: java.lang.NoClassDefFoundError: javax/el/ELManager 。什么?我不是已经加入spring-boot-starter-tomcat 相关依赖了吗?这个问题我苦苦在坑里待好几天,终于在网上找到了答案。原因是我的tomcat7提供的el-api 和项目里面的el-api.jar冲突,解决办法也很简单,就是将你IDE(IDEA 或eclipse)安装目录下的el-api.jar 替换Tomcat的lib目录下的el-api.jar 或者使用Tomcat8 即可解决问题。
暂时就这么多,终于可以helloword了,如果大家还有什么坑可以贴出来一起交流交流。

springboot打war包部署tomcat服务器,以及表单提交数据乱码处理

  小白觉得springboot打成jar包直接使用内嵌的tomcat或jetty容器(java -jar xxx.jar)运行项目不利于定位问题,我还是习惯于查看tomcat或nginx的日志来定位问题,今天小白就讲讲springboot打成war部署JavaWeb项目于tomcat。

新建web项目 helloboot

开发工具:Spring Tool Suite(STS)

File->New->Spring Starter Project,如下图所示:


项目结构如下所示:

application.properties配置:

server.port=8082
server.context-path=/helloboot

spring.devtools.restart.additional-exclude=non-restart/**
spring.resources.static-locations=classpath:/resources/static/,classpath:/static/
spring.thymeleaf.cache=false

logging.level.org.springframework.security=INFO

pox.xml(自动生成的,未作修改):

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>helloboot</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.13.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

项目打包

1)在项目的启动类HellobootApplication.java的同级目录下新建ServletInitializer.java,代码如下,其位置可参考项目结构图:

package com.example.demo;

import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;

public class ServletInitializer extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(HellobootApplication.class);
    }

}

2)用maven进行打包:Run AS -> Maven install,如下图所示打包成功,会在target目录下生成demo-0.0.1-SNAPSHOT.war

项目部署

进入tomcat的webapps子目录上传,上传完成后重命名为helloboot.war:

cd /root/tomcat/webapps
rz
mv demo-0.0.1-SNAPSHOT.war helloboot.war

修改tomcat的配置文件server.xml文件将8080端口改为8082,当然8080端口也是可以,由于本服务的8080端口已被占用。

进入tomcat的bin目录,启动tomcat:

cd /root/tomcat/bin
sh startup.sh

查看tomcat的日志:

cd /root/tomcat/logs
tail -f catalina.out

从日志可以看出启动成功:

项目访问

访问内网,可以通过xshell的通道访问:

 在浏览器地址栏中输入:http://127.0.0.1:8082/helloboot/index,可见项目打包发布成功。

乱码处理

  今天小白在测试demo是发现通过表单提交的数据乱码,原因可能有两种,一种前端提交到后台的数据后台解析乱码,另一种是解析正常但是在写入数据库的时候由于数据库编码导致的乱码。小白就这两种情况进行测试,第一种情况通过日志发现打印出来的前端传到后台的数据正常,于是小白查看了mysql数据库的编码,如下所示:

mysql> show variables like \'character_set_database\';
+------------------------+--------+
| Variable_name          | Value  |
+------------------------+--------+
| character_set_database | latin1 |
+------------------------+--------+
1 row in set (0.01 sec)

收集资料尝试发现只要在mysql的my.cnf的中添加一行代码character-set-server=utf8,重新启动mysql即可

[root@localhost etc]# vi /etc/my.cnf
[root@localhost etc]# service mysqld restart
my.cnf
[root@localhost etc]# cat /etc/my.cnf
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html

[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

character-set-server=utf8

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

修改后的mysql数据库的编码,表单提交数据也正常了。

mysql> show variables like \'character_set_database\';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| character_set_database | utf8  |
+------------------------+-------+
1 row in set (0.06 sec)

以上是关于Springboot 进行war包部署,以及踩坑历险!!!的主要内容,如果未能解决你的问题,请参考以下文章

springboot打war包部署tomcat服务器,以及表单提交数据乱码处理

springboot项目打war包,并部署到tomcat

springboot打war包

springboot发布war包部署

SpringBoot简单打包部署(附工程)

Docker打包Springboot项目war包镜像并部署