若依:用sqlite3随便掰饬掰饬
“若依”这个开源项目,感觉是外包公司标配了啊,都在用。从README感觉像是某位阿里员工的工作之余的小整理。对于SprintBoot,个人感觉太重型,不过人家生态起来了,不是那么容易玩完。但是随着VMware被博通收购,SpringFramework的走向还是不很明朗的。
今天我们就来试试这个高星项目的搭建。不太喜欢IDE,到了Java,我们也尽量避免吧,我们就用vim应该够了,也不写多少代码,就是纯搭建环境。只是手头没有mysql,也懒得去装mariadb了;自从用了proot,连docker这种重型工具都懒得用,image太占空间,runtime不是busybox的再给一套glibc没有意义;想到了轻量级数据库sqlite,那么就它了,用它把“若依”跑起来吧。
下载代码和工具
图个省事,我们先来看“若依”的单机版
https://gitee.com/y_project/RuoYi
git clone
应该都知道的,没有什么花头。看了下我的java
openjdk version "17.0.8.1" 2023-08-24
; mvn
呢,哦,这台虚拟机我连mvn都没有装…直接 sudo apt install maven
【坑1】
坑我们之后填;这样工具就齐全了,这样的java项目一般就是 mvn clean package
就好了吧。
更换数据库
“若依”这个项目模块化其实真的不太友好,比如强绑定mysql
。那就找到 application.yml
,然后溜达溜达,看看配置数据库的位置。只看到需要更正 pagehelper.helperDialect
到 sqlite
;另外就是 ruoyi.profile
位置可以更新下。
旁边那个 application-druid.yml
就是用了 druid
呗,数据库设置多数在这里了。注释掉
## 主库数据源#master:# url: jdbc:mysql://localhost:3306/ry?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8# username: root# password: password# 从库数据源#slave:# # 从数据源开关/默认关闭# enabled: false# url: # username: # password:
然后我们把 spring.datasource.driverClassName
换成 sqlite的 org.sqlite.JDBC
;然后 spring.datasource.url
可以先设置一个默认的比如 jdbc:sqlite:test.db
,后面启动都是可以 -Dspring.datasource.url
改的。spring.datasource.druid.validationQuery
这里后面是需要改的,改成比如 SELECT test FROM DUAL
;因为 SELECT 1 FROM DUAL
不管如何,sqlite是不会出结果的。
改完driver class,我们当然要申明dependency咯。去ruoyi-admin
下的pom.xml
转一圈,把Mysql驱动包
那个dependency注释掉换成
<dependency><groupId>org.xerial</groupId><artifactId>sqlite-jdbc</artifactId><version>3.16.1</version></dependency>
【坑2】
数据库driver换好了,我们还可以看到“若依”有个sql
文件夹,有两个文件 quartz.sql
和 ry_<date>.sql
;这两个也是强绑定 mysql
的。需要手动更新下。其实转成 sqlite
也不难,
- 所有
sys_date()
转成CURRENT_TIMESTAMP
, - 所有auto_increament,如果是bigint或者int,全部变为
integer primary key autoincrement
, - 如果之后mysql有单独
primary key(...)
注释掉就好, engine=innodb auto_increment=100
mysql专有的家伙全部注释掉- 然后把mysql的
comment
全部放到--
之后注释掉,注意缺的逗号补上 - 有mysql
key
的地方也注释掉,拉出去转换成drop index if exists <name>; create <name> on <table> ( <column> );
- 最后加一张表
DUAL
保证validation pass:create table DUAL (test integer); insert into DUAL (test) values (1);
改好了,就可以在 sqlite3
里 .read <xxx.sql>
导入sql语句了。
运行
sqlite差不多配置换好了,我们先来尝试运行一下。
【坑1】mvn clean package
,然后报错了
[ERROR] Error executing Maven.
[ERROR] java.lang.IllegalStateException: Unable to load cache item
[ERROR] Caused by: Unable to load cache item
[ERROR] Caused by: Could not initialize class com.google.inject.internal.cglib.core.$MethodWrapper
这个是maven版本的问题,apt get默认给我装了个啥?mvn --version
-> 3.6.3
-_-///
最新的 maven 3.9 就不报错了。
mvn clean package
在ruoyi-admin
的target
文件夹就能拿到ruoyi-admin.jar
了,这不就可以运行了么…
java -Dserver.port=9999 -Dspring.datasource.url=jdbc:sqlite:/path/to/test.db -jar ruoyi-admin.jar
【坑2】竟然又报看不懂的错了,
Unparseable date: "xxxx-yy-zz 00:00:00" does not match (\p{Nd}++)\Q-\E(\p{Nd}++)\Q-\E(\p{Nd}++)\Q \E(\p{Nd}++)\Q:\E(\p{Nd}++)\Q:\E(\p{Nd}++)\Q.\E(\p{Nd}++)
看了一下,sqlite driver解析不了sqlite生成的timestamp,有点恶搞。
靠官方github解决吧 ref: https://github.com/xerial/sqlite-jdbc/issues/88
xerial commented on Jul 1, 2021
I’ll release 3.36.0.1 today.
去 https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc 看下最新版本,3.43.2.2
成功启动!
登录,发现报错了;哦,忘了“若依”用的mybatis,肯定有一堆sql嵌在xml里。
- ./ruoyi-generator/src/main/resources/mapper/generator/
- ./ruoyi-generator/src/main/resources/vm/sql
- ./ruoyi-quartz/src/main/resources/mapper/quartz
- ./ruoyi-system/src/main/resources/mapper/system
这个就不一个一个赘述了,纯是sql重写一遍,mysql -> sqlite
做完了,发现有人已经做过的,但是不完整的repo
这里是最终总结
https://gitee.com/shuizhimeng/ruo-yi-fast-sqlite/blob/master/sql/%E6%9B%B4%E6%96%B0%E8%AE%B0%E5%BD%95
这样“若依”就运行起来了。前后还没有敲这篇文章时间长…
那些oracle DB,postgresql更换当然就同理了…
后面我们再补充“若依”的微服务版,也就多个 nacos
和一些cloud相关组件。
相关文章:
若依:用sqlite3随便掰饬掰饬
“若依”这个开源项目,感觉是外包公司标配了啊,都在用。从README感觉像是某位阿里员工的工作之余的小整理。对于SprintBoot,个人感觉太重型,不过人家生态起来了,不是那么容易玩完。但是随着VMware被博通收购࿰…...

刚安装的MySQL使用Navicat操作数据库遇到的问题
刚安装的MySQL使用Navicat操作数据库遇到的问题 一、编辑连接保存报错二、打开数据表很慢三、MySQL的进程出现大量“sleep”状态的进程四、执行sql脚本报错,部分表导不进去五、当前MySQL配置文件 一、编辑连接保存报错 连接上了数据库,编辑连接保存报错…...

物奇平台耳机宕机恢复功能实现
是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加我微信hezkz17, 本群提供音频技术答疑服务,群赠送语音信号处理降噪算法,蓝牙音频,DSP音频项目核心开发资料, 物奇平台耳机宕机恢复功能实现 一 需求与场景 1 使…...
前端学习地址_备忘录(随时更新)
前端基础&&体系: MDN:MDN Web Docs 菜鸟教程:菜鸟教程 - 学的不仅是技术,更是梦想! 印记中文:印记中文 - 深入挖掘国外前端新领域,为中国 Web 前端开发人员提供优质文档 w3cschool:w3cschool官网 - 1000多本编程教程免费学 vue系…...

安卓数据恢复工具哪个强? 10 个最佳 Android 数据恢复应用程序
如果您是 Android 用户并且已经使用您的设备一段时间,那么您很可能遇到过与数据相关的问题。这可能是由于软件问题导致文件被意外删除或损坏。许多人不经常备份数据,从而丢失了重要的文档、图像、视频文件等。最糟糕的是,数据丢失可能随时发生…...

在IDEA中配置Web开发环境
一、idea配置Web开发环境 第一步:下载并安装Tomcat服务器(建议放根目录,完整路径中不要出现中文) 第二步:打开IDEA,新建java项目 第三步:为项目添加Web应用 在项目上右键➡️选择“Add Framew…...

Cesium 相机设置
1.setView 直接跳转到目的地 // 设置相机位置 const position Cesium.Cartesian3.fromDegrees(113, 31, 20000); // setView通过定义相机目的地(方向),直接跳转到目的地 viewer.camera.setView({ destination: position, // 位置设置 orientation: { //…...

【虹科干货】TWAMP:什么是双向主动测量协议?
TWAMP(双向主动测量协议)是什么?它在网络性能测量中有什么作用?如果您对IP网络中设备之间的性能问题感兴趣,或者想了解TWAMP与OWAMP之间的区别,以及TWAMP测试的好处。 一、TWAMP是什么? TWAMP代…...

bool型的盲注
bool型的盲注...
聊聊logback的ShutdownHook
序 本文主要研究一下logback的ShutdownHook ShutdownHook ch/qos/logback/core/hook/ShutdownHook.java /*** Interface describing a logback shutdown hook implementation* * author Mike Reinhold*/ public interface ShutdownHook extends Runnable, ContextAware { }…...

【第2章 Node.js基础】2.4 Node.js 全局对象...持续更新
什么是Node.js 全局对象 对于浏览器引擎来说,JavaScript 脚本中的 window 是全局对象,而Node.js程序中的全局对象是 global,所有全局变量(除global本身外)都是global 对象的属性。全局变量和全局对象是所有模块都可以调用的。Node.is 的全局…...

大数据毕业设计选题推荐-河长制大数据监测平台-Hadoop-Spark-Hive
✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…...
Unity与java后端UDP通信
1. unity客户端代码: using System.Collections; using System.Collections.Generic; using UnityEngine; using System.Net.Sockets; using System.Net; using System.Threading; using System.Text; using System;public class Udp : MonoBehaviour {static Sock…...

vue3 - swiper插件 实现PC端的 视频滑动功能(仿抖音短视频)
swiper官网 swiper属性/组件查询 vue中使用swiper 步骤: ① npm install swiper 安装 ② 基础模板: <div><swiper class"swiper-box" :direction"vertical":grabCursor"true" :mousewheel"tr…...
简述SVM
概述 SVM,即支持向量机(Support Vector Machine),是一种常见的监督学习算法,用于分类和回归问题。它是一种基于统计学习理论和结构风险最小化原则的机器学习方法。 SVM的主要思想是在特征空间中找到一个最优的超平面…...
【DevOps】Rundeck以及Jenkins
Rundeck是一个DevOps常用的工具,是PagerDuty公司开发的产品,能够很好的和PagerDuty进行集成。 但是平常我们听得或用得更多的是Jenkins,一个非常流行的CI工具,具有很好的可扩展性。 可是为什么那家公司会用Rundeck而不是Jenkins呢…...

数字滤波器分析---零极点分析
数字滤波器分析---零极点分析 zplane 函数绘制线性系统的极点和零点。 例如,在 -1/2 处为零且在 0.9e−j2π0.3 和 0.9ej2π0.3 处有一对复极点的简单滤波器为 zer -0.5; pol 0.9*exp(j*2*pi*[-0.3 0.3]); 要查看该滤波器的零极点图,您可以使用 z…...
HarmonyOS应用开发-网络请求与web组件
前言 当今世界,移动应用已经成为人们日常生活中不可或缺的一部分。无论是社交媒体、新闻、购物还是娱乐,安卓应用的广泛使用已经改变了我们与数字世界互动的方式。然而,这些应用的实际功能远不止界面和用户体验。它们背后的精密技术和网络请…...

频次最高的38道selenium面试题及答案
1、selenium的原理是什么? selenium的原理涉及到3个部分,分别是: 浏览器driver:一般我们都会下载driverclient:也就是我们写的代码 client其实并不知道浏览器是怎么工作的,但是driver知道,在…...

利用MSF设置代理
1、介绍: 通过MSF拿到一个机器的权限后,通过MSF搭建socks代理,然后通内网。 拿到目标权限,有很多方法,比如:①ms17-010 ②补丁漏洞 ③MSF生成后门 在此直接使用MSF生成后门 MSF中有三个代理模块&#x…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...