Apache Groovy

Язык программирования
Круто
Отличный логотип
ПарадигмаМультипарадигмальный : объектно-ориентированный , императивный , функциональный , аспектно-ориентированный , скриптовый
РазработаноДжеймс Страхан
РазработчикГийом Лафорж (председатель PMC)
Йохен Теодору (технический руководитель)
Пол Кинг
Седрик Шампо
Впервые появился2003 ; 22 года назад ( 2003 )
Стабильный релиз4.0.25 [1] (21 января 2025 г. ; 13 дней назад ) [±] ( 21 января 2025 г. )
Предварительный релиз
4.0.0-beta-1 / 6 сентября 2021 г. ; 3 года назад [2] ( 2021-09-06 )
Дисциплина набора текстаДинамичный , статичный , сильный , утка
ПлатформаJava SE
ЛицензияЛицензия Apache 2.0
Расширения имени файла.groovy, .gvy, .gy, .gsh[3]
Веб-сайтgroovy-lang.org
Основные внедрения
Gradle , Grails
Под влиянием
Java , Python , Ruby , Smalltalk
Под влиянием
Котлин

Apache Groovy — это совместимый с Java синтаксисом объектно-ориентированный язык программирования для платформы Java . Это как статический, так и динамический язык с функциями, аналогичными функциям Python , Ruby и Smalltalk . Его можно использовать как язык программирования и как язык сценариев для платформы Java, он компилируется в байт-код виртуальной машины Java (JVM) и без проблем взаимодействует с другим кодом и библиотеками Java . Groovy использует синтаксис фигурных скобок, похожий на синтаксис Java. Groovy поддерживает замыкания , многострочные строки и выражения, встроенные в строки . Большая часть мощи Groovy заключается в его преобразованиях AST , запускаемых с помощью аннотаций.

Groovy 1.0 был выпущен 2 января 2007 года, а Groovy 2.0 — в июле 2012 года. Начиная с версии 2, Groovy может быть скомпилирован статически , предлагая вывод типов и производительность, близкую к производительности Java. [4] [5] Groovy 2.4 был последним крупным релизом под спонсорством Pivotal Software , которое закончилось в марте 2015 года. [6] С тех пор Groovy изменил свою структуру управления на Комитет по управлению проектами в Apache Software Foundation . [7]

История

Джеймс Страхан впервые рассказал о разработке Groovy в своем блоге в августе 2003 года. [8] В марте 2004 года Groovy был представлен в JCP как JSR 241 [9] и принят голосованием. Несколько версий были выпущены между 2004 и 2006 годами. После начала работы по стандартизации Java Community Process (JCP) нумерация версий изменилась, и 2 января 2007 года была выпущена версия под названием «1.0». После различных бета-версий и релиз-кандидатов с номером 1.1, 7 декабря 2007 года был выпущен Groovy 1.1 Final, который немедленно был перенумерован в Groovy 1.5, чтобы отразить множество внесенных изменений.

В 2007 году Groovy получил первую премию на конкурсе инноваций JAX 2007. [10] В 2008 году Grails , веб-фреймворк Groovy , получил вторую премию на конкурсе инноваций JAX 2008. [11]

В ноябре 2008 года SpringSource приобрела компанию Groovy and Grails (G2One). [12] В августе 2009 года VMware приобрела SpringSource. [13]

В апреле 2012 года, после восьми лет бездействия, руководитель проекта изменил статус JSR 241 на «спящий». [9]

Страхан молча покинул проект за год до выпуска Groovy 1.0 в 2007 году. [ требуется ссылка ] В октябре 2016 года Страхан заявил: «Я все еще люблю Groovy (конвейеры Jenkins такие классные!), Java, Go, TypeScript и Kotlin». [14]

2 июля 2012 года был выпущен Groovy 2.0, в который, среди прочих новых функций, были добавлены статическая компиляция и статическая проверка типов .

Когда в апреле 2013 года совместное предприятие Pivotal Software было отделено от EMC Corporation (EMC) и VMware, Groovy и Grails стали частью его продуктового портфеля. Pivotal прекратила спонсировать Groovy и Grails с апреля 2015 года. [6] В том же месяце Groovy изменила свою структуру управления с репозитория Codehaus на Комитет по управлению проектами (PMC) в Apache Software Foundation через свой инкубатор. [7] Groovy вышел из инкубатора Apache и стал проектом верхнего уровня в ноябре 2015 года. [15]

7 февраля 2020 года был выпущен Groovy 3.0. [16] Версия 4.0 была выпущена 25 января 2022 года. [17]

Функции

Большинство допустимых файлов Java также являются допустимыми файлами Groovy. Хотя эти два языка похожи, код Groovy может быть более компактным, поскольку ему не нужны все элементы, необходимые Java. [18] Это позволяет программистам Java постепенно изучать Groovy, начиная со знакомого синтаксиса Java, прежде чем приобретать больше идиом программирования Groovy . [19]

Функции Groovy, недоступные в Java, включают в себя как статическую, так и динамическую типизацию (с ключевым словом def), перегрузку операторов , собственный синтаксис для списков и ассоциативных массивов (карт), собственную поддержку регулярных выражений , полиморфную итерацию, интерполяцию строк , добавленные вспомогательные методы и оператор безопасной навигации ?. для автоматической проверки нулевых указателей (например, variable?.method(), или variable?.field). [20]

Начиная с версии 2, Groovy также поддерживает модульность (поставляет только те jars, которые использует проект, тем самым уменьшая размер библиотеки Groovy), проверку типов, статическую компиляцию, улучшения синтаксиса Project Coin, блоки multicatch и постоянное улучшение производительности с использованием invokedynamicинструкций, представленных в Java 7. [ 21]

Groovy изначально поддерживает такие языки разметки , как XML и HTML , используя встроенный синтаксис Document Object Model (DOM). Эта функция позволяет определять и манипулировать многими типами гетерогенных активов данных с помощью единого и краткого синтаксиса и методологии программирования. [ необходима цитата ]

В отличие от Java, файл исходного кода Groovy может быть выполнен как (нескомпилированный) скрипт , если он содержит код вне любого определения класса, если это класс с основным методом или если это Runnable или GroovyTestCase . Скрипт Groovy полностью анализируется, компилируется и генерируется перед выполнением (аналогично Python и Ruby). Это происходит под капотом, и скомпилированная версия не сохраняется как артефакт процесса. [22]

GroovyBeans, свойства

GroovyBeans — это версия JavaBeans от Groovy . Groovy неявно генерирует геттеры и сеттеры. В следующем коде setColor(String color)и getColor()неявно генерируются. Последние две строки, которые, как кажется, обращаются к цвету напрямую, на самом деле вызывают неявно сгенерированные методы. [23]

класс AGroovyBean { Цвет строки }    def myGroovyBean = новый AGroovyBean ()    myGroovyBean.setColor ( ' голубой' ) assert myGroovyBean.getColor ( ) == ' голубой '   myGroovyBean . color = 'оловянный' утверждать myGroovyBean . color == 'оловянный'     

Groovy предлагает простой, последовательный синтаксис для обработки списков и карт , напоминающий синтаксис массивов Java . [24]

def movieList = [ 'Дерсу Узала' , 'Ран' , 'Семь самураев' ] // Выглядит как массив, но является списком assert movieList [ 2 ] == 'Семь самураев' movieList [ 3 ] = 'Касабланка' // Добавляет элемент в список assert movieList . size () == 4               def monthMap = [ 'Январь' : 31 , 'Февраль' : 28 , 'Март' : 31 ] // Объявляет карту assert monthMap [ 'Март' ] == 31 // Получает доступ к записи monthMap [ 'Апрель' ] = 30 // Добавляет запись в карту assert monthMap . size () == 4                        

Прототип расширения

Groovy предлагает поддержку расширения прототипа через , модули расширения (только в Groovy 2), категорииExpandoMetaClass , подобные Objective-C, и . [25]DelegatingMetaClass

ExpandoMetaClassпредлагает предметно-ориентированный язык (DSL) для простого выражения изменений в классе, аналогичный концепции открытых классов Ruby :

Число.метаКласс { sqrt = { Математика . sqrt ( делегат ) } }      утверждать 9 . sqrt () == 3 утверждать 4 . кврт () == 2      

Изменения Groovy в коде через прототипирование не видны в Java, поскольку каждый вызов атрибута/метода в Groovy проходит через реестр метаклассов. Доступ к измененному коду из Java возможен только через реестр метаклассов.

Groovy также позволяет переопределять методы как getProperty(), propertyMissing()среди прочего, позволяя разработчику перехватывать вызовы объекта и указывать для них действие, упрощенным аспектно-ориентированным способом. Следующий код позволяет классу java.lang.Stringреагировать на hexсвойство:

enum Color { BLACK ( '#000000' ), WHITE ( '#FFFFFF' ), RED ( '#FF0000' ), BLUE ( '#0000FF' ) String hex Color ( String hex ) { this . hex = hex } }                 String.metaClass.getProperty = { Свойство строки - > def stringColor = делегат if ( property == ' hex ' ) { Color.values ( ) . find { it.name ( ) . equalsIgnoreCase stringColor } ?. hex } }                    утверждать "БЕЛЫЙ" . hex == "#FFFFFF" утверждать "СИНИЙ" . hex == "#0000FF" утверждать "ЧЕРНЫЙ" . hex == "#000000" утверждать "ЗЕЛЕНЫЙ" . hex == null            

Фреймворк Grails широко использует метапрограммирование для включения динамических поисковиков GORMUser.findByName('Josh') , таких как и другие. [26]

Точка и скобки

Синтаксис Groovy позволяет в некоторых ситуациях опускать скобки и точки. Следующий код Groovy

принимать ( кофе ). с ( сахаром , молоком ). и ( ликёром ) 

можно записать как

взять кофе с сахаром , молоком и ликером      

позволяя разрабатывать предметно-ориентированные языки (DSL), которые выглядят как обычный английский.

Функциональное программирование

Хотя Groovy в основном является объектно-ориентированным языком, он также предлагает функции функционального программирования .

Закрытия

Согласно документации Groovy: «Замыкания в Groovy работают аналогично «указателю метода», позволяя писать и запускать код в более поздний момент времени». [27] Замыкания Groovy поддерживают свободные переменные, то есть переменные, которые не были явно переданы ему в качестве параметра, но существуют в контексте его объявления, частичное применение (которое он называет « каррингом » [28] ), делегирование, неявные, типизированные и нетипизированные параметры.

При работе с коллекциями определенного типа можно вывести замыкание, переданное операции над коллекцией:

список = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ]          /* * Ненулевые числа приводятся к истине, поэтому, когда it % 2 == 0 (четное), это ложь. * Тип неявного параметра "it" может быть выведен как Integer средой IDE. * Его также можно записать так: * list.findAll { Integer i -> i % 2 } * list.findAll { i -> i % 2 } */ def odds = list . findAll { it % 2 }        утверждать шансы == [ 1 , 3 , 5 , 7 , 9 ]       

Группа выражений может быть записана в блоке замыкания без ссылки на реализацию, а отвечающий объект может быть назначен позднее с помощью делегирования:

// Этот блок кода содержит выражения без ссылки на реализацию def operations = { declare 5 sum 4 divided 3 print }          
/* * Этот класс будет обрабатывать операции, которые могут быть использованы в замыкании выше. Другой класс * может быть объявлен имеющим те же методы, но использующим, например, операции веб-сервиса * в вычислениях. */ class Expression { BigDecimal value     /*  * Хотя Integer передается как параметр, он приводится к BigDecimal, как и было  * определено. Если бы класс имел метод 'declare(Integer value)', он бы использовался вместо этого.  */ def declare ( BigDecimal value ) { this . value = value } def sum ( BigDecimal valueToAdd ) { this . value += valueToAdd } def divide ( BigDecimal divisor ) { this . value /= divisor } def propertyMissing ( String property ) { if ( property == "print" ) println value } }                                      
// Здесь определяется, кто будет отвечать на выражения в блоке кода выше. operations . delegate = new Expression () operations ()   

Карри

Обычно называемая частичным применением , [28] эта функция Groovy позволяет устанавливать параметры замыканий на параметр по умолчанию в любом из их аргументов, создавая новое замыкание со связанным значением. Предоставление одного аргумента методу curry()исправит аргумент один. Предоставление N аргументов исправит аргументы 1 .. N.

def joinTwoWordsWithSymbol = { символ , первый , второй -> первый + символ + второй } assert joinTwoWordsWithSymbol ( '#' , 'Привет' , 'Мир' ) == 'Привет#Мир'                  def concatWords = joinTwoWordsWithSymbol . curry ( ' ' ) assert concatWords ( 'Привет' , 'Мир' ) == 'Привет, мир'       def prependHello = concatWords.curry ( 'Привет' ) // def prependHello = joinTwoWordsWithSymbol.curry(' ', 'Привет') assert prependHello ( 'Мир' ) == 'Привет, мир'      

Карри также можно использовать в обратном направлении (исправляя последние N аргументов) с помощью rcurry().

def power = { значение BigDecimal , степень BigDecimal -> значение ** степень }         определение квадрата = мощность.rcurry ( 2 ) определение куба = мощность.rcurry ( 3 )      утвердить мощность ( 2 , 2 ) == 4 утвердить квадрат ( 4 ) == 16 утвердить куб ( 3 ) == 27          

Groovy также поддерживает ленивые вычисления , [29] [30] свертки/свертки , [31] бесконечные структуры и неизменяемость , [32] и т. д. [33]

Обработка JSON и XML

В JavaScript Object Notation ( JSON ) и обработке XML Groovy использует шаблон Builder , что делает создание структуры данных менее многословным. Например, следующий XML:

<languages> <language year= "1995" > <name> Java </name> <paradigm> объектно -ориентированный </paradigm> <typing> статический </typing> </language> <language year= "1995" > <name> Ruby </name> <paradigm> функциональный, объектно -ориентированный </paradigm> <typing> утиная типизация, динамический </typing> </language> <language year= "2003" > <name> Groovy </name> <paradigm> функциональный, объектно -ориентированный </paradigm> <typing> утиная типизация, динамический, статический </typing> </language> </languages>                            

можно сгенерировать с помощью следующего кода Groovy:

def writer = new StringWriter () def builder = new groovy.xml.MarkupBuilder ( writer ) builder.languages ​​{ language ( year : 1995 ) { name "Java" paradigm "object-oriented" typing " static " } language ( year : 1995 ) { name " Ruby" paradigm "functional, object-oriented" typing " duck typing, dynamic" } language ( year: 2003 ) { name "Groovy" paradigm "functional, object-oriented" typing "duck typing, dynamic, static" } }                                         

и также может быть обработан потоковым способом через StreamingMarkupBuilder. Чтобы изменить реализацию на JSON, MarkupBuilderможно заменить на JsonBuilder. [34]

Для его анализа и поиска функционального языка findAllможно использовать метод Groovy:

def languages ​​= new XmlSlurper ( ). parseText writer.toString ( )     // Здесь используется синтаксис регулярных выражений Groovy для сопоставления (=~), которое будет приведено к // логическому значению: либо true, если значение содержит нашу строку, либо false в противном случае. def functional = languages ​​. language . findAll { it . paradigm =~ "functional" } assert functional . collect { it . name } == [ "Groovy" , "Ruby" ]               

Интерполяция строк

В Groovy строки можно интерполировать с помощью переменных и выражений с помощью GStrings: [35]

BigDecimal account = 10.0 def text = "Текущий баланс счета составляет $account" assert text == "Текущий баланс счета составляет 10.0"         

Строки, содержащие переменные и выражения, должны быть объявлены с использованием двойных кавычек.

Сложное выражение должно быть заключено в фигурные скобки. Это предотвращает интерпретацию его частей как принадлежащих окружающей строке, а не выражению:

BigDecimal minus = 4.0 text = "Текущий баланс счета составляет ${account - minus}" assert text == "Текущий баланс счета составляет 6.0"        // Без скобок для изоляции выражения это бы дало следующий результат: text = "Текущий баланс счета составляет $account - минус" assert text == "Текущий баланс счета составляет 10.0 - минус"     

Вычисление выражения можно отложить, используя синтаксис стрелок:

BigDecimal налог = 0,15 текст = "В настоящее время на счете отображается остаток в размере ${->счет - счет*налог}" налог = 0,10       // Значение налога было изменено ПОСЛЕ объявления GString. Переменные выражения // связываются только тогда, когда выражение должно быть фактически оценено: assert text == "В настоящее время на счете отображается остаток в размере 9.000"   

Абстрактное преобразование синтаксического дерева

Согласно собственной документации Groovy, «Когда компилятор Groovy компилирует скрипты и классы Groovy, в какой-то момент процесса исходный код в конечном итоге будет представлен в памяти в виде конкретного синтаксического дерева, а затем преобразован в абстрактное синтаксическое дерево. Целью преобразований AST является предоставление разработчикам возможности подключиться к процессу компиляции, чтобы иметь возможность изменять AST до того, как он будет преобразован в байт-код, который будет запущен JVM. Преобразования AST предоставляют Groovy улучшенные возможности метапрограммирования во время компиляции, обеспечивая высокую гибкость на уровне языка без потери производительности во время выполнения». [36]

Примеры AST в Groovy:

  • Преобразование категории и миксина
  • Неизменяемый макрос AST
  • Новое преобразование
  • Синглтон-преобразование

среди прочего.

Тестовый фреймворк Spock использует преобразования AST, чтобы позволить программисту писать тесты в синтаксисе, не поддерживаемом Groovy, но затем соответствующий код преобразуется в AST в допустимый код. [37] Пример такого теста:

def "максимум #a и #b равен #c" () { expect: Math . max ( a , b ) == c          где: а | б || в 3 | 5 || 5 7 | 0 || 7 0 | 0 || 0 }                    

Черты

Согласно документации Groovy, « Трейты — это структурная конструкция языка, которая обеспечивает: композицию поведений, реализацию интерфейсов во время выполнения, переопределение поведения и совместимость со статической проверкой типов/компиляцией».

Черты можно рассматривать как интерфейсы, несущие как реализации по умолчанию, так и состояние. Черта определяется с помощью ключевого слова trait:

черта FlyingAbility { /* объявление черты */ String fly () { "Я летаю!" } /* объявление метода внутри черты */ }         

Затем его можно использовать как обычный интерфейс, используя ключевое слово implements:

class Bird implements FlyingAbility {} /* Добавляет черту FlyingAbility к возможностям класса Bird */ def bird = new Bird () /* создает новый экземпляр Bird */ assert bird . fly () == "Я лечу!" /* класс Bird автоматически получает поведение черты FlyingAbility */              

Черты характера открывают широкий спектр возможностей: от простого сочинения до тестирования.

Принятие

Известные примеры внедрения Groovy включают в себя:

  • Adaptavist ScriptRunner, встраивает реализацию Groovy для автоматизации и расширения инструментов Atlassian , используемых более чем в 20000 организаций по всему миру. [38] [39]
  • Apache OFBiz , система планирования ресурсов предприятия (ERP) с открытым исходным кодом , использует Groovy. [40] [41]
  • Eucalyptus , облачная система управления, использует значительную часть Groovy.
  • Gradle — популярный инструмент автоматизации сборки с использованием Groovy.
  • LinkedIn использует Groovy и Grails для некоторых своих подсистем. [42]
  • LogicMonitor, облачная платформа мониторинга, использует Groovy в источниках данных на основе скриптов. [43]
  • Jenkins , платформа для непрерывной интеграции . С версии 2 Jenkins включает плагин Pipeline , который позволяет писать инструкции по сборке на Groovy. [44]
  • Liferay использует Groovy в своем рабочем процессе Kaleo
  • Sky.com использует Groovy и Grails для обслуживания массового онлайн-медиаконтента. [45]
  • SmartThings , открытая платформа для умных домов и потребительского Интернета вещей , использует подмножество Groovy, ориентированное на безопасность [46]
  • SoapUI предоставляет Groovy в качестве языка для разработки тестов веб-сервисов. [47]
  • Survata, стартап, занимающийся маркетинговыми исследованиями, использует Groovy и Grails. [ необходима цитата ]
  • Европейское патентное ведомство (ЕПВ) разработало язык программирования потоков данных на Groovy, «чтобы использовать сходства в процессах взаимодействия с патентным ведомством каждой отдельной страны и преобразовать их в единый универсальный процесс». [ необходима цитата ]
  • Хотя Groovy можно интегрировать в любую среду JVM, фреймворк JBoss Seam предоставляет Groovy, помимо Java, в качестве языка разработки «из коробки». [48]
  • vCalc.com использует Groovy для всех определяемых пользователем математических вычислений в своем краудсорсинговом математическом движке. [49]
  • Wired.com использует Groovy и Grails для отдельного раздела «Обзоры продуктов» на сайте. [50]
  • XWiki SAS использует Groovy в качестве языка сценариев в своем совместном продукте с открытым исходным кодом. [51]

Поддержка IDE

Многие интегрированные среды разработки (IDE) и текстовые редакторы поддерживают Groovy:

Диалекты

Существует одна альтернативная реализация Groovy:

  • Grooscript преобразует код Groovy в код JavaScript . [52] Хотя Grooscript имеет некоторые ограничения по сравнению с Apache Groovy, он может использовать доменные классы как на сервере, так и на клиенте. [53] Предоставляется поддержка плагинов для Grails версии 3.0, а также онлайн-преобразования кода. [54]

Смотрите также

Ссылки

Цитаты

  1. ^ "Выпуск 4.0.25". 21 января 2025 г. Получено 22 января 2025 г.
  2. ^ "Releases - apache/groovy" . Получено 2020-04-09 – через GitHub .
  3. ^ «Groovy Goodness: Расширения файлов скриптов Groovy по умолчанию».
  4. ^ «Производительность Groovy 2.0 по сравнению с Java». 25 августа 2012 г.
  5. ^ "Java vs Groovy2.0 vs Scala Simple Performance Test". 10 июля 2012 г. Архивировано из оригинала 10 декабря 2012 г. Получено 7 октября 2012 г.
  6. ^ ab "Groovy 2.4 и Grails 3.0 станут последними крупными релизами при спонсорской поддержке Pivotal". 19 января 2015 г.
  7. ^ ab "Groovy присоединяется к Apache Incubator". 11 марта 2015 г.
  8. Джеймс Страхан (29 августа 2003 г.). "Groovy - рождение нового динамического языка для платформы Java". Архивировано из оригинала 1 сентября 2003 г.
  9. ^ ab "Процесс сообщества Java JSR 241".
  10. ^ "Groovy выигрывает первый приз на JAX 2007 Innovation Award". 2007-04-26. Архивировано из оригинала 2015-05-13 . Получено 2012-10-07 .
  11. ^ "Говорят, за чашкой кофе может произойти многое". Архивировано из оригинала 2011-04-19 . Получено 2012-10-07 .
  12. ^ "SpringSource приобретает компанию Groovy и Grails (G2One)". 11 ноября 2008 г.
  13. ^ "VMWare приобретает SpringSource". 10 августа 2009 г.
  14. ^ "Твит Джеймса Страхана". 24 ноября 2016 г. Получено 24 ноября 2016 г.
  15. ^ «Объявление в списке рассылки для разработчиков».
  16. ^ "Выпуск GROOVY_3_0_0 · apache/groovy". GitHub . Получено 2024-03-27 .
  17. ^ "Выпуск GROOVY_4_0_0 · apache/groovy". GitHub . Получено 2024-03-27 .
  18. ^ Кёниг 2007, стр. 32
  19. ^ "Руководство по стилю и функциям языка Groovy для разработчиков Java". Groovy.codehaus.org. Архивировано из оригинала 2015-01-17 . Получено 2015-01-22 .
  20. ^ "Groovy – Отличия от Java". Groovy.codehaus.org. Архивировано из оригинала 2009-03-17 . Получено 2013-08-12 .
  21. ^ «Что нового в Groovy 2.0?». 28 июня 2012 г.
  22. ^ Кёниг 2007, стр. 37-8
  23. ^ Кёниг 2007, стр. 38-9
  24. ^ Кёниг 2007, стр. 41-3
  25. ^ "JN3525-MetaClasses". Архивировано из оригинала 2012-10-01 . Получено 2012-10-07 .
  26. ^ "Методы метапрограммирования в Groovy и Grails". 11 июня 2009 г.
  27. ^ "Groovy - Closures". Архивировано из оригинала 2012-05-22.
  28. ^ ab "Вызывает ли Groovy частичное применение 'каррирование'", 10 августа 2013 г.
  29. ^ "Groovy - Lazy Transformation". Архивировано из оригинала 2012-10-08 . Получено 2012-10-07 .
  30. ^ «Заметки на полях: Ленивые списки в Groovy». 3 февраля 2011 г.
  31. ^ "Groovy's Fold". 20 июня 2011 г. Архивировано из оригинала 13 февраля 2015 г. Получено 12 февраля 2015 г.
  32. ^ "Функциональное программирование с Groovy". 5 ноября 2011 г.
  33. ^ "Программирование функций в Groovy". Архивировано из оригинала 2012-10-08 . Получено 2012-10-07 .
  34. ^ "JsonBuilder". Архивировано из оригинала 2012-10-02 . Получено 2012-10-07 .
  35. ^ "Groovy Strings - Различные способы их создания". 26 декабря 2009 г.
  36. ^ "Метапрограммирование во время компиляции - преобразования AST". Архивировано из оригинала 2012-10-14 . Получено 2012-10-07 .
  37. ^ Кинг, Пол (2020). «История языка программирования Groovy». Proc. ACM Program. Lang . 4 : 53. doi : 10.1145/3386326 .
  38. ^ «Документация ScriptRunner».
  39. ^ «Пресс-релиз ScriptRunner со статистикой внедрения».
  40. ^ "Groovy DSL для бизнес-логики OFBiz". Apache OFBiz Project Open Wiki .
  41. ^ "Примеры простых методов с использованием Groovy". Apache OFBiz Project Open Wiki .
  42. ^ "Grails at LinkedIn" . Получено 2015-06-02 .
  43. ^ "Встроенные скрипты Groovy". www.logicmonitor.com . Получено 20.11.2020 .
  44. ^ «Трубопровод Дженкинса».
  45. ^ Роше, Грэм (2 октября 2008 г.). "Блог Грэма Роше: Sky.com перезапускается, написанный на Grails". Блог Грэма Роше . Получено 2015-06-02 .
  46. ^ Анализ безопасности новых приложений для умного дома
  47. ^ "Скрипты и библиотека скриптов | Скрипты и свойства". www.soapui.org . Получено 2015-06-02 .
  48. ^ "Глава 11. Интеграция Groovy". docs.jboss.org . Получено 2015-06-02 .
  49. ^ "vCalc, первая в истории социальная платформа для мира математики". 4 ноября 2014 г. Получено 05.05.2016 г.
  50. ^ "Wired.Com" (PDF) . www.springsource.org . Получено 2015-06-02 .
  51. ^ "XWiki SAS" (PDF) . www.springsource.org . Получено 2015-06-02 .
  52. ^ "Grooscript Documentation". 12 сентября 2016 г. Архивировано из оригинала 28 июня 2017 г. Получено 4 июля 2017 г.
  53. ^ "Презентация на SpringOne/2GX по Grooscript". 13 декабря 2015 г.
  54. ^ "Grooscript online conversions". 15 мая 2017 г. Архивировано из оригинала 9 июля 2017 г. Получено 4 июля 2017 г.

Источники

  • Кениг, Дирк; Пол Кинг; Гийом Лафорж; Гамлет Д'Арси; Седрик Шампо; Эрик Прагт; Джон Скит (2015). Groovy в действии, второе издание . Мэннинг. ISBN 978-1-935182-44-3.
  • Баркли, Кеннет; Джон Сэвидж (2007). Groovy-программирование: введение для разработчиков Java. Издательство Morgan Kaufmann. ISBN 978-0-12-372507-3. Архивировано из оригинала 2010-01-12 . Получено 2007-07-19 .
  • Дэвис, Скотт (2008). Groovy Recipes: Grease the Wheels of Java. Pragmatic Bookshelf. ISBN 978-0-9787392-9-4.
  • Субраманиам, Венкат (2008). Программирование Groovy: динамическая производительность для разработчиков Java. Pragmatic Bookshelf. ISBN 978-1-934356-09-8.
  • Официальный сайт
Взято с "https://en.wikipedia.org/w/index.php?title=Apache_Groovy&oldid=1272595706"