2011-05-14 11 views
12

Grape parece funcionar bastante bien para agregar jar a classpath. Es también hace un montón de otras cosas, como la gestión de obtención y dependencia. p.Make groovy script toma un jar del sistema de archivos como 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)}" 
} 

Desafortunadamente, si hay un tarro en mi sistema de archivos que quiero dinámicamente añadir al sistema de archivos entonces tengo que recurrir a una solución mucho más feo .

#!/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() 

¿Hay alguna manera de hacer que Grab saque un frasco del sistema de archivos? Si no, ¿puedo de alguna manera reproducir lo que está haciendo la uva en groovy/java?

Me gustaría que esta solución funcione para scripts que pueden ser ejecutados por muchos usuarios y muchos archivos jar incompatibles, por lo que no será posible agregar archivos jar a un directorio común como ~/.groovy/lib /.

Podría crear un repositorio local de maven para libarías de jar locales, pero que parece excesivo.

Respuesta

3

Puede customize the ivy settings que usa Grape al crear un archivo ~/.groovy/grapeConfig.xml.

He aquí un ejemplo de cómo utilizar el sistema de archivos local como repositorio:

<ibiblio name="local" root="file:${user.home}/.m2/repository/" m2compatible="true"/> 
+0

Gracias por la respuesta. Mencioné que no quería crear un repositorio maven local; me gustaría poder especificar cualquier jar en el sistema de archivos. –

+0

Lo siento, no me di cuenta de eso. Desde el [código fuente] (https://svn.codehaus.org/groovy/trunk/groovy/modules/grape-ivy/), parece que Grape está completamente construido encima de Ivy. Probablemente tendrías que implementar tu propia transformación AST para que esto funcione. –

+0

Gracias por el enlace de origen, pero no puedo entenderlo :(Es una lástima, parece que la uva puede funcionar (descargar y cargar una jarra de hiedra) pero no caminar (cargar un jar del sistema de archivos) –

7

Así es como lo resolví. Cuando Grape (Ivy) quiere algo lo almacena en caché en el directorio ~/.groovy/grapes. Todo lo que necesita hacer es simplemente crear su propio archivo ivy.xml y arrojar su jar allí. Lo descubrí solo mirando algunos de los otros artefactos donwloaded de maven. Aquí hay un pequeño ejemplo ...

Utilizamos Oracle aquí y quería que el archivo jdbc jar pudiera ser 'capturado' por mis scripts Groovy. Desafortunadamente, no pude encontrar ningún repositorio que tuviera este contenedor en la web.

  • Paso 1: crear el directorio ~/.groovy/grapes/com.oracle
  • Paso 2: crear el directorio ~/.groovy/grapes/com.oracle/ojdbc6
  • Paso 3: crear el directorio ~/.groovy/grapes/com.oracle/ojdbc6/jars
  • Paso 4: Obtener una copia del archivo jar ojdbc de Oracle y cambiarle el nombre. Nuestra versión de Oracle es 11.2.0.1.0 y usamos Java6, así que obtuve el archivo ojdbc6.jar instalado localmente y lo copié como ojdbc6-11.2.0.1.0.jar. Este archivo lo puse en el directorio creado en el paso anterior.
  • Paso 5: cree un archivo de configuración ivy-11.2.0.1.0.xml. Este archivo debe colocarse en el directorio creado en el paso 2. Para este paso, he confiado en gran medida en ejemplos de otros artefactos capturados. Cualquier biblioteca de apache commons es un buen ejemplo.

Aquí está mi 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> 

Ahora puedo usar este jar en mis secuencias de comandos groovy con lo siguiente ....

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


Para facilitar las cosas para el despliegue de esta uva a varios servidores que he creado un archivo zip que podía extraer en cualquier lugar ....

$ 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 
Cuestiones relacionadas