Java9迁移遇groovy-maven-plugin报错:java.io.File无canonicalFile属性
canonicalFile属性错误 问题分析
你碰到的这个错误核心原因是旧版本的Groovy(2.4.13)和groovy-maven-plugin(2.0)不兼容Java9。Java9引入了模块系统(JPMS),同时对java.io.File的内部访问逻辑做了调整,而Groovy 2.4.x系列完全没针对Java9做适配,导致插件运行时找不到canonicalFile这个属性。
另外需要注意,这个老旧的Groovy依赖是从nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect:1.4.0间接带进来的,该版本的布局方言依赖的Groovy版本太老,压根不支持Java9及以上环境。
解决方案
方案1:升级thymeleaf-layout-dialect到兼容Java9的版本
最省心的方式是直接把thymeleaf-layout-dialect升级到依赖新Groovy版本的版本,比如2.4.1(这个版本依赖Groovy 2.5.x,完美支持Java9+)。在你的pom.xml里更新依赖:
<dependency> <groupId>nz.net.ultraq.thymeleaf</groupId> <artifactId>thymeleaf-layout-dialect</artifactId> <version>2.4.1</version> </dependency>
升级后它会自动引入兼容Java9的Groovy版本,同时也能避免插件和依赖的Groovy版本冲突。
方案2:排除旧Groovy依赖并手动引入兼容版本
如果暂时没法升级thymeleaf-layout-dialect,可以在依赖里先排除旧的Groovy,再手动添加支持Java9的Groovy版本(推荐2.5.x系列,比如2.5.18):
<dependency> <groupId>nz.net.ultraq.thymeleaf</groupId> <artifactId>thymeleaf-layout-dialect</artifactId> <version>1.4.0</version> <exclusions> <exclusion> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy</artifactId> </exclusion> </exclusions> </dependency> <!-- 手动引入兼容Java9的Groovy版本 --> <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy</artifactId> <version>2.5.18</version> </dependency>
方案3:升级groovy-maven-plugin版本
如果上面两个方案试了还是有问题,就得确保groovy-maven-plugin用的是支持Java9的版本。因为你项目pom里没声明这个插件,大概率是父pom或者其他依赖带进来的,你可以在pom的build/plugins块里显式声明更新后的插件版本:
<build> <plugins> <plugin> <groupId>org.codehaus.gmaven</groupId> <artifactId>groovy-maven-plugin</artifactId> <version>2.1.1</version> <!-- 该版本支持Java9 --> <executions> <execution> <id>generate-deploy-files</id> <goals> <goal>execute</goal> </goals> <!-- 保留原有的执行配置 --> </execution> </executions> </plugin> </plugins> </build>
验证
修改完成后,执行以下命令清理并重新构建项目:
mvn clean install
应该就能解决No such property: canonicalFile for class: java.io.File的错误了。
内容的提问来源于stack exchange,提问作者Arar

