如何从grails可执行jar / war运行自定义grails命令

时间:2017-03-29 17:00:51

标签: grails

我正在使用grails 3.2.8。我正在从我的grails项目中生成一个可执行的war文件,其中包含Web功能。但是,我还编写了一些自定义grails命令,我希望能够从可执行jar / war中生成(作为cron作业),我使用相同的grails项目构建。我可以在我的开发环境中以“grails run-cmd ...”运行它们,但我希望能够部署可执行jar / war文件并从可执行jar / war运行自定义命令。换句话说,我想将web内容的war文件部署到一个服务器,我想从一个grails项目为一些cron作业部署一个可执行jar文件。我知道如何构建/运行war文件 - grails使这很简单。但是,我真的不知道如何从我的项目生成可执行jar文件,允许我将自定义grails命令作为cron作业运行。谁能告诉我怎么做?

1 个答案:

答案 0 :(得分:2)

我找到了似乎有用的东西。我已经在我的grails项目中修改了Application.groovy类,如下所示:

import grails.boot.GrailsApp
import grails.boot.config.GrailsAutoConfiguration
import grails.ui.command.GrailsApplicationContextCommandRunner

class Application extends GrailsAutoConfiguration {
  static void main(String[] args) {
    if (args.length > 0 && args[0] == "run-command") {
      // If the first argument is 'run-command', then we just want to run a command as if we were running
      // 'grails run-command <grails-custom-command> <args>...'. We are adding the capability of running commands here
      // because this is the class that is run from the executable war generated by running 'grails war'. If we just do the same
      // thing that grails does to run a command, then the commands seem to execute just fine.
      args = args.tail()
      // The following code is copied from GrailsApplicationContextCommandRunner.main(). It is what grails does to make
      // 'grails run-command' work from the grails console/command line. When upgrading grails, it may be necessary to update
      // this code...
      def runner = new GrailsApplicationContextCommandRunner(args[0], Application)
      runner.run(args)
    } else {
      GrailsApp.run(Application, args)
    }
  }
}

我还将build.gradle中的依赖项从grails-console依赖项从“console”更改为“compile”:

compile "org.grails:grails-console" // changed from 'console' dependency since we want to be able to run custom grails commands from the executable jar/war

这是因为GrailsApplicationContextCommandRunner类在grails-console中。

通过这些更改,我仍然可以使用以下命令运行war文件:

java -jar myWarFile.war

但是,我现在也可以使用完全相同的war文件运行我的自定义命令,如下所示:

java -jar myWarFile.war run-command my-command <command args>

似乎应该有更好的方法来实现这一点,所以如果grails团队会发表评论(如果没有更好的方法,那么grails团队应该考虑添加来自可执行war文件作为grails功能请求),但我似乎能够以这种方式从可执行war文件中运行我的自定义命令。