GWT测试报错:No source code is available for type org.json.JSONObject/JSONArray 问题求助
看起来你在给GWT的HttpClient库编写独立测试模块时,遇到了JSON类找不到的问题,我来帮你梳理下可能的问题点和解决办法!
首先先把你的配置和问题信息整理清楚,方便排查:
你的现有配置
1. HttpClient.gwt.xml(主模块)
<module> <inherits name="com.google.gwt.core.Core"/> <inherits name="com.google.gwt.user.User"/> <inherits name="com.google.gwt.i18n.I18N"/> <inherits name="com.google.gwt.json.JSON"/> <inherits name="com.google.common.collect.Collect"/> <inherits name="io.reactivex.RxJava"/> <inherits name="org.JSON"/> <inherits name="elemental2.dom.Dom"/> <set-property name="gwt.logging.enabled" value="TRUE"/> <source path="client"/> </module>
2. HttpClientTest.gwt.xml(测试模块)
<module rename-to="HttpTest"> <inherits name="com.mycompany.http.HttpClient"/> <source path="client"/> </module>
3. JSON.gwt.xml(自定义JSON模块)
路径:src/main/java/org/JSON.gwt.xml
<module rename-to="JSON"> <inherits name="com.google.gwt.core.Core"/> <inherits name="com.google.gwt.user.User"/> <inherits name="com.google.gwt.i18n.I18N"/> <inherits name="com.google.gwt.json.JSON"/> <set-property name="gwt.logging.enabled" value="TRUE"/> <source path="json"/> </module>
4. 项目结构
JSON library src/ main/ java/org/JSON.gwt.xml java/org/json/JSONObject.java java/org/json/JSONArray.java HttpClient library src/ main/ java/com/mycompany/http/HttpClient.gwt.xml java/com/mycompany/http/client/HttpClient.java test/ java/com/mycompany/http/client/HttpClientTest.java
错误信息
[ERROR] Line 62: No source code is available for type org.json.JSONObject; did you forget to inherit a required module? [ERROR] Line 86: No source code is available for type org.json.JSONArray; did you forget to inherit a required module?
问题排查与解决办法
我分析下来,最可能的问题和对应的解决步骤如下:
1. 核心问题:JSON.gwt.xml未被加入类路径
Maven(或其他构建工具)默认只会把src/main/resources下的文件复制到编译后的classpath中,而你把JSON.gwt.xml放在了src/main/java/org/目录下,这个文件不会被自动复制到classpath里,导致GWT在运行/编译时根本找不到你的org.JSON模块!
解决办法:
有两种方式处理:
- 方式一:把
JSON.gwt.xml移动到src/main/resources/org/目录下,这样Maven会自动把它加入classpath。 - 方式二:修改Maven的pom.xml,配置让
src/main/java下的.gwt.xml文件被当作资源复制:
<build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.gwt.xml</include> </includes> </resource> <resource> <directory>src/main/resources</directory> </resource> </resources> </build>
2. 验证模块继承的正确性
虽然你的主模块已经继承了org.JSON,但可以在测试模块中显式添加一次继承,确保GWT不会因为模块加载顺序问题遗漏:
修改HttpClientTest.gwt.xml:
<module rename-to="HttpTest"> <inherits name="com.mycompany.http.HttpClient"/> <inherits name="org.JSON"/> <!-- 显式添加这一行 --> <source path="client"/> </module>
3. 确认代码中的导入语句
检查你的HttpClient.java和HttpClientTest.java中,导入的是自定义的org.json.JSONObject/JSONArray,而不是GWT自带的com.google.gwt.json.client.JSONObject,避免类名冲突导致的识别错误。
4. 验证模块的source路径配置
你的JSON.gwt.xml中<source path="json"/>是正确的:因为模块文件在org包下,source path设为json后,GWT会自动映射到org/json目录(也就是你的JSONObject.java所在的位置),这部分没问题。
最后验证
做完上述修改后,你可以用GWT的verbose模式(加上-v参数)运行测试,查看GWT的模块加载日志,确认org.JSON模块是否被成功加载,这样就能快速定位是否还有其他问题。
内容来源于stack exchange

