
在 JDK 11 及更高版本(如 JDK 19)中,javax.sql.rowset 不再默认导出,需显式声明模块依赖或使用正确导入语法;常见错误源于大小写混淆、通配符误用或模块系统限制。
在 jdk 11 及更高版本(如 jdk 19)中,`javax.sql.rowset` 不再默认导出,需显式声明模块依赖或使用正确导入语法;常见错误源于大小写混淆、通配符误用或模块系统限制。
javax.sql.rowset 是 Java 标准库中用于支持离线 RowSet 实现(如 CachedRowSet)的关键包。但自 Java 9 引入模块系统(Jigsaw)后,该包被划归到 java.sql.rowset 模块下,且默认不自动导出给 unnamed 模块或普通应用模块。因此,在 JDK 19 环境下直接写 import javax.sql.rowset; 会触发编译错误:“The package javax.sql.rowset is not accessible”。
? 根本原因分析
❌ 错误写法:import javax.sql.rowset;
→ 这是非法语法:import 后必须跟 类名 或 *包名 + `.**,不能仅写包名(无.*`)。-
✅ 正确写法(二选一):
- 导入具体类型:import javax.sql.rowset.CachedRowSet;
- 导入整个子包:import javax.sql.rowset.*;
⚠️ 更深层限制(JDK 11+):
即使语法正确,若项目未启用模块系统(即无 module-info.java),或 java.sql.rowset 模块未被显式要求(requires),JVM 仍可能拒绝访问该包——因为 javax.sql.rowset 属于 可选的、需按需启用的平台模块。
✅ 推荐解决方案(适配 Maven + JDK 19)
方案 1:纯编译级修复(推荐初学者/快速验证)
确保 pom.xml 中明确指定 Java 版本为 19,并启用 --add-modules 编译参数(Maven 配置):
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>19</source>
<target>19</target>
<compilerArgs>
<arg>--add-modules</arg>
<arg>java.sql.rowset</arg>
</compilerArgs>
</configuration>
</plugin>同时修正 Java 文件中的导入语句:
立即学习“Java免费学习笔记(深入)”;
package searcher; // ✅ 正确:导入具体类(最清晰、无歧义) import javax.sql.rowset.CachedRowSet; import javax.sql.rowset.RowSetProvider; // 常用配套类 import java.sql.*;
? 提示:避免 import javax.sql.rowset.*; 在大型项目中滥用,易引发命名冲突且降低可读性;优先按需导入具体类。
方案 2:模块化项目(推荐长期维护项目)
添加 src/main/java/module-info.java:
module searcher {
requires java.sql;
requires java.sql.rowset; // ? 显式声明依赖
requires mysql.connector.java;
exports searcher;
}此时 import javax.sql.rowset.CachedRowSet; 可直接使用,无需额外 JVM 参数。
? 验证示例代码
以下是一个最小可用的 CachedRowSet 初始化片段(需配合有效 Connection):
public static CachedRowSet createCachedRowSet(Connection conn) throws SQLException {
CachedRowSet crs = RowSetProvider.newFactory().createCachedRowSet();
crs.setCommand("SELECT id, name FROM users");
crs.setDataSourceName("java:comp/env/jdbc/MyDB");
crs.execute(conn); // 或使用 setUrl/setUsername/setPassword 后 execute()
return crs;
}⚠️ 注意事项与避坑指南
- 不要混淆大小写:包名是 javax.sql.rowset(全小写),而接口名是 CachedRowSet(大驼峰);import javax.sql.Rowset;(错误大写 R)或 import javax.sql.rowset;(缺 .*)均会失败。
- VS Code 配置同步:确认 .vscode/settings.json 中 "java.jdt.ls.java.home" 指向 JDK 19 安装路径,并重启 Java Language Server(Cmd/Ctrl + Shift + P → “Java: Restart Language Server”)。
- Maven 清理缓存:执行 mvn clean compile 而非仅 mvn compile,避免旧 classpath 干扰。
- 替代方案考虑:CachedRowSet 已多年未更新,生产环境建议评估现代替代方案(如 Apache Commons DbUtils + 自定义 DTO 列表,或 Spring JDBC 的 JdbcTemplate.queryForList())。
✅ 总结
javax.sql.rowset 不可访问的本质是 模块可见性 + 语法规范 双重约束。解决它只需两步:
- 修正导入语句为 import javax.sql.rowset.CachedRowSet;(或 .*);
- 在构建配置中通过 --add-modules java.sql.rowset 显式启用该模块。
此举既兼容 JDK 19 的强封装特性,又保持代码简洁性与可移植性。











