2013-05-22 2 views
4

Я использую Grails 2.1.0, и у меня есть класс Groovy, который я написал, который не зависит от сервисов, контроллеров или любого другого достоинства Grails. Он использует некоторые библиотеки .jar и другие классы, которые уже находятся в пути класса Grails.Как запустить класс Groovy из командной строки в среде Grails?

Я хочу:

  • Запуск Groovy класс (или класс Java, он не должен mattter) использовать другие библиотеки/классы, которые Grails уже имеет на своем пути к классам (не услуги, а не контролеры, ничего подобного).
  • быть в состоянии получить доступ аргументы командной строки [это требуется]
  • Не требует развернув всю Grails среду (мне нужен путь к классам, очевидно, но ничего другого)

В идеале, я» хотел бы быть в состоянии сделать что-то вроде этого:

java -classpath (I_HAVE_NO_IDEA_HOW_TO_DETERMINE_THIS) com.something.MyClass param1 param2 param3

Вещи я уже смотрел в:

  • Использование «grails create-script», которое приводит к сценарию Gant.
  • Использование «Grails выполнения сценария»

Первый (используя скрипт Gant) кажется ужасно неправильно для меня. Использование сценария Gant как своего рода промежуточной оболочки, по-видимому, требует начальной загрузки всей среды Grails, плюс я должен выяснить, как получить ссылку на фактический класс, который я хочу назвать, который кажется сложным (но я не являюсь Gant Эксперт, так просветите меня). =)

Вторая работа (с использованием сценария запуска) ... Я использовал этот подход для вызова методов службы раньше, но у него есть две проблемы: во-первых, он загружает всю среду Grails; во-вторых, не существует способа легко передать аргументы командной строки.

Действительно, мне просто нужны вещи в пути к классам (и параметры моей командной строки) и иметь возможность вызвать метод main() моего класса с минимальными расстройствами. При этом, если вы можете придумать рабочий пример любого типа, который решает проблему (даже если это связано с некоторым посредником Gant или другим классом), я буду рад использовать этот подход.

Спасибо.


Update: Решение, которое работает с задачей Gant, по-прежнему открыты для лучших идей, если у кого есть какие-то ...

In скрипты/FooBar.groovy

includeTargets << grailsScript("_GrailsInit") 

target(main: "Runs a generic script and passes parameters") { 
    def myclass = classLoader.loadClass('com.whatever.scripting.GenericRunScript') 
    myclass.execute(args); 
} 
setDefaultTarget(main) 

В src/groovy/com/whatever/scripting/GenericRunScript.заводной

package com.whatever.scripting 
class GenericRunScript { 
    public static execute(def args) { 
     println "args=" + args.inspect() 
    } 
} 

Затем из командной строки, в то время как в корневой директории проекта Grails:

$ grails compile 
| Environment set to development..... 
| Compiling 2 source files. 

$ grails foo-bar test one two 
| Environment set to development.... 
args='test\none\ntwo' 

Примечание 1: Когда я впервые сделал это, я постоянно забывал заявление компиляции, так Я добавил, что в.

Примечание 2: Да, аргументы разделяются каретными возвращениями; исправление, которое остается в качестве упражнения для читателя.

+0

Эй , не могли бы вы опубликовать свое решение для этого в качестве ответа? Это облегчит чтение и поиск. Благодаря! – Shog9

+0

Действительно, вы ** должны скомпилировать ** с помощью этого подхода. Grails не делает это автоматически, потому что класс загружается с помощью classLoader. Однако вы можете добавить «компилировать» в качестве зависимости от своей цели в FooBar.groovy. Только одна строка: зависит (компилируется), следуя примерам в 4.1. в grails.org/doc/1.1.1/guide/4.%20The%20Command%20Line.html. Он действительно компилируется. – osa

+0

Также, еще один способ передать параметры - использовать -Dproperty = значение, а затем получить их с помощью System.getProperty. – osa

ответ

0

Как описано в http://grails.org/doc/latest/guide/commandLine.html, вы можете включать цели _GrailsClasspath и _GrailsArgParsing и все, что вам нужно. Например, если вы хотите, чтобы разобрать аргументы командной строки без создания второго сценария:

$ grails create-script ArgsScript 
| Created file scripts/ArgsScript.groovy 

Теперь редактировать сценарий скрипты/ArgsScript.groovy следующим образом:

includeTargets << grailsScript("_GrailsArgParsing") // grailsScript("_GrailsInit") 

target(main: "The description of the script goes here!") { 
    println argsMap 
    for (p in argsMap['params']) 
     println p 
} 
setDefaultTarget(main) 

См результат:

$ grails args-script one two three=four 
| Environment set to development.... 
[params:[one, two, three=four]] 
one 
two 
three=four 

Обновление: Хорошо, это не так просто, как я думал. В принципе, вы можете запускать сценарий как задачу Gant, например. путем выполнения grails myscript или в качестве сценария, например. делая grails run-script src/groovy/MyScript.groovy. В первом случае у вас есть доступ к параметрам, как я уже объяснял, но вы по-прежнему пропустите часть среды Grails, которая, возможно, является ошибкой. Например, вы не можете получить доступ к сценариям или классам, определенным в src/groovy/, из задачи Gant. С другой стороны, как уже обсуждалось, если вы используете run-script, вы не можете получить аргументы.

Тем не менее, вы можете использовать System.getProperty для передачи аргументов командной строки с помощью синтаксиса -Dproperty=value. Также см. Java system properties and environment variables

0

Способ, описанный выше, будет работать, но все объекты Grails не будут включены, включая домены и зависимости.

Если вам требуется все, что вы определили в проекте Grails, команда выполнения скрипта будет делать трюк

Grails запустить-скрипт [путь к заводному файлу]

http://grails.org/doc/latest/ref/Command%20Line/run-script.html

Смежные вопросы