使用ScalikejdbcGen反向MySQL Schema时遭遇ClassNotFoundException
com.mysql.jdbc.Driver找不到问题 我来帮你排查这个问题——你遇到的ClassNotFoundException本质上是ScalikejdbcPlugin作为sbt插件运行时,无法访问到项目依赖里的MySQL驱动,因为sbt插件的classpath和项目自身的classpath是完全独立的。结合你的配置和错误信息,给你几个针对性的解决方案:
1. 把MySQL驱动添加到sbt插件的依赖中
ScalikejdbcGen是通过sbt插件执行的,它的依赖不会自动继承项目的libraryDependencies。你需要在project/plugins.sbt文件中明确添加MySQL驱动的依赖:
// project/plugins.sbt中添加 addSbtPlugin("org.scalikejdbc" %% "scalikejdbc-mapper-generator" % "3.5.0") // 新增MySQL驱动依赖,和你项目中用的版本保持一致或者升级到兼容版本 libraryDependencies += "mysql" % "mysql-connector-java" % "8.0.33"
2. 升级MySQL驱动版本并修正驱动类名
你当前使用的mysql-connector-java:5.1.12是非常老旧的版本,如果你用的是JDK 11+,这个版本会有兼容性问题。而且MySQL 8.0+的驱动类已经从com.mysql.jdbc.Driver改成了com.mysql.cj.jdbc.Driver。建议你升级驱动版本:
修改build.sbt中的MySQL依赖:
// 替换旧的驱动依赖 "mysql" % "mysql-connector-java" % "8.0.33",
同时,确保你的数据库配置文件(比如application.conf)中的驱动类名也同步更新:
db.default.driver="com.mysql.cj.jdbc.Driver" db.default.url="jdbc:mysql://localhost:3306/your_db_name?serverTimezone=UTC&useSSL=false"
3. 清理sbt缓存并重新加载项目
有时候sbt的缓存会导致依赖加载异常,执行以下命令清理缓存并重新加载项目:
sbt clean reload
如果还是不行,可以手动删除本地sbt缓存目录(比如~/.ivy2/cache/mysql或者~/.cache/coursier/v1/https/repo1.maven.org/maven2/mysql),然后重新运行ScalikeJDBCGen命令。
4. 确认ScalikeJDBC插件配置的正确性
确保你的databaseMysql项目的ScalikeJDBC配置指向了正确的数据库,比如在application.conf中明确指定对应的数据库配置:
db.product.driver="com.mysql.cj.jdbc.Driver" db.product.url="jdbc:mysql://localhost:3306/product_db?serverTimezone=UTC" db.product.user="your_username" db.product.password="your_password"
做完这些修改后,再重新执行你的生成命令:
sbt "databaseMysql/compile scalikejdbcGen product Product"
内容的提问来源于stack exchange,提问作者Pratik K. Shah

