Gradle Launch4j:创建Launch4jLibraryTask触发Project.afterEvaluate错误求助
解决Launch4j插件创建第二个可执行文件的报错问题
错误原因
手动注册Launch4jLibraryTask时,任务构造函数内部会调用Project.afterEvaluate(),如果任务注册时机晚于项目评估阶段,就会触发Cannot run Project.afterEvaluate(Closure) when the project is already evaluated错误。
解决方案
方法1:使用插件扩展的tasks容器创建任务(推荐)
这是插件官方支持的多任务创建方式,插件会自动处理任务创建的时机,避免afterEvaluate冲突:
plugins { id("edu.sc.seis.launch4j") version "2.5.4" application // 确保引入application插件(按需添加) } // 配置默认的Launch4j可执行文件任务 launch4j { mainClassName = "com.example.Main" outputDir = file("build/exe/main") // 其他配置项,如icon、jreMinVersion等 } // 创建第二个可执行文件任务 launch4j.tasks.create("createSecondExe") { mainClassName = "com.example.SecondMain" outputDir = file("build/exe/second") // 自定义第二个任务的配置 }
方法2:提前在beforeEvaluate中注册任务
如果必须手动注册Launch4jLibraryTask,将任务注册逻辑放在project.beforeEvaluate()块中,确保任务在项目评估开始前被创建:
plugins { id("edu.sc.seis.launch4j") version "2.5.4" application } project.beforeEvaluate { tasks.register<Launch4jLibraryTask>("createSecondExe") { mainClassName = "com.example.SecondMain" outputDir = file("build/exe/second") // 任务配置 } } // 配置默认任务 launch4j { mainClassName = "com.example.Main" outputDir = file("build/exe/main") }
注意事项
- 优先使用方法1,因为插件的tasks容器会维护任务间的依赖关系,避免手动注册可能带来的逻辑遗漏。
- 确保
mainClassName对应的类在项目编译产物中存在,否则会导致后续打包失败。
内容的提问来源于stack exchange,提问作者G. Tabs
相关产品推荐
相关产品推荐

