为何Eclipse编译Xtend代码正常,命令行编译却报缺失类型错误?
问题场景
Eclipse中编译Xtend代码无异常,但执行以下命令行编译指令时报错:
java -cp .\lib\* org.eclipse.xtend.core.compiler.batch.Main -d .\bin -useCurrentClassLoader -encoding UTF-8 .\ara-configruator\com.ap.diag .\ara-configurator\com.ap.module .\ara-configurator\com.ap.service
报错信息:
0 [main] ERROR org.eclipse.xtend.core.compiler.batch.XtendBatchCompiler -
Error: X_Typed_Data_Identifier_h.xtend - D:\AP_git\antTest\ara-configurator\com.ap.diag\src\com\ap\generator_V2\X_Typed_Data_Identifier_h.xtend
101: The method getDiagReadDidList() from the type InforOfArxml refers to the missing type Object
已确认InforOfArxml类中存在getDiagReadDidList()方法,但错误依然触发。
解决方案
1. 补充JDK核心类库到Classpath
Eclipse会自动引入JDK核心类库,但命令行编译时仅指定.\lib\*可能遗漏了JDK核心类(比如Object类所在的库)。
- JDK 8及以下:在classpath中添加JDK安装目录下的
jre/lib/rt.jar,修改后的命令示例(Windows环境):java -cp ".\lib\*;%JAVA_HOME%\jre\lib\rt.jar" org.eclipse.xtend.core.compiler.batch.Main -d .\bin -useCurrentClassLoader -encoding UTF-8 .\ara-configruator\com.ap.diag .\ara-configurator\com.ap.module .\ara-configurator\com.ap.service - JDK 9+:直接通配匹配JRE lib目录即可:
java -cp ".\lib\*;%JAVA_HOME%\jre\lib\*" org.eclipse.xtend.core.compiler.batch.Main -d .\bin -useCurrentClassLoader -encoding UTF-8 .\ara-configruator\com.ap.diag .\ara-configurator\com.ap.module .\ara-configurator\com.ap.service
2. 调整或移除-useCurrentClassLoader参数
-useCurrentClassLoader会让Xtend编译器使用当前JVM的类加载器,若该类加载器未正确加载JDK核心类,会导致找不到Object。可以尝试:
- 直接移除该参数,让编译器使用自身默认的类加载策略
- 确保当前JVM的类加载器能访问到JDK核心类库
3. 确认依赖类的编译状态与路径
- 确保
InforOfArxml类已被正确编译,其.class文件位于.\bin目录或命令行classpath可访问的位置 - 先单独编译
InforOfArxml所在的模块,再编译依赖它的模块
4. 调整模块编译顺序
命令行中指定的模块顺序若不合理(比如依赖模块先于被依赖模块编译),会导致编译时找不到类。调整顺序,先编译包含InforOfArxml的模块,再编译com.ap.diag模块。
5. 清理旧编译产物后重新编译
删除.\bin目录下所有文件,清理旧的class文件冲突,再重新执行命令行编译指令。
内容的提问来源于stack exchange,提问作者SiYuan Zhang

