从Eclipse启动Gradle构建

49

我们正在考虑将我们的Ant构建转换为Gradle。

关于与Eclipse的集成,我们正在寻找(概念上)相当于从IDE启动构建的功能。 Eclipse提供了一个不错的Ant视图来调用Ant目标。

有一个Eclipse插件可用于启动Gradle构建(http://www.breskeby.com/downloads/gradle/eclipse/update/),但似乎需要用户通过跳过一些步骤才能调用不同的目标(编辑启动配置等)。

其他人如何在Eclipse中使用Gradle?


这是我的做法:https://github.com/djangofan/WebDriverTestingTemplate - djangofan
13个回答

27

这篇文章有些旧了,但是SpringSource STS团队推出了一个插件:http://static.springsource.org/sts/docs/latest/reference/html/gradle/

安装指南可以在这里找到:http://static.springsource.org/sts/docs/latest/reference/html/gradle/installation.html

到目前为止,我的使用经验非常好。对于纯Java项目,它工作得非常好。我在使用Gradle插件时,通过Eclipse生成正确的war文件时遇到了一些问题,但是Gradle本身却做得很好。我对Gradle和该插件相对较新,可能是我漏掉了什么细节。


1
在Eclipse Juno中安装Spring Gradle Tooling插件非常容易。只需将常规的Juno软件存储库站点添加到您的安装源中,安装“市场”应用程序,重新启动Eclipse,然后使用市场应用程序安装Gradle和/或Groovy即可。 - djangofan
1
顺便说一下,我过去一年左右一直在使用IntelliJ,Gradle的集成非常棒!! - Keith P
个人而言,我认为IntelliJ中的“run-as”对于Gradle来说更难理解。很难向别人解释,但我认为Eclipse在这方面更容易上手。 - djangofan
@djangofan,听听您使用IntelliJ 13的经验会很有趣 - 特别是在Gradle集成方面得到了很大的改进。我再也回不去Eclipse了 :P - Keith P
在此基础上,我有需求并行运行多个gradle命令。我通过创建类型为“Launch Group”的Eclipse启动器来实现这一点。然后,当您点击添加时,您可以从Gradle Build命令中进行选择(如果您之前曾从STS Gradle Tasks运行过至少一次)。如果需要单个Gradle命令,则可以在“Run Configurations”下拉菜单中使用它。 - JCricket
显示剩余2条评论

25

对于那些害怕命令行的人,可以使用临时解决方案。

从Eclipse中,使用下拉菜单Run / External Tools / External Tools Configurations...

在左侧导航面板中选择"Program",然后单击工具栏上的"New launch configuration"按钮(我的工具栏中的第一个按钮)。

在选择了Main选项卡后,填写以下字段:

  1. 名称:(在选项卡上方)为“Gradle”(或您想要为启动器命名的任何名称)。
  2. 位置:使用"Browse File System..."按钮导航到你要运行的"gradle.bat"或"gradlew.bat"。
  3. 工作目录:使用"Browse Workspace..."按钮选择包含所需项目的"build.gradle"文件的目录。
  4. 参数:输入"--gui"

如果您使用的Gradle构建文件不是“build.gradle”,则添加参数"-b filename.gradle"。

完成后,您的开发人员可以使用Run / External Tools或工具栏按钮来启动Gradle Gui。他们可以在每次使用后关闭它,或者(为了避免启动延迟),将其最小化以节省空间。


这也是一个完全可接受的解决方案,也是从Eclipse运行外部工具的一般方式,而无需显式支持。然而,我仍然不明白OP在使用单独终端运行命令时遇到了什么问题。这样做可能更快。 - omnisis
1
同意omnisis的观点:我根本不认为这是一个“临时解决方案”。请注意,您可以直接调用gradle(或gradlew)传递“build”或“run”,而不必在GUI模式下运行。您可以将任何这些运行配置显示在“外部工具”下拉菜单中,以便快速访问。 - Hawkeye Parker
同意上面的评论...构建工具的整个目的就是将有时非常复杂的任务尽可能地简化为一两个简单的命令,比如"gradle build"或"gradle testCompile"等!如果你的gradle命令非常长,有很多参数和开关,并且你不断重复它,虽然在Linux终端和Windows DOS中都可以轻松重复一个命令,但你应该找到一个简单的CLI方式来避免输入长命令(例如一个新的任务或gradle.properties)。 - mike rodent

15

简短回答是我们不会从Eclipse中调用gradle脚本。

我相信这个网站详细介绍了当前的工作情况,但目前似乎没有太多进展。

我有点好奇你想要从Eclipse中运行哪些任务。为什么不从命令行中运行任务呢?


2
同意,那个插件似乎已经停滞不前了。我们的开发团队习惯于从Eclipse Ant Viewer中调用各种Ant目标(清理、构建、部署、单元测试等),我们的目标是实现一个概念上无缝的转换到Gradle。由于开发是在Windows机器上进行的,因此几乎没有什么命令提示符可言... - csl
@csl:我们团队大部分也是在Windows上开发,使用命令提示符中的Gradle没有问题。我建议您将这个“要求”放得低一些。我不想因为这个原因看到有人没有从Ant过渡到Gradle。所有这些功能总有一天会到来,如果您有机会,现在就应该进行转换 :) - c_maker
8
您好,我是您提供链接中实验性Gradle插件的作者。您说得对,我已经停止投入时间在这个Eclipse插件上,因为SpringSource STS团队开始开发一个插件。STS 2.7.2有相当不错的Gradle支持。我的插件的功能完全可以在STS插件中实现,但是STS Gradle插件的功能远远超出了它。实际上,我正在与他们合作,以获得更好的Gradle文件编辑器支持。这种编辑器支持基于Groovy Eclipse插件的新DSLD功能。 - Rene Groeschke
6
使用Eclipse来使用Gradle有很多原因。我认为正确的问题应该是,为什么要去单独的命令窗口调用Gradle。使用我的当前Ant设置,我可以使用快捷键自动运行上一个Ant目标,这非常方便。 - IcedDante
1
上下文切换是具有破坏性的,因此不好。如果您已经在命令行中,那很好。就我个人而言,我在Eclipse中开发,并期望能够直接从Eclipse构建。如果不支持该操作,那么我更喜欢不强制我离开Eclipse进行基本操作的工具。 - John Czukkermann
显示剩余3条评论

11

回答这个问题的最佳方式是使用Gradle自己的Eclipse插件Buildship:

http://projects.eclipse.org/projects/tools.buildship

这是由Gradle团队支持和开发的,并将在未来不断改进。它还可以处理较旧版本(其功能基于Gradle版本可用性)。

编辑 2017-03-01: 发布Buildship 2.0后,整合变得更好了,我推荐使用它(除非您已经在使用IntelliJ,那么您已经设置好了)。 仍然存在一些缺少的功能,例如直接调试JavaExec任务和运行precompile/preimport任务的能力,但这些都在他们的Github问题列表中。


8

我知道这是一个老问题,但我仍然不认为Eclipse能够为你运行gradle构建。如果您使用Spring Gradle插件,那么您可以定义外部工具构建器在您需要时运行gradle,这是一个很好的开始。如果您有很多项目都是用gradle构建的,您甚至可以让gradle为您的eclipse项目添加此功能。虽然这可能需要整理,但您可以在gradle构建文件中添加类似以下内容:

apply plugin: 'eclipse'

eclipse {
    project {
        // Store a copy of the desired Gradle_Builder.launch file in a top-level 'master'
        //    directory.  Then this code searches for it, and by copying it, 
        //    adds the launch file to the specifc project that will run gradle
        String launchFileNameOrig = '.externalToolBuilders/Gradle_Builder.launch'
        String launchFileName = launchFileNameOrig
        File launchFile = file(launchFileName)
        boolean needToCopy = false
        while (!launchFile.exists()) {
            launchFileName = '../' + launchFileName
            launchFile = file(launchFileName)
            needToCopy = true
        }
        if (needToCopy) {
             copy {
                from (launchFile)
                into '.externalToolBuilders'
            }
        }

        buildCommand 'org.eclipse.ui.externaltools.ExternalToolBuilder', LaunchConfigHandle: '<project>/'+launchFileNameOrig
        file {
            // when they made the "buildCommand" it looks like they left off 'triggers', so parse the XML until
            // the right place is found, then insert it.
            withXml {
                def projectNode = it.asNode()
                projectNode.iterator().each { subNode ->
                    String subNodeText = '' + subNode
                    if (subNodeText.startsWith('buildSpec')) {
                        subNode.iterator().each { buildCmd ->
                            String nameNode = buildCmd?.name
                            if (nameNode.contains('ExternalToolBuilder')) {
                                buildCmd.appendNode('triggers', 'full')
                            }
                        }
                    }
                }
            }
        }
    }

这是在目录层次结构顶部存储的文件内容: ./.externalToolBuilders/Gradle_Builder.launch。如此定义,只有在“clean”之后才会运行[相对于本机Java Builder,Gradle的时间成本更高,因此继续使用自动构建]。注意:下面的文件内容还假定您正在使用“git”和gradle包装器。您可以在ATTR_LOCATION值上看到这一点。按照需要进行调整。这种方法的一个好处是,您可以将gradle wrapper设置为任何版本的gradle,并且当eclipse运行时,它将使用该版本!
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="org.eclipse.ui.externaltools.ProgramBuilderLaunchConfigurationType">
<stringAttribute key="org.eclipse.debug.core.ATTR_REFRESH_SCOPE" value="${workspace}"/>
<booleanAttribute key="org.eclipse.debug.ui.ATTR_LAUNCH_IN_BACKGROUND" value="false"/>
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="${git_dir}/../gradlew"/>
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_RUN_BUILD_KINDS" value="full,"/>
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="assemble"/>
<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_TRIGGERS_CONFIGURED" value="true"/>
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${project_loc}"/>
</launchConfiguration>

5
您可以从eclipse中创建一个自定义的启动器,以调用您的Gradle构建。

2
您可以像FkYkko所说的那样使用Buildship。但是需要记住的一点是,Ant任务在Gradle中被视为一等公民。这意味着您可以简单地导入一个Ant构建脚本,以与引用Gradle任务相同的方式引用其任务。以这种方式操作,使您能够直接使用Ant任务,而无需将它们转换为Gradle任务。
例如,假设您在与build.gradle相同的目录中有一个名为build.xml的构建脚本,并且该构建脚本中有一个名为buildProj的任务。您可以导入build.xml,并像这样从build.gradle调用build proj:
task antDeps {
    ant.importBuild 'build.xml'
}

task buildAll (dependsOn:['buildProj']) {
    // the rest of your gradle task here.
}

查看更多信息,请参见thisthis

2

你说得很对。我希望我的团队不要那么落后,而是使用 IDEA。但他们仍然坚持使用 Eclipse。 - Maladec VampaYa

2

您可以使用Gradle Eclipse插件,例如gradle eclipse命令,从gradle项目生成Eclipse项目。它为生成的Eclipse项目添加了许多目标,并且高度可定制。


2
谢谢,但问题是关于从Eclipse调用Gradle - 而不是生成Eclipse项目。 - csl

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接