JDK10下Cloud Endpoint项目Maven编译TypeTags错误排查与解决
问题原因分析
这个编译错误Fatal error compiling: java.lang.ExceptionInInitializerError: com.sun.tools.javac.code.TypeTags的核心原因是你使用的旧版Cloud Endpoints Framework(2.0.8)与JDK10不兼容:
com.sun.tools.javac.code.TypeTags是JDK8及更早版本中的内部API类,JDK9及以后的版本已经移除了这个类(改为使用com.sun.tools.javac.code.TypeTag单例枚举)。- 旧版Endpoints Framework依赖这个内部类处理注解编译逻辑,在JDK10环境下尝试加载不存在的类时就会抛出初始化异常。
- 虽然你在pom.xml中指定了
maven.compiler.source和target为1.8,但这仅控制编译生成的字节码版本,无法解决依赖库对JDK内部API的调用问题。
解决方法
根据优先级推荐以下几种方案:
方案1:升级Cloud Endpoints Framework到兼容JDK9+的版本
这是最稳妥、长期有效的解决方案,步骤如下:
- 更新pom.xml中的Endpoints相关版本,推荐升级到2.2.0及以上(该版本开始支持JDK9+):
<properties> <!-- 升级Endpoints版本 --> <endpoints.framework.version>2.2.2</endpoints.framework.version> <endpoints.management.version>1.0.14</endpoints.management.version> <!-- 其他属性保持不变 --> </properties>
- 同步更新
endpoints-management-control-appengine-all依赖的版本,确保与endpoints.management.version一致:
<dependency> <groupId>com.google.endpoints</groupId> <artifactId>endpoints-management-control-appengine-all</artifactId> <version>${endpoints.management.version}</version> </dependency>
- 同时建议升级
appengine-api-1.0-sdk到较新版本,比如1.9.87(与新Endpoints版本兼容更好)。 - 重新执行
mvn clean package,问题应该就能解决。
方案2:降级JDK到JDK8
如果暂时无法升级Endpoints框架,可以将JDK版本降级到JDK8:
- 卸载当前的JDK10,安装JDK8(Oracle JDK8或OpenJDK8均可)。
- 配置Maven使用JDK8(可以通过
JAVA_HOME环境变量指定,或者在pom.xml中添加maven.compiler.plugin明确指定JDK路径)。 - 重新编译项目,旧依赖在JDK8环境下可以正常工作。
方案3:临时绕过JDK内部API限制(不推荐)
如果以上两种方案都暂时无法实施,可以尝试添加JVM参数允许访问内部API,但这只是临时方案,后续JDK版本可能完全禁止这种访问:
在pom.xml中添加maven-compiler-plugin配置,加入--add-exports参数:
<build> <plugins> <!-- 其他插件保持不变 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> <compilerArgs> <arg>--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED</arg> </compilerArgs> </configuration> </plugin> </plugins> </build>
注意:这种方法可能会带来兼容性和安全风险,仅作为临时过渡方案使用。
内容的提问来源于stack exchange,提问作者Azeem Haider
相关产品推荐
相关产品推荐

