2012-05-14 17 views
6

Estoy escribiendo un script en Groovy y me gustaría que alguien pueda ejecutarlo simplemente ejecutando ./myscript.groovy. Sin embargo, este script requiere una biblioteca de terceros (MySQL JDBC), y no sé de ninguna manera para proporcionar esto a la secuencia de comandos que no sea a través de un argumento -classpath o -cp, p. Ej.groovy script classpath

`./monitor-vouchers.groovy -cp /path/to/mysql-lib.jar` 

Por razones que no voy a entrar aquí, en realidad no es posible proporcionar la ubicación JAR a la secuencia de comandos con el argumento -classpath/cp. ¿Hay alguna forma de que pueda cargar el JAR desde el propio script? He intentado utilizar @Grab

import groovy.sql.Sql 


@Grab(group='mysql', module='mysql-connector-java', version='5.1.19') 
def getConnection() { 
    def dbUrl = 'jdbc:mysql://database1.c5vveqm7rqgx.eu-west-1.rds.amazonaws.com:3306/vouchers_prod' 
    def dbUser = 'pucaroot' 
    def dbPassword = 'password' 
    def driverClass = "com.mysql.jdbc.Driver" 

    return Sql.newInstance(dbUrl, dbUser, dbPassword, driverClass) 
} 

getConnection().class 

Pero esto hace que el siguiente error:

Caught: java.sql.SQLException: No suitable driver 
java.sql.SQLException: No suitable driver 
     at monitor-vouchers.getConnection(monitor-vouchers.groovy:13) 
     at monitor-vouchers.run(monitor-vouchers.groovy:17) 

¿Hay alguna manera de ejecutar esta secuencia de comandos con solo ./monitor-vouchers.groovy

Respuesta

12

Usted debe ser capaz de hacer:

import groovy.sql.Sql 

@GrabConfig(systemClassLoader=true) 
@Grab('mysql:mysql-connector-java:5.1.19') 
def getConnection() { 
    def dbUrl = 'jdbc:mysql://database1.c5vveqm7rqgx.eu-west-1.rds.amazonaws.com:3306/vouchers_prod' 
    def dbUser = 'pucaroot' 
    def dbPassword = 'bigsecret' 
    def driverClass = "com.mysql.jdbc.Driver" 

    return Sql.newInstance(dbUrl, dbUser, dbPassword, driverClass) 
} 

getConnection().class 
7

Dos opciones más:

  1. Ponga el frasco en $ {} user.home/maravilloso/lib
  2. Si el vaso está en una ubicación conocida, utilice este código para cargarlo en el cargador de clases actual:.

    this.class.classLoader.rootLoader.addURL (nueva URL())

+1

Si alguna vez quiere ver lo que está en la ruta de clases, ejecute este '{this.class.classLoader.rootLoader.URLs.each println it} '--para mí, parece que ~/.groovy/lib no está ahí. – MarkHu