Парадигма | Объектно-ориентированный , императивный , скриптовый |
---|---|
Разработано | Джеймс Страчан |
Разработчик | Гийом Лафорж (председатель PMC) Йохен Теодору (технический руководитель) Поль Кинг Седрик Шампо |
Впервые появился | 2003 |
Стабильный выпуск | 3.0.8 (16 апреля 2021 г . [1] ) [±] |
Предварительный выпуск | 4.0.0-alpha-2/1 декабря 2020 г . [1] |
Печатная дисциплина | Динамичный , статичный , сильный , утка |
Платформа | Java SE |
Лицензия | Лицензия Apache 2.0 |
Расширения имени файла | .groovy, .gvy, .gy, .gsh [2] |
Веб-сайт | Groovy-lang |
Основные реализации | |
Gradle , Грааль | |
Под влиянием | |
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. [3] [4] Groovy 2.4 был последним крупным выпуском, спонсируемым Pivotal Software и завершившимся в марте 2015 года. [5] Groovy с тех пор изменил свою структуру управления на Комитет по управлению проектами в Apache Software Foundation . [6]
История [ править ]
Джеймс Страчан впервые рассказал о разработке Groovy в своем блоге в августе 2003 года. [7] В марте 2004 года Groovy был представлен в JCP как JSR 241 [8] и принят голосованием. В период с 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 за инновации. [9] В 2008 году Grails , веб-фреймворк для Groovy , получил вторую премию на конкурсе JAX 2008 за инновации. [10]
В ноябре 2008 года SpringSource приобрела компанию Groovy and Grails (G2One). [11] В августе 2009 года VMware приобрела SpringSource. [12]
В апреле 2012 года, после восьми лет бездействия, руководитель специализации изменил статус JSR 241 на бездействующий. [8]
Страчан покинул проект молча за год до Groovy версии 1.0 в 2007 году [ править ] В октябре 2016, заявил Страчан «Я до сих пор любовь заводной (Jenkins трубопроводы настолько заводной!), Java, идти, машинопись и Котлин». [13]
2 июля 2012 г. был выпущен Groovy 2.0, в который, помимо других новых функций, добавлены статическая компиляция и проверка статического типа .
Когда в апреле 2013 года совместное предприятие Pivotal Software было выделено корпорацией EMC (EMC) и VMware, Groovy и Grails вошли в его портфель продуктов. Pivotal прекратил спонсировать Groovy и Grails с апреля 2015 года. [5] В том же месяце Groovy изменил свою структуру управления с репозитория Codehaus на Комитет управления проектами (PMC) в Apache Software Foundation через свой инкубатор. [6] Groovy закончил инкубатор Apache и стал проектом высшего уровня в ноябре 2015 года. [14]
Особенности [ править ]
Наиболее допустимые файлы Java также являются допустимыми файлами Groovy. Хотя эти два языка похожи, код Groovy может быть более компактным, поскольку ему не нужны все элементы, необходимые Java. [15] Это позволяет Java-программистам постепенно изучать Groovy, начиная со знакомого синтаксиса Java, прежде чем усвоить больше идиом программирования Groovy . [16]
Функции Groovy, недоступные в Java, включают статическую и динамическую типизацию (с ключевым словом def
), перегрузку операторов , собственный синтаксис для списков и ассоциативных массивов (карт), встроенную поддержку регулярных выражений , полиморфную итерацию, интерполяцию строк , добавленные вспомогательные методы и безопасный оператор навигации ?.
для автоматической проверки нулевых указателей (например variable?.method()
, или variable?.field
). [17]
Начиная с версии 2, Groovy также поддерживает модульность (возможность поставлять только необходимые jar-файлы в соответствии с потребностями проекта, таким образом уменьшая размер библиотеки Groovy), проверку типов, статическую компиляцию, улучшения синтаксиса Project Coin, блоки множественной выборки и постоянное повышение производительности с использованием invokedynamic
инструкция введена в Java 7 . [18]
Groovy обеспечивает встроенную поддержку различных языков разметки, таких как XML и HTML , с помощью синтаксиса встроенной объектной модели документа (DOM). Эта функция позволяет определять и управлять многими типами разнородных активов данных с помощью единообразного и краткого синтаксиса и методологии программирования. [ необходима цитата ]
В отличие от Java, файл исходного кода Groovy может быть выполнен как (некомпилированный) скрипт , если он содержит код вне какого-либо определения класса, если это класс с основным методом или если это Runnable или GroovyTestCase . Сценарий Groovy полностью анализируется, компилируется и генерируется перед выполнением (аналогично Python и Ruby). Это происходит под капотом, и скомпилированная версия не сохраняется как артефакт процесса. [19]
GroovyBeans, свойства [ править ]
GroovyBeans - это версия JavaBeans для Groovy . Groovy неявно генерирует геттеры и сеттеры. В следующем коде, setColor(String color)
и getColor()
неявно генерируются. Последние две строки, которые, похоже, обращаются к цвету напрямую, на самом деле вызывают неявно сгенерированные методы. [20]
class AGroovyBean { цвет строки }def myGroovyBean = новый AGroovyBean ()myGroovyBean . setColor ( 'baby blue' ) утверждает myGroovyBean . getColor () == 'голубой'myGroovyBean . color = ' pewter ' утверждает myGroovyBean . цвет == 'оловянный'
Groovy предлагает простой и последовательный синтаксис для работы со списками и картами , напоминающий синтаксис массивов Java . [21]
def movieList = [ ' Dersu Uzala ' , 'Ran' , 'Seven Samurai' ] // Выглядит как массив, но представляет собой список assert movieList [ 2 ] == 'Seven Samurai' movieList [ 3 ] = 'Casablanca' // Добавляет элемент в список assert movieList . размер () == 4def monthMap = [ 'Январь' : 31 , 'Февраль' : 28 , 'Март' : 31 ] // Объявляет карту assert monthMap [ 'March' ] == 31 // Доступ к записи monthMap [ 'April' ] = 30 // Добавляет запись на карту assert monthMap . размер () == 4
Расширение прототипа [ править ]
Groovy предлагает поддержку расширения прототипа с помощью ExpandoMetaClass
модулей расширения (только в Groovy 2), категорий, подобных Objective-C и DelegatingMetaClass
. [22]
ExpandoMetaClass
предлагает предметно-ориентированный язык (DSL) для легкого выражения изменений в классе, аналогично концепции открытого класса Ruby :
Номер . metaClass { sqrt = { Math . sqrt ( делегат ) } }утверждать 9 . sqrt () == 3 утверждение 4 . sqrt () == 2
Изменения кода Groovy в процессе создания прототипов не видны в Java, поскольку каждый вызов атрибута / метода в Groovy проходит через реестр метаклассов. Доступ к измененному коду можно получить только из Java, перейдя в реестр метакласса.
Groovy также позволяет переопределять методы getProperty()
, propertyMissing()
в частности, позволяя разработчику перехватывать вызовы объекта и указывать для них действие упрощенным аспектно-ориентированным способом. Следующий код позволяет классу java.lang.String
реагировать на hex
свойство:
enum Color { ЧЕРНЫЙ ( '# 000000' ), БЕЛЫЙ ( '#FFFFFF' ), КРАСНЫЙ ( '# FF0000' ), СИНИЙ ( '# 0000FF' ) Шестнадцатеричная строка Цвет ( шестнадцатеричная строка ) { this . шестнадцатеричный = шестнадцатеричный } } Строка . метакласс . getProperty = { свойство String -> def stringColor = делегировать if ( property == 'hex' ) { Color . значения (). найди { это . имя (). equalsIgnoreCase stringColor } ?. шестнадцатеричный } } утверждают "БЕЛЫЙ" . hex == "#FFFFFF" утверждать "СИНИЙ" . hex == "# 0000FF" утверждать "ЧЕРНЫЙ" . hex == "# 000000" утверждать "ЗЕЛЕНЫЙ" . шестнадцатеричный == ноль
Фреймворк Grails широко использует метапрограммирование, чтобы активировать средства динамического поиска GORM , подобные User.findByName('Josh')
и другие. [23]
Точка и круглые скобки [ править ]
Синтаксис Groovy позволяет в некоторых ситуациях опускать скобки и точки. Следующий отличный код
возьми ( кофе ). с ( сахар , молоко ). и ( ликер )
можно записать как
взять кофе с сахаром , молоком и ликером
возможность разработки предметно-ориентированных языков (DSL), которые выглядят как простой английский.
Функциональное программирование [ править ]
Хотя Groovy в основном является объектно-ориентированным языком, он также предлагает функции функционального программирования .
Закрытия [ править ]
Согласно документации Groovy: «Замыкания в Groovy работают аналогично« указателю на метод », позволяя писать и запускать код в более поздний момент времени». [24] Замыкания Groovy поддерживают свободные переменные, т. Е. Переменные, которые не были явно переданы ему в качестве параметра, но существуют в его контексте объявления, частичном приложении (которое он называет « каррирование » [25] ), делегировании, неявном, типизированном и нетипизированные параметры.
При работе с коллекциями определенного типа можно сделать вывод о закрытии, переданном операции над коллекцией:
list = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ]/ * * Ненулевые числа приводятся к истине, поэтому, когда оно% 2 == 0 (даже), оно ложно. * Тип неявного параметра "it" может быть определен средой IDE как целое число. * Его можно также записать как: * list.findAll {Целое число i -> i% 2} * list.findAll {i -> i% 2} * / def odds = list . findAll { это % 2 }утверждать шансы == [ 1 , 3 , 5 , 7 , 9 ]
Группа выражений может быть записана в закрывающем блоке без ссылки на реализацию, а отвечающий объект может быть назначен позже с помощью делегирования:
// Этот блок кода содержит выражения без ссылки на реализацию def operations = { объявление 5 сумма 4 деление 3 печать }
/ * * Этот класс будет обрабатывать операции, которые можно использовать в приведенном выше закрытии. Другой класс * может быть объявлен с теми же методами, но с использованием, например, операций веб-сервиса * в вычислениях. * / class Expression { BigDecimal значение / * * Хотя в качестве параметра передается целое число, оно преобразуется в BigDecimal, как * было определено. Если бы у класса был метод declare (Integer value), он бы использовался вместо него. * / def declare ( BigDecimal значение ) { это . значение = значение } def sum ( BigDecimal valueToAdd ) { это . значение + = valueToAdd } def div ( BigDecimal делитель ) { this . значение / = делитель } Защиту propertyMissing ( строка свойство ) { если ( свойство == "печать" ) Println значение } }
// Здесь определяется, кто будет отвечать на выражения в блоке кода выше. операции . делегат = новое выражение () операции ()
Карри [ править ]
Обычно называется частичное применение , [25] эта функция Groovy позволяет установить параметры для закупорки быть установлены параметром по умолчанию в любом из своих аргументов, создавая новое замыкание с связанным значением. Подача одного аргумента curry()
методу исправит первый аргумент. Подача N аргументов исправит аргументы 1 .. N.
def joinTwoWordsWithSymbol = { символ , первый , второй -> первый + символ + второй } assert joinTwoWordsWithSymbol ( '#' , 'Hello' , 'World' ) == 'Hello # World'def concatWords = joinTwoWordsWithSymbol . curry ( '' ) assert concatWords ( 'Hello' , 'World' ) == 'Hello World'def prependHello = concatWords . curry ( 'Hello' ) // def prependHello = joinTwoWordsWithSymbol.curry ('', 'Hello') assert prependHello ( 'World' ) == 'Hello World'
Карри также можно использовать в обратном направлении (фиксируя последние N аргументов), используя rcurry()
.
def power = { BigDecimal значение , BigDecimal power -> value ** power }def квадрат = мощность . rcurry ( 2 ) def cube = мощность . ркарри ( 3 )assert power ( 2 , 2 ) == 4 assert square ( 4 ) == 16 assert cube ( 3 ) == 27
Превосходные также поддерживает ленивые вычисления , [26] [27] уменьшить / раз , [28] бесконечные структур и неизменность , [29] среди других. [30]
Обработка JSON и XML [ править ]
В нотации объектов JavaScript ( 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 ( писатель ) строитель . languages { язык ( год: 1995 ) { название "Java" парадигма "объектно-ориентированная" типизация "статический" } язык ( год: 1995 ) { название "Ruby" парадигма "функциональная, объектно-ориентированная" типизация "утиная типизация, динамический" } язык ( год: 2003 ) { название "Groovy" парадигма "функциональная, объектно-ориентированная" типизация "утиная типизация, динамическая, статическая" } }
а также может обрабатываться в потоковом режиме StreamingMarkupBuilder
. Чтобы изменить реализацию на JSON, его MarkupBuilder
можно заменить на JsonBuilder
. [31]
Для его анализа и поиска функционального языка findAll
может служить метод Groovy :
def languages = новый XmlSlurper (). parseText писатель . toString ()// Здесь используется синтаксис регулярных выражений Groovy для сопоставления (= ~), который будет приведен к // логическому значению: либо true, если значение содержит нашу строку, либо false в противном случае. def function = languages . язык . findAll { это . paradigm = ~ "функционал" } утверждать функционал . собери { это . name } == [ "Groovy" , "Ruby" ]
Строковая интерполяция [ править ]
В Groovy строки можно интерполировать с помощью переменных и выражений с помощью GStrings: [32]
BigDecimal account = 10.0 def text = "В аккаунте в настоящее время отображается баланс $ account" assert text == "В аккаунте в настоящее время отображается баланс 10.0"
Строки GString, содержащие переменные и выражения, должны быть объявлены с использованием двойных кавычек.
Сложное выражение необходимо заключать в фигурные скобки. Это предотвращает интерпретацию его частей как принадлежащих к окружающей строке, а не к выражению:
BigDecimal minus = 4.0 text = "В аккаунте в настоящее время отображается баланс в размере $ {account - minus}" assert text == "В аккаунте в настоящее время отображается баланс 6.0"// Без скобок для выделения выражения это приведет к следующему: text = "В аккаунте в настоящее время отображается баланс $ account - минус" assert text == "В аккаунте в настоящее время отображается баланс 10,0 - минус"
Вычисление выражения можно отложить, используя синтаксис стрелки:
BigDecimal tax = 0,15 text = "В аккаунте в настоящее время отображается баланс $ {-> account - account * tax}" tax = 0,10// Значение налога было изменено ПОСЛЕ объявления GString. Выражение // переменные связываются только тогда, когда выражение действительно должно быть вычислено: assert text == "В настоящее время на счете отображается баланс 9.000"
Преобразование абстрактного синтаксического дерева [ править ]
Согласно собственной документации Groovy: «Когда компилятор Groovy компилирует скрипты и классы Groovy, в какой-то момент процесса исходный код будет представлен в памяти в виде конкретного синтаксического дерева, а затем преобразован в абстрактное синтаксическое дерево. . Цель преобразований AST - позволить разработчикам подключиться к процессу компиляции, чтобы иметь возможность изменять AST до того, как он будет преобразован в байт-код, который будет запускаться JVM. Преобразования AST предоставляют Groovy улучшенные возможности метапрограммирования во время компиляции, обеспечивающие высокую гибкость на уровне языка без потери производительности во время выполнения ". [33]
Примеры AST в Groovy:
- Преобразование категорий и миксинов
- Неизменяемый макрос AST
- Newify преобразование
- Синглтон-преобразование
среди прочего.
Черты характера [ править ]
Согласно документации Groovy, « Traits - это структурная конструкция языка, которая позволяет: составление поведений, реализацию интерфейсов во время выполнения, переопределение поведения и совместимость с проверкой / компиляцией статических типов».
Черты можно рассматривать как интерфейсы, несущие как реализации по умолчанию, так и состояние. Признак определяется с помощью ключевого слова признака:
trait FlyingAbility { / * объявление трейта * / String fly () { "Я лечу!" } / * объявление метода внутри трейта * / }
Затем его можно использовать как обычный интерфейс, используя ключевое слово implements
:
class Bird реализует FlyingAbility {} / * Добавляет черту FlyingAbility к возможностям класса Bird * / def bird = new Bird () / * создает экземпляр новой Bird * / assert bird . fly () == "Я лечу!" / * класс Bird автоматически получает поведение трейта FlyingAbility * /
Черты характера позволяют использовать широкий спектр способностей, от простого сочинения до тестирования.
Принятие [ править ]
Известные примеры внедрения Groovy включают:
- Adaptavist ScriptRunner включает реализацию Groovy для автоматизации и расширения инструментов Atlassian , используемых более чем 20000 организациями по всему миру. [34] [35]
- Apache OFBiz , система планирования ресурсов предприятия (ERP) с открытым исходным кодом , использует Groovy. [36] [37]
- Eucalyptus , система управления облаком, в значительной степени использует Groovy.
- Gradle - популярный инструмент автоматизации сборки с использованием Groovy.
- LinkedIn использует Groovy и Grails для некоторых своих подсистем. [38]
- LogicMonitor, облачная платформа мониторинга, использует Groovy в источниках данных на основе сценариев. [39]
- Jenkins , платформа для непрерывной интеграции . В версии 2 Jenkins включает плагин Pipeline, который позволяет писать инструкции сборки на Groovy. [40]
- Liferay использует groovy в своем рабочем процессе kaleo
- Sky.com использует Groovy и Grails для обслуживания массового онлайнового медиа-контента. [41]
- SmartThings , открытая платформа для умных домов и потребительского Интернета вещей , использует ориентированное на безопасность подмножество Groovy [42]
- SoapUI предоставляет Groovy в качестве языка для разработки тестов веб-сервисов. [43]
- Survata , стартап по исследованию рынка, использует Groovy и Grails. [ необходима цитата ]
- Европейское патентное ведомство (ЕПВ) разработало язык программирования потоков данных на Groovy, «чтобы использовать сходство в процессах связи с патентным ведомством каждой отдельной страны и преобразовать их в единый универсальный процесс». [ необходима цитата ]
- Хотя Groovy можно интегрировать в любую среду JVM, инфраструктура JBoss Seam предоставляет Groovy, помимо Java, в качестве языка разработки прямо из коробки. [44]
- vCalc.com использует Groovy для всей определяемой пользователем математики в своей математической системе краудсорсинга. [45]
- Wired.com использует Groovy и Grails для отдельного раздела веб-сайта с обзорами продуктов. [46]
- XWiki SAS использует Groovy в качестве языка сценариев в своем продукте с открытым исходным кодом для совместной работы. [47]
Поддержка IDE [ править ]
Многие интегрированные среды разработки (IDE) и текстовые редакторы поддерживают Groovy:
- Android Studio , IDE, используемая для создания приложений для Android
- Редактор атома
- Eclipse через Groovy-Eclipse
- Emacs , используя groovy-mode проекта groovy-emacs-mode.
- IntelliJ IDEA , Community Edition, Grails / Griffon только в Ultimate Edition
- JDeveloper , для использования с Oracle ADF
- jEdit , расширенный текстовый редактор для платформы Java
- Kate , продвинутый текстовый редактор для KDE, поддерживает Groovy и более 200 других форматов файлов.
- NetBeans , начиная с версии 6.5
- Notepad ++ , продвинутый текстовый редактор для Microsoft Windows
- Sublime Text , кроссплатформенный текстовый редактор
- TextMate
- Код Visual Studio
- UltraEdit , редактор программ общего назначения
Диалекты [ править ]
Есть одна альтернативная реализация Groovy:
- Grooscript преобразует код Groovy в код JavaScript . [48] Хотя Grooscript имеет некоторые ограничения по сравнению с Apache Groovy, он может использовать классы домена как на сервере, так и на клиенте. [49] Предоставляется поддержка плагинов для Grails версии 3.0, а также онлайн-преобразования кода. [50]
См. Также [ править ]
- Сравнение языков программирования
- Griffon (framework) - фреймворк рабочего стола
- Project Zero
- Спок (среда тестирования)
Ссылки [ править ]
Цитаты [ править ]
- ^ a b "Релизы - apache / groovy" . Проверено 10 декабря 2020 г. - через GitHub .
- ^ https://mrhaki.blogspot.com/2011/10/groovy-goodness-default-groovy-script.html
- ^ «Производительность Groovy 2.0 по сравнению с Java» . 25 августа 2012 г.
- ^ «Java против Groovy2.0 против простого теста производительности Scala» . 10 июля 2012. Архивировано из оригинала 10 декабря 2012 года . Проверено 7 октября 2012 года .
- ^ a b «Groovy 2.4 и Grails 3.0 станут последними крупными выпусками под основным спонсорством» . 19 янв 2015.
- ^ a b «Groovy присоединяется к Apache Incubator» . 11 марта 2015.
- ↑ Джеймс Страчан (29 августа 2003 г.). «Groovy - рождение нового динамического языка для платформы Java» . Архивировано из оригинала на 1 сентября 2003 года.
- ^ a b «Процесс сообщества Java JSR 241» .
- ^ «Groovy получает первый приз на конкурсе инноваций JAX 2007» . 2007-04-26. Архивировано из оригинала на 2015-05-13 . Проверено 7 октября 2012 .
- ^ «Говорят, за чашкой кофе может случиться многое» . Архивировано из оригинала на 2011-04-19 . Проверено 7 октября 2012 .
- ^ «SpringSource приобретает компанию Groovy и Grails (G2One)» . 11 ноября 2008 г.
- ^ «VMWare приобретает SpringSource» . 10 августа 2009 г.
- ^ "Твит Джеймса Страчана" . 24 ноября 2016 . Проверено 24 ноября 2016 .
- ^ "Объявление в списке рассылки разработчиков" .
- Перейти ↑ König 2007, pg. 32
- ^ "Рекомендации по стилю и языку Groovy для разработчиков Java" . Groovy.codehaus.org. Архивировано из оригинала на 2015-01-17 . Проверено 22 января 2015 .
- ^ «Groovy - Отличия от Java» . Groovy.codehaus.org. Архивировано из оригинала на 2009-03-17 . Проверено 12 августа 2013 .
- ^ "Что нового в Groovy 2.0?" . 28 июня 2012 г.
- ^ König 2007, стр. 37-8
- ^ König 2007, стр. 38-9
- ^ König 2007, стр. 41-3
- ^ "JN3525-MetaClasses" . Архивировано из оригинала на 2012-10-01 . Проверено 7 октября 2012 .
- ^ "Методы метапрограммирования в Groovy и Grails" . 11 июня 2009 г.
- ^ "Groovy - замыкания" . Архивировано из оригинала на 2012-05-22.
- ^ a b «Призывает ли Groovy частичное приложение« каррированием » », 10 августа 2013 г.
- ^ "Groovy - ленивое преобразование" . Архивировано из оригинала на 2012-10-08 . Проверено 7 октября 2012 .
- ^ «Боковые заметки: Ленивые списки в Groovy» . 3 февраля 2011 г.
- ^ "Groovy's Fold" . 20 июня 2011. Архивировано из оригинала 13 февраля 2015 года . Проверено 12 февраля 2015 года .
- ^ «Функциональное программирование с помощью Groovy» . 5 ноя 2011.
- ^ "Функциональное программирование в Groovy" . Архивировано из оригинала на 2012-10-08 . Проверено 7 октября 2012 .
- ^ "JsonBuilder" . Архивировано из оригинала на 2012-10-02 . Проверено 7 октября 2012 .
- ^ "Groovy Strings - разные способы их создания" . 26 декабря 2009 г.
- ^ «Метапрограммирование во время компиляции - Преобразования AST» . Архивировано из оригинала на 2012-10-14 . Проверено 7 октября 2012 .
- ^ «Документация ScriptRunner» .
- ^ "ScriptRunner Press Release со статистикой принятия" .
- ^ "Groovy DSL для бизнес-логики OFBiz" . Открытая вики-страница проекта Apache OFBiz .
- ^ "Примеры простых методов с использованием Groovy" . Открытая вики-страница проекта Apache OFBiz .
- ^ «Grails в LinkedIn» . Проверено 2 июня 2015 .
- ^ «Встроенные сценарии Groovy» . www.logicmonitor.com . Проверено 20 ноября 2020 .
- ^ «Трубопровод Дженкинса» .
- Перейти ↑ Rocher, Graeme (2 октября 2008 г.). «Блог Грэма Роше: перезапуск Sky.com, написанный в Grails» . Блог Грэма Роше . Проверено 2 июня 2015 .
- ^ Анализ безопасности новых приложений для умного дома
- ^ «Сценарии и библиотека скриптов | Сценарии и свойства» . www.soapui.org . Проверено 2 июня 2015 .
- ^ "Глава 11. Groovy интеграции" . docs.jboss.org . Проверено 2 июня 2015 .
- ^ «vCalc, первая социальная платформа для мира математики» . Проверено 5 мая 2016 .
- ^ "Wired.Com" (PDF) . www.springsource.org . Проверено 2 июня 2015 .
- ^ "XWiki SAS" (PDF) . www.springsource.org . Проверено 2 июня 2015 .
- ^ "Документация Grooscript" . 12 сентября 2016 года Архивировано из оригинала 28 июня 2017 . Проверено 4 июля 2017 года .
- ^ «Презентация на SpringOne / 2GX на Grooscript» . 13 декабря 2015 г.
- ^ "Онлайн-преобразования Grooscript" . 15 мая 2017. Архивировано из оригинала 9 июля 2017 года . Проверено 4 июля 2017 года .
Источники [ править ]
- Кениг, Дирк; Пол Кинг; Гийом Лафорж; Гамлет д'Арси; Седрик Шампо; Эрик Прагт; Джон Скит (2015). Groovy в действии, второе издание . Укомплектование персоналом. ISBN 978-1-935182-44-3.
- Барклай, Кеннет; Джон Сэвидж (2007). Программирование Groovy: Введение для разработчиков Java . ISBN 978-0-12-372507-3. Архивировано из оригинала на 2010-01-12 . Проверено 19 июля 2007 .
- Дэвис, Скотт (2008). Отличные рецепты: смазка колес Java . ISBN 978-0-9787392-9-4.
- Субраманиам, Венкат (2008). Программирование Groovy: динамическая производительность для Java-разработчика . ISBN 978-1-934356-09-8.
Внешние ссылки [ править ]
- Официальный веб-сайт
- Домашняя страница Grooscript
- Groovy в Curlie