一灰灰blog 一灰灰blog
首页
  • InfluxDB
  • MongoDB
  • MySql
  • 基础系列
  • DB系列
  • 搜索系列
  • MQ系列
  • WEB系列
  • 中间件
  • 运维
  • SpringSecurity
  • SpringCloud
  • QuickAlarm
  • QuickCrawer
  • QuickFix
  • QuickMedia
  • QuickSpi
  • QuickTask
  • 高可用
  • 分类
  • 标签
  • 归档
  • 收藏
  • 关于
GitHub (opens new window)

一灰灰blog

资深搬运工
首页
  • InfluxDB
  • MongoDB
  • MySql
  • 基础系列
  • DB系列
  • 搜索系列
  • MQ系列
  • WEB系列
  • 中间件
  • 运维
  • SpringSecurity
  • SpringCloud
  • QuickAlarm
  • QuickCrawer
  • QuickFix
  • QuickMedia
  • QuickSpi
  • QuickTask
  • 高可用
  • 分类
  • 标签
  • 归档
  • 收藏
  • 关于
GitHub (opens new window)
  • 基础系列

  • DB系列

  • 搜索系列

  • MQ系列

  • WEB系列

    • Request

    • Response

    • RestTemplate

    • WebClient

    • WebFlux

    • WebSocket

    • Web三剑客

    • 实例

    • 其他

      • 【WEB系列】SpringBoot文件上传异常之提示The temporary upload location xxx is not valid(填坑篇)
      • 【WEB系列】RestTemplate之urlencode参数解析异常全程分析(填坑篇)
      • 【WEB系列】中文乱码问题解决(填坑篇)
      • 【WEB系列】整合resin容器
        • I. 环境准备
          • 1. resin安装
          • 1.1 下载安装
          • 1.2 IDEA配置
          • 1.3 SpringBoot项目配置
        • II. 项目整合
          • 1. 启动类
          • 2. rest接口
          • 3. 启动测试
        • II. 其他
          • 0. 项目
          • 1. 一灰灰Blog
      • 【WEB系列】内嵌Tomcat配置Accesslog日志文件生成位置源码探索
  • 中间件

  • 运维

  • SpringSecurity

  • SpringCloud

  • Spring系列
  • WEB系列
  • 其他
一灰灰
2021-01-26

【WEB系列】整合resin容器

SpringBoot项目搭建web项目很快,内嵌了tomcat容器,一般来讲直接jar包跑就行了,当然也可以打成war包放到其他的容器中执行。

本文将介绍一下SpringBoot整合resin容器的全过程,包括resin配置,jar包冲突,class not found,中文乱码等各种配置问题解疑

内心os: tomcat不香嘛,为啥要搞个resin出来,对此我也不知道怎么回答,前人就这么玩的,我还能怎么办,只能选择接受... (这东西真是的有点蛋疼)

# I. 环境准备

# 1. resin安装

# 1.1 下载安装

首先需要下载resin包,进入官网: http://www.caucho.com/download/ (opens new window)

选择一个zip包下载到本地,移动到目的地,解压即可,注意这个地址,后续会用到

比如我本机存放地址为 /Users/user/Project/Tool/resin-4.0.61

# 1.2 IDEA配置

idea首先安装插件

其次进行编译环境配置,选择Edit Configuration

接下来在配置页,依次操作

  • 点击 +
  • 输入 resin
  • 选择 Local

然后按照下图配置

注意:URL这里与你的实际项目有关,后面会说明

还没完,接下来指定发布方式

  • 点击 Deployment
  • 点击 +
  • 选择 Arifact...
  • 选中你的项目

最后确定保存之后,本地项目部署到resin运行基本完成

# 1.3 SpringBoot项目配置

本文实例中springboot版本为 2.2.1.RELEASE

因为我们使用resin容器进行部署,所以会很容易想到将tomcat依赖排除掉(当然不仅于此,后文会深入说明)

<!-- 指定项目打成war包 -->
<packaging>war</packaging>


<dependencies>
  <!-- 核心的web依赖 -->
  <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>
</dependencies>

<build>
    <!-- 指定war包名,注意前面配置resin的url中的一级路径,就是它(和tomcat的方式差不多) -->
    <finalName>230-web-resin</finalName>
</build>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# II. 项目整合

# 1. 启动类

启动类,继承自SpringBootServletInitialzer,因为我们的项目以war包形式在web容器中运行(这一点需要注意,和之前的Spring系列中的启动类有一点区别)

@SpringBootApplication
public class Application extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(Application.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
1
2
3
4
5
6
7
8
9
10
11

# 2. rest接口

写两个简单的rest接口,一个返回html文件,一个返回String

@Controller
public class IndexController {

    @GetMapping(path = {"", "/", "/index"})
    public String index() {
        return "index.html";
    }

    @GetMapping(path = "hello")
    @ResponseBody
    public String hello(String name) {
        return "hello " + name;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

在资源路径 resources/static/ 下添加html文件index.html

<html>
<head>
    <meta charset="utf-8">
</head>

<h1> 欢迎欢迎 </h1>

<bold>hello world</bold>

</html>
1
2
3
4
5
6
7
8
9
10

# 3. 启动测试

请注意,这时的启动,不是在main方法上邮件运行,而是借助前面配置的resin,来运行

# 3.1 ServletException

启动的第一个异常,Error:(13, 8) java: 无法访问javax.servlet.ServletException 找不到javax.servlet.ServletException的类文件

将tomcat排除掉之后,没有Servlet依赖,在编译打包层就会失败,所以需要添加依赖,这里指定了作用域<scope>provided</scope>

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <scope>provided</scope>
</dependency>
1
2
3
4
5

# 3.2 java.lang.NoSuchMethodError: javax.validation.Configuration.getDefaultParameterNameProvider

jar包冲突,如下图,提示有两个validation-api, 在项目中我们自己依赖的是jakarta.validation-api-2.0.1,但是实际采用的是resin的validation-api-1.0.0.GA.jar

出现这个问题,主要就是因为resin自己也提供了一个validation-api包,但是又不满足我们的需求,所以最好的方法就是用我们需要的版本覆盖掉它的

替换validation-api

  • 将项目依赖的api jar包,拷贝到resin目录下的lib下
  • 本项目中,将resin中validation-api-1.0.0.GA.jar干掉,复制进去validation-api-2.0.1.Final.jar

替换webapp-jars

除了api之外,还有两个也需要配套修改,在resin/webapp-jars中,有两个jar包,一个是hibernate-validator, 一个是jboss-logging

  • 本项目中,覆盖之后两个版本分别是
  • hibernate-validator-6.0.18.Final.jar
  • jboss-logging-3.4.1.Final.jar

说明

上面说要将我们用到的jar替换resin的,那么如何找到我们希望的jar包呢?

进入 resin/webapps/{项目名}/WEB-INF/lib,里面有你的项目所有依赖的jar包,就可以找到你所需要的jar包了

其次如果只替换validation-api而不替换webapp-jars下的jar包,可能导致明明版本也是对的,但是就是起不来的情况,这种原因多半是api与实现hibernate-validator没有对上导致的,所以要替换就替换完整

pom修改

上面改外之后,还需要记得修改一下pom配置文件

<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>
        <exclusion>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
        </exclusion>
    </exclusions>
</dependency>
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 3.3 java.lang.NoClassDefFoundError: javax/el/ELManager

再次运行,又提示了一个NoClassDefFoundError,手动加上

<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>jakarta.el</artifactId>
</dependency>
1
2
3
4

# 3.4 中文乱码及小结

启动过程中,可能会遇到各种jar包冲突,缺失,一个简单的原则就是什么冲突干掉什么,缺什么加什么,一直到启动成功为止

正常启动之后,会自动弹出一个网页

出现上面的中文乱码时,可以在配置文件中,强制指定utf-8, 如 application.yml

spring:
  http:
    encoding:
      force: true
      charset: utf-8
      enabled: true
1
2
3
4
5
6

本文中对应的项目实例可以在下面获取

# II. 其他

# 0. 项目

  • 工程:https://github.com/liuyueyi/spring-boot-demo (opens new window)
  • 源码:https://github.com/liuyueyi/spring-boot-demo/tree/master/spring-boot/230-web-resin (opens new window)

# 1. 一灰灰Blog

尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

下面一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

  • 一灰灰Blog个人博客 https://blog.hhui.top (opens new window)
  • 一灰灰Blog-Spring专题博客 http://spring.hhui.top (opens new window)

一灰灰blog

编辑 (opens new window)
#Resin
上次更新: 2021/10/15, 19:56:22
【WEB系列】中文乱码问题解决(填坑篇)
【WEB系列】内嵌Tomcat配置Accesslog日志文件生成位置源码探索

← 【WEB系列】中文乱码问题解决(填坑篇) 【WEB系列】内嵌Tomcat配置Accesslog日志文件生成位置源码探索→

最近更新
01
【基础系列】基于maven多环境配置
04-25
02
【WEB系列】内嵌Tomcat配置Accesslog日志文件生成位置源码探索
04-24
03
【搜索系列】ES查询常用实例演示
04-18
更多文章>
Theme by Vdoing | Copyright © 2017-2022 一灰灰Blog
MIT License | 鄂ICP备18017282号 |
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×