添加javax.json类路径后OpenJDK11编译报找不到符号问题
问题原因与解决方案
你不需要将jar包放置到指定特殊路径,编译报错和jar存放位置无关,核心问题是代码写法错误,另外还存在一个运行时依赖遗漏的隐患,具体修正方案如下:
1. 修正代码语法错误
你的代码有两处直接导致编译失败的语法问题:
- 类名拼写错误:你导入的JSON对象类是
javax.json.JsonObject,代码中错写为JSONObject(Java是大小写敏感语言,类名大小写不匹配就会报找不到符号) - 静态方法调用错误:
Json.createObjectBuilder()是静态工厂方法,直接通过类名调用即可,前面不能加new关键字。加了new之后编译器会把Json.createObjectBuilder识别为内部类名去查找,自然会报找不到类的错误。另外这个方法返回值类型是JsonObjectBuilder,不是最终的JsonObject,需要调用build()方法后才能得到JsonObject实例。
修正后的测试代码如下:
import javax.json.Json; import javax.json.JsonObject; import javax.json.JsonObjectBuilder; public class ns3_inputs { public static void main (String[] args) { JsonObjectBuilder builder = Json.createObjectBuilder(); builder.add("foo", "bar"); JsonObject obj = builder.build(); // 测试输出 System.out.println(obj.toString()); } }
也可以简化成链式写法:
JsonObject obj = Json.createObjectBuilder() .add("foo", "bar") .build();
2. 补全运行时依赖
你当前引入的javax.json-1.0.jar只是JSR-353(Java JSON处理规范)的API定义包,只包含接口没有具体实现,就算编译通过,运行时也会抛出Provider not found的错误。
你需要额外下载同版本的JSON实现包,将其和API包放在同一目录,配置CLASSPATH时把两个包都包含进去即可,不需要放到JDK扩展目录之类的特殊路径。如果不想分开下载两个包,也可以直接下载合并了API和实现的完整jar包,单独引入这一个包就能正常编译运行。
3. 正确的编译与运行命令
假设你的API包、实现包、Java源文件都放在/Diss/frontend/目录下,先配置CLASSPATH:
# 如果是分开的API+实现两个包,用冒号分隔多个jar路径 export CLASSPATH=/Diss/frontend/javax.json-1.0.jar:/Diss/frontend/javax.json-impl-1.0.jar
编译命令:
javac ns3_inputs.java
因为你已经把当前路径.和jar包路径都加入CLASSPATH了,不需要额外加-cp参数;如果临时不想配置全局CLASSPATH,也可以直接在编译运行时指定:
# 编译 javac -cp ".:javax.json-1.0.jar:javax.json-impl-1.0.jar" ns3_inputs.java # 运行 java -cp ".:javax.json-1.0.jar:javax.json-impl-1.0.jar" ns3_inputs
正常运行后会输出{"foo":"bar"},说明配置成功。
注:你开发桌面端应用用这个标准库完全适配,不需要依赖Android专属的JSON类。
内容的提问来源于stack exchange,提问作者Naruto
相关产品推荐
相关产品推荐

