Linux环境下JOOQ代码生成失败:org.postgresql.Driver类未找到异常
嗨,我看到你在生成JOOQ类的时候碰到了这个驱动找不到的错误,这在日常开发里真的挺常见的,主要就是依赖没配到位的事儿,我来给你一步步捋清楚怎么解决:
先看问题根源
你给出的报错信息里,核心问题一目了然:
Apr 24, 2018 1:39:11 PM org.jooq.tools.JooqLogger info INFO: Initialising properties : jooq-configuration.xml
Apr 24, 2018 1:39:11 PM org.jooq.tools.JooqLogger error SEVERE: Cannot read jooq-configuration.xml. Error : org.postgresql.Driver
java.lang.ClassNotFoundException: org.postgresql.Driver
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:...
说白了就是JOOQ的代码生成工具在运行时,找不到PostgreSQL的JDBC驱动类,十有八九是驱动的依赖没被加到生成工具的classpath里。
具体解决办法
1. 先确认依赖有没有加对
如果你用Maven或者Gradle管理项目,先把PostgreSQL驱动的依赖配上,而且要保证代码生成阶段能拿到这个依赖:
Maven的情况
在你的pom.xml里加这个依赖:
<dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>换成你PostgreSQL对应的驱动版本</version> <!-- 因为代码生成是编译期的活儿,scope设成compile或者provided都可以,看你需求 --> <scope>compile</scope> </dependency>
另外,别忘了给JOOQ的代码生成插件也加上这个依赖,不然插件可能拿不到:
<plugin> <groupId>org.jooq</groupId> <artifactId>jooq-codegen-maven</artifactId> <version>你的JOOQ版本</version> <dependencies> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>对应版本号</version> </dependency> </dependencies> <!-- 这里放你的代码生成配置,比如数据库连接、生成路径这些 --> </plugin>
Gradle的情况
在build.gradle里这么加:
dependencies { // 项目里用的驱动依赖 implementation 'org.postgresql:postgresql:对应版本号' // JOOQ代码生成工具要用的驱动 jooqGenerator 'org.postgresql:postgresql:对应版本号' }
2. 命令行运行的话手动加classpath
要是你直接用命令行跑JOOQ生成工具,那得把驱动的jar包直接加到classpath里才行,比如:
java -cp "jooq-codegen.jar:postgresql-xxx.jar:其他需要的依赖.jar" org.jooq.codegen.GenerationTool jooq-configuration.xml
这里的postgresql-xxx.jar就是你下载好的驱动jar包,记得换成实际的文件名。
3. 检查配置文件里的驱动类名
最后再确认下jooq-configuration.xml里的驱动类名是不是写对了,应该是:
<configuration> <jdbc> <driver>org.postgresql.Driver</driver> <!-- 这里还要配url、用户名、密码这些哦 --> </jdbc> <!-- 其他生成相关的配置 --> </configuration>
别手滑写错了,比如少个org.前缀这种小错误也会导致找不到类。
小提醒
- 驱动版本尽量和你的PostgreSQL服务器版本匹配,不然可能会有兼容性问题
- 要是在IDE里跑生成任务,记得刷新下依赖(比如Maven的Reload All,Gradle的Refresh Project),不然IDE可能没把新依赖加载进来
内容的提问来源于stack exchange,提问作者Saizaku

