Используя Groovy как язык сценариев

Я предпочитаю использовать языки сценариев для коротких задач, что-нибудь вроде действительно простого http-бота, массового импорта/экспорта данных В/откуда-нибудь и т. д... Основные сценарии выброса и простые вещи. Дело в том, что язык сценариев-это просто эффективный инструмент для написания быстрых программ. Что касается моего понимания Groovy на данный момент...

Если бы вы должны были программировать в Groovy, и вы не хотите писать быстрый сценарий, вы не были бы вынуждены вернуться к обычной синтаксис java (и мы знаем, как это можно запутать по сравнению с языком сценариев), чтобы сделать что-то более сложное? Например, если я хочу сделать некоторые http-скрипты, разве я не вернусь к использованию синтаксиса java для вызова Commons HttpClient? Для меня смысл скриптового языка-это быстро типизированные и менее принудительные конструкции. И вот еще что, похоже, нет никакого стимула для разработки библиотек на основе groovy, когда уже так много хороших java one там, таким образом, что groovy кажется зависимым от Java языком с незначительными функциями сценариев.

поэтому прямо сейчас мне интересно, могу ли я переключиться на Groovy в качестве языка сценариев или продолжать использовать более распространенный язык сценариев, такой как Perl, Python или Ruby.

6 ответов


@Zombies, позвольте мне показать вам быстрый пример из сценария, который я недавно написал:

def fetch(build, toFile) {
    new FTPClient().with {
        connect ftpServer
        enterLocalPassiveMode()
        login ftpUser, ftpPassword
        changeWorkingDirectory "/var/staging/revision-${build}"
        fileType = FTPClient.BINARY_FILE_TYPE
        toFile.withOutputStream { ostream -> 
            retrieveFile "build-${build}.zip", ostream 
        }
        disconnect()
    }
}

он использует API commons-net, но я думаю, вы согласитесь, что он имеет гораздо более четкий синтаксис, чем сопоставимая программа Java. Поэтому я не думаю, что использование Java APIs побеждает цель иметь язык сценариев. Кроме того, это помогает вам использовать существующие знания API Java, поэтому это очень прагматичный подход.


одна из целей Groovy - прозрачная совместимость с Java. Groovy по дизайну "Java-зависимый язык с функциями сценариев". Однако я не думаю, что эти функции незначительны - Groovy имеет много функций, которые не найдены в статических языках программирования (таких как Java).

подводя итог: Если вы совсем не заботитесь о Java, используйте более универсальный язык сценариев, такой как Python или Perl. Если вы хотите использовать базу кода Java в скрипте-ish кстати, Groovy-хороший вариант.


Groovy может быть очень удобно для создания скриптов. Недавно мне нужен был скрипт для извлечения зависимостей Maven в lib каталог и в конечном итоге с groovy скриптом. Этот фрагмент анализирует pom и дает вам список банок. Довольно сладкий для синтаксического анализа XML!

#!/usr/bin/env groovy
def pom = new XmlSlurper().parse('pom.xml')
def repo = "${System.env.HOME}/.m2/repository"

pom.dependencies.dependency.each { dep ->
    def jarName = "${dep.artifactId}-${dep.version}.jar"
    def groupPath = dep.groupId.text().replaceAll('\.', '/')
    def jarPath = "${repo}/${groupPath}/${dep.artifactId}/${dep.version}"
    println "$jarPath/$jarName"
}

например, если я хочу сделать некоторые http-скрипты, разве я не вернусь к использованию синтаксиса java для вызова Commons HttpClient?

вы бы "вернулись к использованию Commons HttpClient", но вы бы вызвали его с помощью синтаксиса Groovy, а не синтаксиса Java. Синтаксис Groovy-это много более компактный, чем синтаксис Java, и поэтому лучше подходит для сценариев. Другими словами, использование библиотек Java в Groovy занимает намного меньше кода, чем использование Java библиотеки в Java.

не похоже, что есть какой-либо стимул для groovy на основе библиотек, которые должны быть разработаны, когда уже так много хороших java один там

вместо разработки совершенно новой библиотеки автор Groovy library часто предоставляет API "Groovier" существующей библиотеке Java. Примеры включают Hibernate builder, предоставляемый Grails, и HTTP Builder (который делегирует в Commons С помощью HttpClient).

эти Groovy API предоставляют более компактную и идиоматическую альтернативу использованию Java API напрямую.


Groovy" из коробки " заменяет большое количество общих классов более groovier версиями или языковыми конструкциями, включая классы для XML, HTTP-запросов, доступа к базам данных SQL и регулярных выражений. Для большинства задач сценариев вам не придется использовать библиотеки Java вообще (хотя у вас все равно будет эта опция). Но если ваш скрипт использует голые библиотеки Java, вы будете намного впереди с Groovy над прямой Java. Где Groovy светит в коде" клея", например установка структуры данных и файловый ввод-вывод

карта и список позволяют создавать совместимые с Java списки и карты; обычные объекты Java, которые работают с классами Java. Groovy часто превращает многострочный вызов метода Java с объявлениями переменных и инициализацией в однострочный.

рассмотреть этот короткий фрагмент, чтобы загрузить весь файл в строку:

def fileContents = new File(filename).text

и

String fileContents = "";
try {
    BufferedReader reader = new BufferedReader(new FileInputStream(filename));
    String line = null;
    while ((line = reader.readLine()) != null) {
        text = text + line + "\n";
    }
} catch (IOException e) {
    e.printStackTrace();
}

обработка исключений часто не является важным фактором в сценарии и его можно игнорировать.

главная сила Groovy в качестве языка сценариев-это доступ к огромной библиотеке Java-кода, которая находится там напрямую и удобно. Если это не ваша потребность, groovy по-прежнему предоставляет среду сценариев, столь же богатую, как и другие языки, такие как perl, python или ruby.


Groovy rocks, как только вы получите очень жесткий синтаксис, вы начнете использовать его для многих вещей, которые вы только что сделали "медленный путь".

def str = '92228498-6A2F-DBA2-7A2C-F54B9E607E3A'
int num = 0
str.each {
    num++
}
println num

ударьте это в локальном или общем каталоге скриптов, и он будет там в будущем.