Я использую 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: Да, аргументы разделяются каретными возвращениями; исправление, которое остается в качестве упражнения для читателя.
Эй , не могли бы вы опубликовать свое решение для этого в качестве ответа? Это облегчит чтение и поиск. Благодаря! – Shog9
Действительно, вы ** должны скомпилировать ** с помощью этого подхода. Grails не делает это автоматически, потому что класс загружается с помощью classLoader. Однако вы можете добавить «компилировать» в качестве зависимости от своей цели в FooBar.groovy. Только одна строка: зависит (компилируется), следуя примерам в 4.1. в grails.org/doc/1.1.1/guide/4.%20The%20Command%20Line.html. Он действительно компилируется. – osa
Также, еще один способ передать параметры - использовать -Dproperty = значение, а затем получить их с помощью System.getProperty. – osa