Groovy程序打包为Jar后java.util.Date.format()方法异常求助
问题解决:Groovy打包Jar后Date.format()方法缺失异常
核心原因
Groovy为java.util.Date提供的format(String)方法属于groovy-dateutil扩展模块,该模块通过META-INF/services/org.codehaus.groovy.runtime.ExtensionModule配置文件注册增强方法。打包成可执行Jar时,若未正确包含该配置文件或合并扩展模块信息,JVM无法识别Groovy的动态增强方法,从而抛出MissingMethodException。
解决方案
1. 确认依赖包含groovy-dateutil模块
Groovy 4.x开始,部分扩展模块从核心包中拆分,需显式引入:
- Gradle依赖配置:
implementation 'org.codehaus.groovy:groovy-dateutil:4.0.18' - Maven依赖配置:
<dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-dateutil</artifactId> <version>4.0.18</version> </dependency>
2. 修复IntelliJ打包配置
检查Artifact输出配置,确保扩展模块的配置文件被正确包含:
- 打开IntelliJ的
File > Project Structure > Artifacts - 选中你的可执行Jar配置,切换到
Output Layout标签 - 找到
groovy-dateutil-4.0.18.jar,展开并确认META-INF/services目录及其下的org.codehaus.groovy.runtime.ExtensionModule文件被包含 - 若存在多个Jar包含同名配置文件,右键文件选择
Merge设置合并策略
3. 临时绕过方案:显式调用扩展方法
若打包配置暂时无法调整,可直接调用Groovy扩展类的静态方法,绕开动态加载机制:
import groovy.time.DateGroovyMethods static String timestamp() { return DateGroovyMethods.format(new Date(), "yyyy-MM-dd HH:mm:ss") }
4. 使用构建工具打包(推荐)
改用Gradle Shadow或Maven Shade插件打包,它们会自动处理扩展模块的配置文件合并:
- Gradle Shadow插件示例配置:
执行plugins { id 'groovy' id 'com.github.johnrengelman.shadow' version '8.1.1' } repositories { mavenCentral() } dependencies { implementation 'org.codehaus.groovy:groovy-all:4.0.18' implementation 'org.codehaus.groovy:groovy-dateutil:4.0.18' } shadowJar { mergeServiceFiles() // 关键:合并扩展模块配置文件 manifest { attributes 'Main-Class': 'com.yourpackage.MainClass' // 替换为你的主类路径 } }./gradlew shadowJar生成可执行Jar,运行java -jar build/libs/your-project-all.jar即可正常使用扩展方法。
内容的提问来源于stack exchange,提问作者H. Dog
相关产品推荐
相关产品推荐

