Google App Engine Maven构建报错:DataNucleus增强器非零退出码求助
我之前也碰到过一模一样的问题——Java 7无构建工具的环境跑的好好的,换到Java 8搭配Maven的新项目就炸了,折腾了好一阵才搞定,给你几个排查和解决的方向:
锁定兼容Java 8的DataNucleus版本
老版本的DataNucleus增强器对Java 8的新语法(比如Lambda、默认方法)支持很差,你得确保用到的datanucleus-core、datanucleus-api-jdo、datanucleus-maven-plugin都是3.2.x及以上的版本。可以在pom.xml里统一配置版本:<properties> <datanucleus.version>3.2.10</datanucleus.version> </properties>调整Maven增强插件的核心配置
有时候插件没正确适配Java 8环境,建议在插件配置里加上fork参数强制独立进程执行,同时指定Java运行参数,还能开verbose看详细报错:<plugin> <groupId>org.datanucleus</groupId> <artifactId>datanucleus-maven-plugin</artifactId> <version>${datanucleus.version}</version> <configuration> <fork>true</fork> <javaArguments>-Djava.awt.headless=true -Xmx512m</javaArguments> <verbose>true</verbose> <enhancerName>ASM</enhancerName> <api>JDO</api> </configuration> <executions> <execution> <phase>process-classes</phase> <goals> <goal>enhance</goal> </goals> </execution> </executions> </plugin>开启
verbose后能直接看到是哪个实体类增强失败,方便精准定位问题。排查实体类的Java 8语法问题
如果你的实体类里用了Java 8的默认方法、Lambda表达式这类新特性,老版增强器根本处理不了。要么把这些特性从实体类里移除,要么直接升级到DataNucleus 4.x版本(对Java 8支持更完善)。另外也要检查JDO注解有没有写错,比如@Persistent的属性配置错误也会导致增强器崩溃。清理Maven缓存后重新构建
有时候本地Maven仓库的依赖包损坏也会出奇怪的错,执行下面的命令清理缓存并重新下载依赖:mvn clean install -U也可以手动删除
~/.m2/repository/org/datanucleus目录下的所有文件,再重新构建。检查GAE Maven插件版本
确保你用的appengine-maven-plugin是1.9.60及以上的版本,老版本的GAE插件对Java 8的支持也有缺陷,会间接影响DataNucleus的增强流程。
我当时是升级DataNucleus版本加上调整插件配置搞定的,你按照上面的步骤一步步排查,应该能解决这个非零退出码的问题。
内容的提问来源于stack exchange,提问作者thecodecentre

