Gradle在完成ant调用后离开java进程

Gradle在完成ant调用后离开java进程,ant,gradle,Ant,Gradle,我正在迁移到gradle的过程中,我们的一个模块是gradle模块。该模块有两个当前使用ant构建的依赖项,即ant-module-1和ant-module-2 在我的gradle模块build.gradle中,我有以下条目: task packageAntModule1(type: GradleBuild) { buildFile = 'antModule1.gradle' tasks = ['clean', 'package'] } task packageAntModul

我正在迁移到gradle的过程中,我们的一个模块是gradle模块。该模块有两个当前使用ant构建的依赖项,即ant-module-1ant-module-2

在我的gradle模块build.gradle中,我有以下条目:

task packageAntModule1(type: GradleBuild) {
    buildFile = 'antModule1.gradle'
    tasks = ['clean', 'package']
}

task packageAntModule2(type: GradleBuild) {
    buildFile = 'antModule2.gradle'
    tasks = ['clean', 'package']
}

compileJava.dependsOn(['packageAntModule1', 'packageAntModule2'])
两个文件antModule1.gradle和antModule2.gradle非常简单:

antModule1.gradle:
ant.importBuild '../ant-module1/build.xml'

antModule2.gradle:2
ant.importBuild '../ant-module2/build.xml'
我可以在日志中看到,作为构建gradle模块的一部分,ant-module1目标被执行,然后转到构建ant-module2。但是,这会导致崩溃,因为无法删除在构建ant-module1时创建的临时文件。查看java进程,我可以看到第一次ant调用打开的java进程仍然保存着我的临时文件(加载一些自定义ant任务)

所以我的问题是,在完成所需目标的执行之后,如何告诉gradle完成ant JVM

任何关于如何解决我的两个ant依赖关系的其他建议也将不胜感激。通过artifactory或nexus指向maven存储库不是一个选项,因为我们的ant构建不使用ivy,这实际上是我们迁移到gradle的主要原因

除此之外,gradle构建失败后,ant启动的java进程仍处于活动状态,您必须手动杀死它们

提前感谢您的投入

更新以添加渐变版本

$gradle -version
------------------------------------------------------------
Gradle 2.4
------------------------------------------------------------
Build time:   2015-05-05 08:09:24 UTC
Build number: none
Revision:     5c9c3bc20ca1c281ac7972643f1e2d190f2c943c

Groovy:       2.3.10
Ant:          Apache Ant(TM) version 1.9.4 compiled on April 29 2014
JVM:          1.8.0_40 (Oracle Corporation 25.40-b25)
OS:           Windows 7 6.1 amd64

能否移动
taskdef
,使其在ant任务中声明?这样,类加载器在每次启动时都应该被丢弃

我假设
taskdef
是在根级别定义的,因此类加载器在ant模型在内存中的整个时间都保存在内存中


另一种解决方法可能是将jar复制到一个临时位置,该位置与packageAntModule1和packageAntModule2不同。

能否移动
taskdef
以便在ant任务中声明它?这样,类加载器在每次启动时都应该被丢弃

我假设
taskdef
是在根级别定义的,因此类加载器在ant模型在内存中的整个时间都保存在内存中



另一种解决方法可能是将jar复制到一个临时位置,该位置与packageAntModule1和packageAntModule2不同。

如何在ant任务中创建临时文件?我怀疑
flush()
close()
没有在
finally
block中调用。不是这样的。该文件不是由自定义ant任务创建的。该文件是保存自定义ant任务的jar。ant-module1和ant-module2都需要访问该jar中的某些任务。当您执行此操作时,我们常见的构建结构有一个
。MyCustomTask.jar加载到内存中,问题是第一次ant调用在完成时没有释放该文件。因此,它无法在已打开的文件上复制MyCustomTask.jar。您使用的是哪个版本的gradle?听起来你可能正在点击v1.12中修复的内容是的,听起来像我的案例,但我不确定修复是如何实现的。我的gradle构建中有两个ant调用,如果我理解得很好,
fireBuildFinished()
调用将在gradle构建结束时完成。如果我的假设是正确的,那么这对我没有帮助。更好的修复方法是在每次ant调用结束时而不是在gradle构建结束时使用
fireBuildFinished()
。在将复杂的ant构建迁移到gradle时,这可能是一个严重的问题。如何在ant任务中创建临时文件?我怀疑
flush()
close()
没有在
finally
block中调用。不是这样的。该文件不是由自定义ant任务创建的。该文件是保存自定义ant任务的jar。ant-module1和ant-module2都需要访问该jar中的某些任务。当您执行此操作时,我们常见的构建结构有一个
。MyCustomTask.jar加载到内存中,问题是第一次ant调用在完成时没有释放该文件。因此,它无法在已打开的文件上复制MyCustomTask.jar。您使用的是哪个版本的gradle?听起来你可能正在点击v1.12中修复的内容是的,听起来像我的案例,但我不确定修复是如何实现的。我的gradle构建中有两个ant调用,如果我理解得很好,
fireBuildFinished()
调用将在gradle构建结束时完成。如果我的假设是正确的,那么这对我没有帮助。更好的修复方法是在每次ant调用结束时而不是在gradle构建结束时使用
fireBuildFinished()
。在将复杂的ant构建迁移到gradle时,这可能是一个严重的问题。谢谢Lance。它确实在ant目标中包含taskdef(我想这就是你说的“在ant任务中”的意思)我仍然认为这是一个gradle问题,在完成ant调用后不关闭ant JVM,而是将其留给完整的gradle构建的结束。您可以通过观察java进程如何随着gradle构建的发展而创建和关闭来了解它。Ant完全集成到gradle中,并在gradle JVM中运行,因此Ant JVM不能“关闭”。如果希望ant在单独的JVM中运行,可以通过任务调用ant。这将需要在构建机器上安装ant,并且您将失去所有ant/gradle集成的优点。为什么罐子需要中途更换?为什么jar不能在创建
taskdef
(s)时是最终的呢?不确定你为什么说是hacky。如果你回到我最初的问题,我有两个build.xml文件需要运行“cleanpackage”。罐子是最终的,不会再作为一部分进行更改