Jump to content

Апач Groovy

классный
Крутой логотип
Парадигма Мультипарадигмальность : объектно-ориентированная , императивная , функциональная , аспектно-ориентированная , скриптовая.
Разработано Джеймс Страчан
Разработчик Гийом Лафорж (председатель PMC)
Йохен Теодору (технический руководитель)
Пол Кинг
Седрик Шампо
Впервые появился 2003 год ; 21 год назад ( 2003 )
Стабильная версия 4.0.22 [1]  Отредактируйте это в Викиданных (27 июня 2024 г .; 26 дней назад ( 27 июня 2024 г. ) ) [±]
Предварительный выпуск
4.0.0-бета-1 / 6 сентября 2021 г .; 2 года назад ( 06.09.2021 ) [2]
Дисциплина набора текста Динамичный , статичный , сильный , утиный
Платформа Ява SE
Лицензия Лицензия Апач 2.0
Расширения имен файлов .groovy, .gvy, .gy, .gsh[3]
Веб-сайт просто классно .org Отредактируйте это в Викиданных
Основные реализации
Градл , Грааль
Под влиянием
Java , Python , Руби , 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 Innovation Award. [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 (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 также поддерживает модульность (возможность поставлять только необходимые jar-файлы в соответствии с потребностями проекта, тем самым уменьшая размер библиотеки Groovy), проверку типов, статическую компиляцию, улучшения синтаксиса Project Coin, блоки multicatch и постоянное повышение производительности с использованием invokedynamic инструкция, представленная в Java 7 . [21]

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

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

GroovyBeans, свойства

[ редактировать ]

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

class AGroovyBean {
  String color
}

def myGroovyBean = new AGroovyBean()

myGroovyBean.setColor('baby blue')
assert myGroovyBean.getColor() == 'baby blue'

myGroovyBean.color = 'pewter'
assert myGroovyBean.color == 'pewter'

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

def movieList = ['Dersu Uzala', 'Ran', 'Seven Samurai']  // Looks like an array, but is a list
assert movieList[2] == 'Seven Samurai'
movieList[3] = 'Casablanca'  // Adds an element to the list
assert movieList.size() == 4

def monthMap = [ 'January' : 31, 'February' : 28, 'March' : 31 ]  // Declares a map
assert monthMap['March'] == 31  // Accesses an entry
monthMap['April'] = 30  // Adds an entry to the map
assert monthMap.size() == 4

Расширение прототипа

[ редактировать ]

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

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

Number.metaClass {
  sqrt = { Math.sqrt(delegate) }
}

assert 9.sqrt() == 3
assert 4.sqrt() == 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 = { String property ->
  def stringColor = delegate
  if (property == 'hex') {
    Color.values().find { it.name().equalsIgnoreCase stringColor }?.hex
  }
}

assert "WHITE".hex == "#FFFFFF"
assert "BLUE".hex == "#0000FF"
assert "BLACK".hex == "#000000"
assert "GREEN".hex == null

Платформа Grails широко использует метапрограммирование для обеспечения возможности динамического поиска GORM , например User.findByName('Josh') и другие. [26]

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

[ редактировать ]

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

take(coffee).with(sugar, milk).and(liquor)

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

take coffee with sugar, milk and liquor

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

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

[ редактировать ]

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

Замыкания

[ редактировать ]

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

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

list = [1, 2, 3, 4, 5, 6, 7, 8, 9]

/* 
 * Non-zero numbers are coerced to true, so when it % 2 == 0 (even), it is false.
 * The type of the implicit "it" parameter can be inferred as an Integer by the IDE.
 * It could also be written as:
 * list.findAll { Integer i -> i % 2 }
 * list.findAll { i -> i % 2 }
 */
def odds = list.findAll { it % 2 }

assert odds == [1, 3, 5, 7, 9]

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

// This block of code contains expressions without reference to an implementation
def operations = {
  declare 5
  sum 4
  divide 3
  print
}
/* 
 * This class will handle the operations that can be used in the closure above. Another class
 * could be declared having the same methods, but using, for example, webservice operations
 * in the calculations.
 */
class Expression {
  BigDecimal value

  /* 
   * Though an Integer is passed as a parameter, it is coerced into a BigDecimal, as was 
   * defined. If the class had a 'declare(Integer value)' method, it would be used instead.
   */
  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
  }
}
// Here is defined who is going to respond the expressions in the block of code above.
operations.delegate = new Expression()
operations()

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

def joinTwoWordsWithSymbol = { symbol, first, second -> first + symbol + second }
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 value, BigDecimal power ->
  value**power
}

def square = power.rcurry(2)
def cube = power.rcurry(3)

assert power(2, 2) == 4
assert square(4) == 16
assert cube(3) == 27

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

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

[ редактировать ]

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

<languages>
  <language year="1995">
    <name>Java</name>
    <paradigm>object oriented</paradigm>
    <typing>static</typing>
  </language>
  <language year="1995">
    <name>Ruby</name>
    <paradigm>functional, object oriented</paradigm>
    <typing>duck typing, dynamic</typing>
  </language>
  <language year="2003">
    <name>Groovy</name>
    <paradigm>functional, object oriented</paradigm>
    <typing>duck typing, dynamic, static</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]

Чтобы проанализировать его и найти функциональный язык, Groovy's findAll метод может служить:

def languages = new XmlSlurper().parseText writer.toString()

// Here is employed Groovy's regex syntax for a matcher (=~) that will be coerced to a 
// boolean value: either true, if the value contains our string, or false otherwise.
def functional = languages.language.findAll { it.paradigm =~ "functional" }
assert functional.collect { it.name } == ["Groovy", "Ruby"]

Строковая интерполяция

[ редактировать ]

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

BigDecimal account = 10.0
def text = "The account shows currently a balance of $account"
assert text == "The account shows currently a balance of 10.0"

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

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

BigDecimal minus = 4.0
text = "The account shows currently a balance of ${account - minus}"
assert text == "The account shows currently a balance of 6.0"

// Without the brackets to isolate the expression, this would result:
text = "The account shows currently a balance of $account - minus"
assert text == "The account shows currently a balance of 10.0 - minus"

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

BigDecimal tax = 0.15
text = "The account shows currently a balance of ${->account - account*tax}"
tax = 0.10

// The tax value was changed AFTER declaration of the GString. The expression 
// variables are bound only when the expression must actually be evaluated:
assert text == "The account shows currently a balance of 9.000"

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

[ редактировать ]

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

Примеры AST в Groovy:

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

среди других.

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

def "maximum of #a and #b is #c" () {
  expect:
  Math.max (a, b) == c

  where:
  a | b || c
  3 | 5 || 5
  7 | 0 || 7
  0 | 0 || 0
}

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

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

trait FlyingAbility { /* declaration of a trait */
  String fly() { "I'm flying!" } /* declaration of a method inside a trait */
}

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

class Bird implements FlyingAbility {} /* Adds the trait FlyingAbility to the Bird class capabilities */
def bird = new Bird() /* instantiate a new Bird */
assert bird.fly() == "I'm flying!" /* the Bird class automatically gets the behavior of the FlyingAbility trait */

Черты позволяют использовать широкий спектр способностей: от простого составления до тестирования.

Принятие

[ редактировать ]

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

  • Adaptavist ScriptRunner включает реализацию Groovy для автоматизации и расширения инструментов Atlassian , которые используются более чем 20 000 организациями по всему миру. [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:

См. также

[ редактировать ]
  1. ^ «Выпуск 4.0.22» . 27 июня 2024 г. Проверено 23 июля 2024 г.
  2. ^ «Релизы — apache/groovy» . Проверено 9 апреля 2020 г. - через GitHub .
  3. ^ «Groovy Goodness: расширения файлов сценариев Groovy по умолчанию» .
  4. ^ «Производительность Groovy 2.0 по сравнению с Java» . 25 августа 2012 г.
  5. ^ «Простой тест производительности Java, Groovy2.0 и Scala» . 10 июля 2012 г. Архивировано из оригинала 10 декабря 2012 г. Проверено 7 октября 2012 г.
  6. ^ Jump up to: Перейти обратно: а б «Groovy 2.4 и Grails 3.0 станут последними крупными релизами под основной спонсорской поддержкой» . 19 января 2015 г.
  7. ^ Jump up to: Перейти обратно: а б «Groovy присоединяется к инкубатору Apache» . 11 марта 2015 г.
  8. ^ Джеймс Страчан (29 августа 2003 г.). «Groovy — рождение нового динамического языка для платформы Java» . Архивировано из оригинала 1 сентября 2003 года.
  9. ^ Jump up to: Перейти обратно: а б «Процесс сообщества Java JSR 241» .
  10. ^ «Groovy получает первый приз на премии за инновации JAX 2007» . 26 апреля 2007 г. Архивировано из оригинала 13 мая 2015 г. Проверено 7 октября 2012 г.
  11. ^ «Говорят, за чашкой кофе многое может случиться» . Архивировано из оригинала 19 апреля 2011 г. Проверено 7 октября 2012 г.
  12. ^ «SpringSource приобретает компанию Groovy and Grails (G2One)» . 11 ноября 2008 г.
  13. ^ «VMWare приобретает SpringSource» . 10 августа 2009 г.
  14. ^ «Твит от Джеймса Страчана» . 24 ноября 2016 года . Проверено 24 ноября 2016 г.
  15. ^ «Объявление в списке рассылки разработчиков» .
  16. ^ «Выпуск GROOVY_3_0_0 · apache/groovy» . Гитхаб . Проверено 27 марта 2024 г.
  17. ^ «Выпуск GROOVY_4_0_0 · apache/groovy» . Гитхаб . Проверено 27 марта 2024 г.
  18. ^ Кинг 2007, стр. 32
  19. ^ «Руководство по стилю Groovy и функциям языка для разработчиков Java» . Groovy.codehaus.org. Архивировано из оригинала 17 января 2015 г. Проверено 22 января 2015 г.
  20. ^ «Groovy – Отличия от Java» . Groovy.codehaus.org. Архивировано из оригинала 17 марта 2009 г. Проверено 12 августа 2013 г.
  21. ^ «Что нового в Groovy 2.0?» . 28 июня 2012 г.
  22. ^ Кинг 2007, стр. 37-8.
  23. ^ Кинг 2007, стр. 38-9.
  24. ^ Кинг 2007, стр. 41-3.
  25. ^ «JN3525-Метаклассы» . Архивировано из оригинала 1 октября 2012 г. Проверено 7 октября 2012 г.
  26. ^ «Метапрограммирование в Groovy и Grails» . 11 июня 2009 г.
  27. ^ «Groovy — Замыкания» . Архивировано из оригинала 22 мая 2012 г.
  28. ^ Jump up to: Перейти обратно: а б «Называет ли groovy частичное приложение каррированием» , 10 августа 2013 г.
  29. ^ «Groovy — ленивая трансформация» . Архивировано из оригинала 8 октября 2012 г. Проверено 7 октября 2012 г.
  30. ^ «Примечания: ленивые списки в Groovy» . 3 февраля 2011 г.
  31. ^ «Сгиб Груви» . 20 июня 2011 г. Архивировано из оригинала 13 февраля 2015 г. Проверено 12 февраля 2015 г.
  32. ^ «Функциональное программирование с помощью Groovy» . 5 ноября 2011 г.
  33. ^ «Программирование функций в Groovy» . Архивировано из оригинала 8 октября 2012 г. Проверено 7 октября 2012 г.
  34. ^ «ДжсонБилдер» . Архивировано из оригинала 2 октября 2012 г. Проверено 7 октября 2012 г.
  35. ^ «Groovy Strings — разные способы их создания» . 26 декабря 2009 г.
  36. ^ «Метапрограммирование во время компиляции — преобразования AST» . Архивировано из оригинала 14 октября 2012 г. Проверено 7 октября 2012 г.
  37. ^ Кинг, Пол (2020). «История языка программирования Groovy» . Учеб. Программа АКМ. Ланг . 4:53 . дои : 10.1145/3386326 .
  38. ^ «Документация ScriptRunner» .
  39. ^ «Пресс-релиз ScriptRunner со статистикой внедрения» .
  40. ^ «Groovy DSL для бизнес-логики OFBiz» . Открытая вики проекта Apache OFBiz .
  41. ^ «Примеры простых методов с использованием Groovy» . Открытая вики проекта Apache OFBiz .
  42. ^ «Грааль в LinkedIn» . Проверено 2 июня 2015 г.
  43. ^ «Встроенные сценарии Groovy» . www.logicmonitor.com . Проверено 20 ноября 2020 г.
  44. ^ «Пайплайн Дженкинса» .
  45. ^ Роше, Грэм (2 октября 2008 г.). «Блог Грэма Роше: перезапуск Sky.com, написанного на Grails» . Блог Грэма Роше . Проверено 2 июня 2015 г.
  46. ^ Анализ безопасности новых приложений для умного дома.
  47. ^ «Сценарии и библиотека сценариев | Сценарии и свойства» . www.soapui.org . Проверено 2 июня 2015 г.
  48. ^ «Глава 11. Groovy-интеграция» . docs.jboss.org . Проверено 2 июня 2015 г.
  49. ^ «vCalc, первая в истории социальная платформа для мира математики» . 4 ноября 2014 года . Проверено 5 мая 2016 г.
  50. ^ «Wired.Com» (PDF) . www.springsource.org . Проверено 2 июня 2015 г.
  51. ^ «XWiki SAS» (PDF) . www.springsource.org . Проверено 2 июня 2015 г.
  52. ^ «Документация Grooscript» . 12 сентября 2016 г. Архивировано из оригинала 28 июня 2017 г. . Проверено 4 июля 2017 г.
  53. ^ «Презентация Grooscript на SpringOne/2GX» . 13 декабря 2015 г.
  54. ^ «Онлайн-конверсии Grooscript» . 15 мая 2017 года. Архивировано из оригинала 9 июля 2017 года . Проверено 4 июля 2017 г.

Источники

[ редактировать ]
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 52abd5090f7a65b051554dcf74598b49__1711585380
URL1:https://arc.ask3.ru/arc/aa/52/49/52abd5090f7a65b051554dcf74598b49.html
Заголовок, (Title) документа по адресу, URL1:
Apache Groovy - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)