38

我正在尝试编写一个 Gradle 任务,它将生成的战争文件复制到我的本地 tomcat 实例:

这不起作用,我不确定如何调试它:

 task deploylocal() << {
    println "Copy from ${buildDir}\\libs into ${tomcatHome}/webapps"
    copy{
      from "${buildDir}\\libs"
      into "${tomcatHome}/webapps"
      include '*.war'
    }
  }

关于下一步做什么的任何想法?

4

9 回答 9

51

WAR 任务知道它生成的工件。

task deployToTomcat(type: Copy) {
    from war.archivePath
    into "${tomcatHome}/webapps"
}
于 2011-01-15T05:19:03.360 回答
14

我通过以下方式完成了这项工作:

task deploy (dependsOn: war){
    copy {
        from "build/libs"
        into "C:/dev/jetty-distribution-9.1.4.v20140401/webapps"
        include "*.war"
    }
}

像这样运行它:

gradle deploy
于 2014-04-27T12:40:42.830 回答
12

你当然可以使用 tomcat 插件。我的设置阻止我使用/修改开箱即用的战争和 tomcat 选项。

我个人喜欢以下风味(从我的 build.gradle 复制)。

tomcat_home='tomcat_location'
tomcat_bin=tomcat_home + '/bin'
tomcat_start=tomcat_bin + '/startup.sh'
tomcat_stop=tomcat_bin + '/shutdown.sh'
tomcat_webapps = tomcat_home + '/webapps'

task tom << {
    if (project.hasProperty('start')) {
        startTom()
    } else if (project.hasProperty('stop')) {
        stopTom()
    } else if (project.hasProperty('deployNstart')) {
        stopTom()
        webappsCopy()
        startTom()
    } else {
        throw new RuntimeException('unrecognized option')
    }
}

def stopTom() {
    executeCmd(tomcat_stop)
}

def startTom() {
    executeCmd(tomcat_start)
}


def executeCmd(command) {
    proc = command.execute()
    proc.waitFor()
}

def webappsCopy() {
    copy {
        from 'war file location' // could be exploded or war itself
        into tomcat_webapps
    }
}

-- 您从命令行调用包含在“tom”任务中的各种选项 --

$ gradle tom -Pstart
$ gradle tom -Pstop
$ gradle tom -PdeployNstart

随着我添加更多与 Tomcat 相关的命令/选项,这可能会进一步增长。几点建议:

  1. 将位置等移动到 gradle.properties 以便它可以在不同的环境中工作。
  2. 轮询您的 tomcat 服务器端口以微调选项和消息。
  3. 移至可以重用的插件/任务代码。

这个限量版现在对我有用:-)

于 2011-12-20T00:52:05.520 回答
7

或者,您可以利用gradle-tomcat-plugin

于 2011-03-06T21:15:08.697 回答
7

你可以试试 Gradle Cargo 插件。它允许您将 WAR 文件部署到本地和远程 Tomcat。

于 2011-06-15T20:44:54.327 回答
1

请确保战争档案在deploylocal执行之前被捆绑。也许,你可以定义一个依赖:

task deploylocal(dependsOn: build) << {

注意 java 插件中有一个约定属性,名为libsDir. 它允许您以更好的方式引用 build/libs 目录:

 task deploylocal(dependsOn: build) << {
    println "Copy from ${libsDir.getPath()} into ${tomcatHome}/webapps"
    copy{
      from libsDir
      into "${tomcatHome}/webapps"
      include '*.war'
    }
  }
于 2010-11-18T12:05:14.463 回答
1

实际上后来用 gradle 的 cargo 插件替换了这个功能并运行了部署

gradle cargoRunLocal
于 2014-05-04T14:18:33.623 回答
1

如果你已经有战争插件,你也可以添加

war.doLast {
    copy {
        from war.archiveFile
        into "${tomcatHome}/webapps"
    }
}

然后,您将始终在每次构建 war 文件时自动部署。

于 2020-07-24T16:09:12.857 回答
0

首先,尝试调试。检查任务执行的顺序;看看它是否在生成war文件后运行。还有它是否说是最新的。

问题可能是此任务与您要复制的输出之间缺乏任何依赖关系。

尝试用 Copy 任务的实例替换此常规任务,并使其依赖于您尝试复制的 war 文件。

像这样的东西:

task deployLocal(type: Copy) { 
    dependsOn configurations.archives.buildArtifacts
    from configurations.archives.allArtifacts*.file 
    into("$tomcatHome/webapps") 
}
于 2010-11-20T11:28:41.843 回答