Заставить groovy скрипт вытащить банку из файловой системы как виноград - PullRequest
13 голосов
/ 14 мая 2011

Похоже, что Grape довольно хорошо подходит для добавления банок в ваш путь к классам. Это также делает много других вещей, таких как выборка и управление зависимостями. например,

#!/home/robert/bin/groovy

import org.apache.commons.lang.StringUtils

@Grab(group='commons-lang', module='commons-lang', version='2.4')

def strings = ['Hello', 'Groovy', 'AVeryLongWord!', 'A simple sentence']
strings.each { String aString ->
    println "$aString: ${StringUtils.abbreviate(aString,10)}"
}

К сожалению, если в моей файловой системе есть баночка, которую я хочу динамически добавить в файловую систему, то я должен прибегнуть к гораздо уродливое решение.

#!/home/robert/bin/groovy

def loader = this.class.classLoader.rootLoader
loader.addURL(new File("/home/robert/somejars/arithmetic-1.1.jar").toURI().toURL())

// can't use traditional package import
arithmeticMainClass = Class.forName("org.scharp.arithmetic.Main")

println "42 - 23 = " + arithmeticMainClass.subtract(42, 23)

// can't use "new" operator
myArithmeticObject = arithmeticMainClass.newInstance()

Есть ли способ заставить банку взять банку из файловой системы? Если не, могу ли я как-то повторить то, что виноград делает в groovy / java?

Мне бы хотелось, чтобы это решение работало для сценариев, которые могут выполняться многими пользователями и множеством несовместимых jar-файлов, поэтому добавление jar-файлов в общий каталог, например ~ / .groovy / lib /, не будет работать.

Я мог бы создать локальный репозиторий maven для локальных, jar-библиотек, но это похоже на излишество.

Ответы [ 3 ]

7 голосов
/ 05 ноября 2013

Вот как я это решил.Когда Grape (Ivy) хочет что-то, он кэширует его в каталоге ~/.groovy/grapes.Все, что вам нужно сделать, это просто создать свой собственный файл ivy.xml и добавить туда банку.Я понял это, просто посмотрев на некоторые другие артефакты, загруженные из Maven.Вот небольшой пример .....

Мы используем Oracle здесь, и я хотел, чтобы этот jar-файл jdbc мог быть "захвачен" моими скриптами Groovy.К сожалению, я не смог найти ни одного хранилища, в котором был бы этот jar-файл.

  • Шаг 1: создать каталог ~/.groovy/grapes/com.oracle
  • Шаг 2: создать каталог ~/.groovy/grapes/com.oracle/ojdbc6
  • Шаг 3: создать каталог ~/.groovy/grapes/com.oracle/ojdbc6/jars
  • Шаг 4: Получить копию файла jar Oracle ojdbc и переименовать его.Наша версия oracle - 11.2.0.1.0, и мы используем Java6, поэтому я получил локально установленный файл ojdbc6.jar и скопировал его как ojdbc6-11.2.0.1.0.jar.Этот файл я поместил в каталог, созданный на предыдущем шаге.
  • Шаг 5: создайте файл конфигурации ivy-11.2.0.1.0.xml. Этот файл следует поместить в каталог, созданный на шаге 2. ДляНа этом шаге я в значительной степени опирался на примеры из других захваченных артефактов.Любой apache commons lib - хороший пример.

Вот мой xml.

<?xml version="1.0" encoding="UTF-8"?>
<ivy-module version="2.0" xmlns:m="http://ant.apache.org/ivy/maven"
>
  <info organisation="com.oracle" module="ojdbc6" revision="11.2.0.1.0" status="release" publication="20130102153401">
    <license name="" />
    <description homepage="">Oracle ojdbc driver</description>
  </info>
  <configurations>
    <conf name="default" visibility="public" description="" extends="runtime,master" />
    <conf name="master" visibility="public" description="" />
    <conf name="compile" visibility="public" description="" />
    <conf name="provided" visibility="public" description="" />
    <conf name="runtime" visibility="public" description="" extends="compile" />
    <conf name="test" visibility="public" description="" extends="runtime" />
    <conf name="system" visibility="public" description="" />
    <conf name="sources" visibility="public" description="" />
    <conf name="javadoc" visibility="public" description="" />
    <conf name="optional" visibility="public" description="" />
  </configurations>
  <publications>
    <artifact name="ojdbc6" type="jar" ext="jar" conf="master" />
  </publications>
</ivy-module>

Теперь я могу использовать этот jar в моих скриптах groovy со следующими ....

@Grapes([
  @GrabConfig(systemClassLoader=true),
  @Grab('com.oracle:ojdbc6:11.2.0.1.0'),
])
import groovy.sql.*


Чтобы упростить развертывание этого винограда на нескольких серверах, я создал zip-файл, который мог бы распаковать в любое место ....

$ unzip -qql oracle_jdbc_groovy_grape.zip
        0  06-11-2012 13:50   .groovy/grapes/com.oracle/
        0  06-12-2012 14:17   .groovy/grapes/com.oracle/ojdbc6/
        0  06-12-2012 14:17   .groovy/grapes/com.oracle/ojdbc6/jars/
  2111220  06-11-2012 11:46   .groovy/grapes/com.oracle/ojdbc6/jars/ojdbc6-11.2.0.1.0.jar
     2349  06-11-2012 11:50   .groovy/grapes/com.oracle/ojdbc6/ivy-11.2.0.1.0.xml
4 голосов
/ 15 мая 2011

Вы можете настроить параметры плюща , которые использует Grape, создав файл ~/.groovy/grapeConfig.xml.

Вот пример использования локальной файловой системы в качестве хранилища:

<ibiblio name="local" root="file:${user.home}/.m2/repository/" m2compatible="true"/>
1 голос
/ 27 мая 2011

Был некоторый интерес к добавлению этой функции в виноград , но ничего серьезного. Я предполагаю, что вряд ли это будет добавлено в ближайшем будущем. (6-18 месяцев)

...