ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

JBolt实验室项目导入IDEA:JFinal与Maven配置排错指南

JBolt实验室项目导入IDEA:JFinal与Maven配置排错指南 1. 接手的项目到底是什么JBolt 框架与实验室二次开发的特征1.1 JBolt 的底层是 JFinal不是 Spring Boot很多新同学拿到 jbolt 项目的第一反应是把它当成一个 Spring Boot 工程来对待。这个惯性认知会带来一系列麻烦。JBolt 是一个基于 JFinal 构建的快速开发平台JFinal 是一个非常轻量的 Java Web 框架它的核心设计哲学是极简、极快不像 Spring Boot 那样有庞大的自动装配机制。JBolt 在这个基础上封装了后台管理、权限体系、代码生成、工作流Activit i等能力相当于给 JFinal 套了一层业务开发脚手架。这个差异直接影响你在 IDEA 里的操作方式。Spring Boot 项目导入后IDEA 会自动识别 Spring 相关的注解、配置和启动类做很多智能提示。但 JBolt 项目本质上是一个普通 Maven 工程IDEA 不会把它当 Spring 项目来照顾你反而要少依赖 IDAE 的智能能力多靠 Maven 依赖和源码结构去理解项目。另外JFinal 内置了 Jetty 容器开发环境下不需要额外配置 Tomcat也不需要打 war 包扔到外部容器里。这意味着导完项目直接运行一个主类就能通过内置 Jetty 起服务。看似方便但配套的问题是日志、端口、编码这些环境类参数都依赖启动时的 JVM 配置和配置文件任何一个环节不对启动过程就会原地失败。1.2 实验室项目在 JBolt 基础上通常会改哪些内容标题里写了实验室非公开项目这个定位很关键。非公开意味着这个项目不是在 JBolt 官方脚手架上原样跑而是经过了实验室成员的二次开发。根据我带过的几个类似项目来看实验室二次开发通常集中在三块。第一块是业务模块扩展。JBolt 本身提供了用户、角色、菜单这些基础管理模块实验室会在此基础上增加自己的业务表、业务页面和工作流审批流程。项目代码里通常会有几个独立的业务 module 或者 package导入后要先看清楚整体结构别一上来就只盯着启动类。第二块是数据模型定制。实验室的业务数据表往往在标准 JBolt 表结构上做了字段扩展比如增加部门维度、项目维度、自定义分类等。对应的初始化 SQL 脚本会很长一个项目里可能有几十张甚至上百张表脚本文件的存放位置和导入顺序都要按文档来。第三块是内部依赖。非公开项目经常引用实验室自己封装的公共模块这些模块可能不会发到 Maven 中央仓库而是放在实验室内部的私有仓库里或者直接以 jar 包形式放在项目某个 lib 目录下。如果是前者你要配 Maven 私服如果是后者IDEA 导入时就要确保 lib 目录被正确识别。这两类情况在实验室场景里都很常见但处理方式完全不同建议拿到代码后先问清楚。1.3 导入前先确认的三件事在动手操作之前我建议你先花十分钟向组长或者同组师兄确认三件事这十分钟能省下后面一整天的排查时间。第一件Maven 依赖从哪里下。是实验室有私服还是用公共镜像就好如果有私服私服地址和账号密码找谁要这决定了你本地 Maven 的 settings.xml 怎么配也决定了首次导入能不能顺利把所有依赖拉完。第二件数据库脚本在哪。是项目代码里自带一份初始化 SQL还是需要找专人要数据库用的是哪个版本MySQL 还是别的账号密码初始值是什么第三件Redis 要不要自己装。jbolt 这类项目通常把会话和缓存放到 Redis 里如果本地没有起 Redis项目很可能能编译通过但启动后反复报无法连接 Redis这类错误。先确认本地要准备哪些中间件是装原生服务还是用 Docker心里有个数再开始导代码。提示实验室项目通常没有完善的手把手文档很多信息靠在群里问或者看 README。如果仓库里有 README第一件事就是通读它。没有 README 的项目才轮到靠代码和配置去猜。2. 环境准备IDEA 版本、JDK 8 与 Maven 私服配置2.1 IDEA 装哪个版本社区版够用旗舰版更省心关于 IDEA 的下载和安装JetBrains 官网都能直接找到安装过程就是一路下一步没什么好说的。真正值得讨论的是装社区版Community还是旗舰版Ultimate。网上很多搜索词是关于激活破解的我的态度一直很明确团队协作场景下别碰破解版要么申请正版授权要么用社区版。尤其你是在实验室写代码代码和账号都是公开可追溯的因为工具问题让自己陷入被动完全不值得。从功能角度我做了个简单的对比方便你判断自己的情况功能点社区版旗舰版Maven 项目导入与构建支持支持JFinal/JBolt 运行主类支持支持Git 集成支持支持数据库客户端工具如 MySQL不支持需外部工具内置HTTP Client 调试接口基础支持更完善Spring 生态专属支持无有但 JBolt 非 Spring用处有限对导入 jbolt 项目这件事来说社区版其实完全能完成。真正让我推荐旗舰版的理由不是 JBolt而是它内置的数据库工具。实验室项目牵连的数据库操作很多你经常要一边看代码一边查表结构旗舰版里直接开一个数据库终端就能查不用在 Navicat 和 IDEA 之间来回切换。但如果你本来就用惯了 Navicat那社区版毫无问题。IDEA 版本本身倒没有那么敏感近几年的 2021、2022、2023、2024 版本我都用过导入 Maven 项目的核心逻辑没有变。唯一要注意的是项目里的 .idea 目录如果被提交到了 Git 仓库不同人的 IDEA 版本差异可能导致一些配置被互相覆盖这种情况建议让团队把 .idea 加进 .gitignore或者你导入前先看一眼现有配置里有没有奇怪的绝对路径。2.2 JDK 8 为什么是硬性要求JFinal 和 JBolt 的早期版本基本上都是基于 Java 8 设计的实验室非公开项目的依赖树里很可能有一些老版本的三方库它们在高版本 JDK 下会出现反射报错、模块访问限制之类的问题。所以我的建议是直接装 JDK 8不要用 11、17 去试着跑编都编不过的情况我见过太多次了。装好 JDK 8 之后还要在 IDEA 里把 Project Structure 配对。具体路径是 File - Project Structure - Project把 SDK 选到本机的 JDK 8Language Level 也对应选 8。与此同时确认 Settings - Build Tools - Maven - Importing 里的 JDK for importer 也选到 JDK 8否则可能会出现 IDEA 自己的 Maven 进程用了别的 JDK导致依赖解析行为不一致。有一点值得提醒如果电脑上装过多个 JDKIDEA 的依赖加载过程里经常会出现编译用的是 JDK 8但 IDE 索引进程用的是 JDK 17这种错位。表现就是代码能在命令行 Maven 里构建成功IDEA 里却全部标红。遇到这种情况先把 IDE 的 JVMHelp - Change Memory Settings 之外的底层配置理清楚最稳妥的做法是保证命令行、Maven、IDEA 三者用的是同一个 JDK 8。2.3 Maven 本地仓库与私服依赖拉不下来的根源JBolt 项目再怎么说也是一个 Maven 工程所有第三方依赖都通过 Maven 坐标来管理。实验室非公开项目最常出现的问题就是依赖要么在中央仓库找不到要么版本号是私有的。所以 settings.xml 的配置非常关键。先找 Maven 的配置文件路径通常在 Maven 安装目录的 conf/settings.xml 下。如果实验室有私服配置结构一般长这样settings mirrors mirror idlab-nexus/id mirrorOf*/mirrorOf urlhttp://192.168.x.x:8081/repository/maven-public//url /mirror /mirrors servers server idlab-nexus/id usernameyourname/username passwordyourpassword/password /server /servers /settings这里有一点特别重要mirrorOf 用*会让所有请求都走私服如果你不确定私服里是否缓存了中央仓库的全部依赖不建议这样配置。更稳的做法是用 profile 的方式把私服配成仓库源和中央仓库并存profiles profile idlab/id repositories repository idcentral/id urlhttps://repo.maven.apache.org/maven2/url /repository repository idlab-nexus/id urlhttp://192.168.x.x:8081/repository/maven-public//url /repository /repositories /profile /profiles activeProfiles activeProfilelab/activeProfile /activeProfiles如果你不确定实验室服务器部署在哪个地址就直接问一句有没有 Maven 私服settings 配置发我一份。大多数情况下组里老成员手里都有一份现成的 settings.xml把它复制到本地然后改一下本地仓库路径就能用。这里我不建议自己瞎猜 IP猜错了只会浪费大量时间在超时重试上。本地仓库默认在用户目录的.m2/repository下如果之前跑过别的项目里面会缓存不少公共依赖即使是同一个仓库也不要轻易删很多所谓IDEA 里突然所有依赖都红了的问题都是因为有人手滑清空了本地仓库。3. 拉取代码与导入 IDEA让 Maven 结构正常展示3.1 通过 IDEA 的 Git 工具克隆仓库拿到 Git 仓库地址后最干净的方式不是先命令行 clone 再打开而是直接用 IDEA 的 Git 集成来克隆。操作路径是 File - New - Project from Version Control粘贴仓库 URL选择目标目录。这里有一个实验室项目常见的坑仓库地址可能只对实验室网段开放你在校外或者某些网络环境下直接 clone 会一直卡在认证或超时状态。先确认自己网络能到达 Git 服务器再考虑在 IDEA 里操作。clone 的时候还要注意分支。有些实验室项目默认分支是一堆历史提交真正能跑通的最新代码在dev或者release分支上。克隆完成后IDEA 右下角会显示当前检出的分支记得看一眼。如果发现仓库默认分支不是你要的就在 Branches 弹窗里切过去。切换分支后如果代码发生了大变化Maven 会自动触发 Reimport这一步让 IDEA 跑完别中途停。拉代码的过程看起来没什么技术含量但我在实际经历中见过太多次因为仓库地址填错、分支选错、子模块没有初始化的类似性问题。如果项目用了 Git Submodule克隆完父仓库之后子模块的代码是空的需要手动执行git submodule update --init --recursive。JBolt 二次开发项目如果分了好几个代码仓这种情况很常见。IDEA 的 Git 工具面板里可以对每个子模块单独操作也可以回到终端执行子模块初始化命令建议用命令一步到位git submodule update --init --recursive3.2 用 Open 方式打开 pom.xml选对导入入口项目代码落盘之后下一步就是导入 IDEA。这一步很多人纠结到底选 Open 还是 Import Project我的经验是现代 IDEA 版本里不用刻意区分直接 Open 项目根目录IDEA 会自动扫描 pom.xml 并把项目识别为 Maven 工程。如果 Open 之后 IDEA 没有自动识别那就手动打开根目录下的 pom.xmlIDEA 会弹出一个提示窗问你是否作为项目打开确认即可。这里不要用老式的 Import Project 向导那个向导步骤多容易选错模型还会额外生成一堆没用的工程文件。特别是实验室项目如果是多模块结构老式向导识别模块的准确性并不高反而容易把父子模块关系搞乱。Open 成功之后重点看两处。第一处是右侧 Maven 工具窗口里面应该能看到项目的模块树。如果是多模块项目父 pom 下面挂着子模块每个子模块都有各自的 artifactId这个结构和你从 README 或者其他同学口里听到的模块划分对得上就说明导入基本成功。第二处是左下角或底部的进度条IDEA 在首次打开时会下载依赖、建立索引这个过程可能持续十分钟甚至更久千万要有耐心。很多同学看到进度条卡住就直接重启 IDEA或者反复关闭重开结果索引每次都是半成品反而让依赖解析更乱。3.3 首次索引与多模块识别首次建立索引期间IDEA 会扫描所有文件建立代码关联。对 jbolt 这种非公开项目来说源码量不会特别大但资源文件工作流 bpmn 文件、前端页面、SQL 脚本往往不少所以索引时长主要被资源文件拖慢。这个时候不要去打开各种文件乱点等右下角进度条走完IDEA 底层索引建好了代码跳转会流畅很多。多模块项目还有一个典型问题执行 Maven 编译时只编译了部分模块导致模块之间引用飘红。在 Maven 工具窗口里如果发现某个子模块没有出现在模块树里可以右键项目根节点执行 Reload All Maven Projects。如果还是没有就去检查子模块的 pom.xml 是否在父 pom 的modules标签里被声明过。很多团队在拆分模块时只建了目录忘了把新建的 module 加进父 pom这个原因靠 IDE 是发现不了的。依赖全部下载结束之后可以执行一次 Lifecycle - package 或者 compile确认能正常构建。这一步能过滤掉大部分环境配置问题比如 JDK 版本不一致、依赖坐标错误、插件下载失败等。编译通过后再往下走配置改造你会轻松很多。注意首次导入阶段IDEA 提示Unindexed remote maven repositories这类内容时不要直接忽略。这是 IDEA 在告诉你某些依赖来自远程仓库但还没有建立索引如果后续代码里找不到某些类可以先回到 Maven 设置里重新更新远程仓库索引。4. 本地化配置改造数据库、Redis 与工作流先条件4.1 先找配置文件和示例环境配置JBolt 项目的配置不像 Spring Boot 那样集中在 application.yml 里而是按照 JFinal 的风格在启动类中用代码加载配置文件常见的配置文件放在src/main/resources下名字可能是jbolt.properties、app.properties、db.properties或者类似的名字。具体是哪个打开 resources 目录一眼就能看到。实验室项目通常会留一份示例配置比如jbolt.properties.example或者config-dev.example.properties。我的建议是不要直接改示例文件而是复制一份改成实际要用的文件名比如把config-dev.example.properties复制成config-dev.properties。这样做的好处是你本地的改动不会被 Git 误提交也不会污染其他同学拿到的示例配置。配置项内容虽然各家有差异但核心跑不开以下几类# 数据库连接名字以实际项目为准一般是 db.、jdbc.、datasource. 开头 db.urljdbc:mysql://127.0.0.1:3306/jbolt_lab?useUnicodetruecharacterEncodingutf-8useSSLfalseserverTimezoneAsia/Shanghai db.usernameroot db.password123456 # Redis 连接 redis.host127.0.0.1 redis.port6379 redis.password redis.database0 # 应用端口 server.port8080需要特别提醒的是时区参数。MySQL 8 之后的 JDBC 驱动对时区很敏感如果连接串上没有serverTimezoneAsia/Shanghai启动时大概率报The server time zone value的异常。很多同学在导入项目时纠结了半天最后发现是时区没设置。4.2 数据库脚本导入与连接配置数据库配置是启动项目的第一个硬门槛。你没有数据库表结构项目一启动就会报表不存在之类的错误。实验室项目一般会在doc/sql或sql/目录下放初始化脚本脚本可能是单个文件也可能按模块拆成多个文件。多个文件的时候导入顺序通常有讲究比如先基础表再业务表最后是流程相关表。文件命名里经常会带01_、02_这样的前缀跟着顺序导就行。导入工具可以用 Navicat也可以用 IDEA 旗舰版的数据库工具。如果只有社区版就用 Navicat 或者命令行客户端。导入前先在本地建一个空库库名最好和配置文件的库名保持一致比如jbolt_lab字符集选择utf8mb4排序规则选utf8mb4_general_ci或utf8mb4_unicode_ci。utf8mb4 不是可选项因为有的流程审批意见里会存 emoji 字符老的 utf8 存不进去容易在运行时报编码错误。脚本导入完成之后用最简单的查询验证一下比如show tables;确认核心表都建出来了。不要直接启动项目再验证到时候报错和日志混在一起你根本分不清是连接问题还是表结构问题。4.3 Redis 的本地准备与连接参数jbolt 这类平台把用户登录会话、权限缓存、验证码等状态都放在 Redis 里所以 Redis 是启动前置条件不是可选项。本地准备好 Redis 的方式有两种直接安装原生 Redis或者用 Docker 起一个。如果只是想在本地跑通项目最省事的方式是 Dockerdocker run -d --name jbolt-redis -p 6379:6379 redis:6.2 --requirepass 123456跑起来之后把配置文件里的 redis 密码改为123456host 和端口保持默认。如果没有设置密码配置文件里留空就行。这里容易踩的一个坑是 Redis 版本差异。实验室服务器上如果是老版本 Redis某些指令特性可能和本地新版本不一致不过对项目启动来说只要连接和密码对了版本一般不影响。如果启动项目时提示连接 Redis 超时先单独用命令行测一下redis-cli -h 127.0.0.1 -p 6379 ping返回 PONG 说明 Redis 没问题问题在配置文件的 host、port、password 上。如果长时间连接超时还要检查电脑防火墙是否拦截了 6379 端口。这个问题在 Windows 上比较常见macOS 和 Linux 上基本不会遇到。4.4 Activiti 表的自动生成与流程资源部署jbolt 集成了 Activiti 工作流引擎项目里会有很多.bpmn或者.bpmn20.xml流程定义文件通常放在 resources 下的processes目录。这些文件是业务流程审批的核心也是实验室二次开发的重要部分。Activiti 引擎在首次启动时会检查数据库里有没有工作流引擎需要的表。配置里一般有个开关比如activiti.database-schema-update值设为true时引擎会自动创建或更新表结构。这个配置项在开发阶段建议打开方便流程引擎自动建表但如果你手里的初始化 SQL 已经包含了 Activiti 的 ACT_ 系列表就不用再依赖自动建表保持false即可。我对这个环节的建议是你可以先不依赖任何假设启动项目后立刻检查数据库里是否出现了ACT_RE_*、ACT_RU_*、ACT_HI_*这些表。如果出现了说明自动建表生效如果没出现项目日志里多半会报缺表错误这时候再回来看database-schema-update的值是不是被设成了false。判断依据是结果不是配置文件里写了什么。流程资源文件在项目启动时会自动被部署这个过程通常在日志里体现为一句Deployment开头的输出。如果你改了某个 bpmn 文件重新启动不会重新部署旧版本需要手动清理部署记录这个细节等真正改流程时再去研究首次启动不用太担心。5. 启动与联调从 Run Configuration 到后台登录5.1 配置启动类和运行参数打开源码目录找到启动类。JBolt 项目的启动类通常继承了JFinalConfig类名一般叫AppConfig、JboltApplication或者MainConfig里面会有一个main方法。找到之后在这个类的代码区域点绿色三角直接运行即可。如果是首次运行IDEA 会弹出 Run Configuration 让你确认。这里有几个比较关键的地方容易被忽视。第一是 Working directory。IDEA 默认的工作目录是模块根目录如果项目里有相对路径读取文件的需求比如读取 bpmn 文件或配置文件工作目录不对会导致文件找不到。建议显式把 Working directory 设置成模块根目录或项目根目录不要留空。第二是 VM 参数。如果项目文档或者 README 里要求加-Dfile.encodingUTF-8就在这里配置。另外如果项目数据库连接或 Redis 连接依赖于环境变量可以在 Environment variables 一栏配置也可以在系统环境变量里提前设好。实验室项目更喜欢在配置文件里直接写死所以环境变量不是必须的但你要知道有这一层。第三是 JRE 选择。Run Configuration 里会让选 JRE务必选择 JDK 8而不是 IDEA 自带的 JBRJetBrains Runtime。选错之后表现很诡异编译能过运行就报各种莫名其妙的错误而且错误信息经常不指向真正的根因排查起来特别浪费时间。我用一个清单来总结方便你逐项核对Project SDKJava 8Language Level8Maven importer JDKJava 8Run Configuration JREJava 8Working directory模块根目录或项目根目录VM 参数-Dfile.encodingUTF-8如果出现中文乱码再加-Dsun.jnu.encodingUTF-85.2 编码与乱码问题编码问题是 jbolt 这类老项目被吐槽最多的地方之一。项目在最初开发时可能混合了 GBK 和 UTF-8配置文件、JSP 页面、Java 源码的编码格式不统一。导入 IDEA 后很多源码文件里的中文注释变成乱码严重的时候连字符串变量里的中文都会变乱。处理编码问题我按优先级推荐几招。第一招打开 Settings - Editor - File Encodings把 Global Encoding 和 Project Encoding 都设为 UTF-8Properties Files 里的 Default encoding for properties files 也设为 UTF-8。这是最基础的但如果项目里某些文件本身就是 GBK 编码这一招改不了文件的实际字节内容只是改变解读方式。第二招设置 JVM 启动参数。在 Run Configuration 的 VM options 里加上-Dfile.encodingUTF-8这能保证运行期的 IO 读写按 UTF-8 来处理。第三招如果发现某些文件在 IDEA 里显示乱码但用其他编辑器打开正常说明文件本身是 GBK 编码IDEA 却按 UTF-8 解读了。这时候可以右下角点击文件编码手动切换成 GBK让 IDEA 重新解读。如果文件里中文改用不了 UTF-8可以右键文件选择 File Encoding - Convert to UTF-8但这一步会改变文件实际内容如果有 Git 提交记录会显示整个文件都变了提交前要考虑是否会影响团队其他人。控制台乱码是另一回事。IDEA 的 Run 窗口如果出现中文乱码位置在 Help - Edit Custom VM Options在 idea64.vmoptions 里加一行-Dfile.encodingUTF-8重启 IDEA 生效。这是全局方案对控制台输出、Git 输出日志都有效。5.3 访问后台、登录验证与常见启动错误配置文件改好、Run Configuration 配好之后点运行。JFinal 内置 Jetty 启动日志里看到类似 Starting JFinal 或者 Server started 这样的字样说明启动成功。默认端口一般是 8080如果配置里改过端口以配置为准。浏览器访问http://localhost:8080或http://127.0.0.1:8080能看到后台登录页。第一次登录管理员账号和密码通常需要从初始化 SQL 脚本里确认。实验室项目一般会写一个插入管理员账号的 SQL账号常见的是admin密码可能是123456也可能是加密过的一串哈希值。如果把 SQL 文件翻一遍找不到明文密码可以看项目文档或者直接问组里同学这个信息没有统一规律别瞎猜。启动过程中常见的问题有几个我直接列一下典型表象和原因报错/表现可能原因处理方向日志很快停止无异常进程退出数据库连接失败检查数据库驱动、地址、账号密码、时区参数提示 Connection refusedRedis 或 MySQL 未启动启动对应服务用命令单独验证连通性端口被占用上一次进程未退出或 8080 被其他程序占用找到占用进程并结束或改项目端口类不存在 / NoClassDefFoundError依赖不完整或某些依赖是运行期动态加载Maven 重新 Reload检查本地仓库登录页能打开但登录后 500会话存储异常通常是 Redis 问题检查 Redis 连接与序列化配置5.4 联调中最容易忽略的日志级别最后再提一个我自己的习惯联调阶段把日志级别调低。JFinal 项目通常在配置里会有日志相关配置默认可能是 INFO 级别。启动的时候把日志级别临时调到 DEBUG你能看到数据库 SQL 执行日志、Redis 操作日志、Activiti 部署日志排查问题的速度会快很多。等确认项目能正常启动、登录、走通流程之后再把日志级别调回 INFO。这个操作看似不起眼但能帮你节省大量看代码猜原因的时间。6. 导入排错实录三条高频问题链路6.1 依赖飘红从本地仓库到私服逐层排查依赖飘红和程序包不存在是导入阶段最让人烦躁的问题因为它和代码基本没有关系。我在实际协助同学导入 jbolt 项目时遇到这类问题从来不直接改代码而是按下面这条链路逐层排查。第一层确认 IDEA 的 Maven 配置指向的 settings.xml 是否正确。打开 Settings - Build Tools - Maven看 User settings file 一栏。如果这里指向了一个不存在的文件IDEA 会退回到默认配置本地仓库路径都是默认的。很多同学改了 settings.xml 但忘了在 IDEA 里指定改了个寂寞。第二层确认本地仓库是否有对应依赖。去~/.m2/repository下找报错坐标对应的路径看看目录是否存在、目录里的 jar 包是否完整。有时候依赖下载中断会残留.lastUpdated文件这种文件的存在意味着那次下载失败了。删掉.lastUpdated文件再重新 ReloadIDEA 会重新尝试下载。这一招非常实用是解决同一个依赖反复拉不下来的核心操作。第三层确认依赖是否来自私服。如果坐标是实验室私有命名比如com.lab:xxx-core:1.0.0但 settings.xml 里没有配置私服地址IDEA 会一直尝试从中央仓库找最后报找不到。这种情况不是下载失败而是整个地球上都没有这个包必须在私服仓库里找。我现在修复依赖类问题最快的动作顺序是查看右侧 Maven 面板报错列表 → 定位具体坐标 → 查看本地仓库目录 → 查看.lastUpdated文件 → 清掉后重载。这个方法能解决大概八成依赖问题剩下的两成才是私服配置和仓库索引问题。6.2 找不到符号与 IDEA 缓存多数情况不是代码问题项目明明能在命令行mvn compile编译通过但在 IDEA 里大量代码标红提示找不到符号或程序包不存在。这种情况我几乎每周都能遇到原因一般是 IDEA 缓存和索引出了问题或者模块之间的依赖关系没有被正确加载。第一步先执行一次 Maven Reload。在右侧 Maven 工具窗口点击刷新按钮让 IDEA 重新读取所有 pom.xml。这一步能解决模块间依赖关系混乱的问题尤其是多模块项目新增了模块引用时。第二步如果 Reload 无效就到 File - Invalidate Caches 里执行清理缓存并重启。这个过程会重建索引第一次重启后会有一段时间的卡顿和索引进度别担心让它跑完。第三步检查模块是否被错误地标记。打开 Project Structure - Modules确认每个子模块的 Sources 路径有没有被正确标记为 source 目录。如果某个模块的 Java 目录没被标记成蓝色 source 文件夹IDEA 就不会为它建立代码索引哪怕 Maven 依赖是对的也会报找不到类。这套链路走完之后绝大多数找不到符号都会消失。如果还在飘红再把目光转回代码本身去检查 import 是不是写错了、是否真的缺少某个类而不是一开始就去改代码。6.3 端口占用与启动半路退出端口占用是个高频问题。JFinal 内置 Jetty 默认 8080如果本地有 Nginx、Tomcat 或者其他开发项目也在用 8080就会冲突。启动日志通常会出现一行Port already in use之类的提示。在 Windows 上通过命令找占用进程netstat -ano | findstr 8080 taskkill /PID 进程号 /FmacOS 或 Linux 上lsof -i :8080 kill -9 进程号如果端口被占是常态可以直接改配置里的端口比如改成 8090一劳永逸。但要注意改了端口之后后台某些功能如果硬编码了回调地址也会受影响。实验室内部项目一般没有这种逻辑不过以防万一遇到登录回调异常时记得往这个方向想一想。启动半路退出还有另一个隐蔽原因JFinal 内置 Jetty 需要写一些临时文件到系统临时目录如果当前账号对这些目录没有写权限启动会在很靠后的阶段失败日志也不够明确。解决方法是给临时目录配置一个项目内路径或者检查当前系统用户是否有读写的权限。这类问题在实验室公用电脑上比较常见因为共用电脑的权限体系经常被改动。注意如果启动日志打印了很多帧栈不要只顾着看最上面一行。JFinal 这类框架的异常栈可能有几千行真正的根因往往在栈顶第一个Caused by之后。我习惯把控制台日志整体复制到编辑器里搜索Caused by逐条看比肉眼在 IDEA 输出窗口里找高效得多。6.4 版本不一致导致的在我这能跑你那不行最后说一个非公开项目里非常普遍但很少被系统总结的问题团队成员之间环境参数不一致导致导入跑起来的行为完全不同。比如 A 同学用的 JDK 8u282B 同学用的是 8u191两个版本在某些加密算法和 TLS 行为上有差异数据库连接一条可能就依赖这种差异。再比如 Maven 版本3.6 和 3.9 对某些插件的兼容性不同也可能导致同样的 pom.xml 在不同机器上产生不同的构建结果。解决这个问题的思路是对齐环境而不是逐个击破。我建议把下面这些信息在团队里统一一次JDK 厂商和版本推荐 OpenJDK 8 或某些发行版统一小版本号Maven 版本统一 3.x 的具体版本数据库版本MySQL 5.7 还是 MySQL 8Redis 版本5、6、7 都有差异IDEA 版本主版本号尽量一致这些信息看起来琐碎但当你把 为什么他的中文不乱码我的乱码、为什么她能启动我不能 这类问题都归因到环境差异之后你会发现大部分玄学都消失了。这不是什么高深技巧就是环境管理的基本功但在实验室项目里真的能帮你省下大把的时间。我自己的体会是导入 jbolt 这类实验室非公开项目最大的阻力通常不是技术难度而是信息不透明和惯性思维。信息不透明是指你不知道私服地址、不知道数据库脚本在哪、不知道管理员密码这些靠代码看不出来只能问。惯性思维则是总拿 Spring Boot 项目的习惯去套所有 Java 项目结果在 JFinal/JBolt 这类框架上反复碰壁。把这篇文章里提到的环境准备、导入方式、配置改造、排错链路走一遍项目在本地跑起来只是一个时间问题。
返回列表