2012-05-14 1 views
6

Scrivo una sceneggiatura in Groovy e vorrei che qualcuno fosse in grado di eseguirlo semplicemente eseguendo ./myscript.groovy. Tuttavia, questo script richiede una libreria di terze parti (MySQL JDBC) e non conosco alcun modo per fornire questo allo script se non tramite un argomento -classpath o -cp, ad es.classpath di script groovy

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

Per ragioni che non voglio in questa sede, in realtà non è possibile fornire la posizione JAR allo script utilizzando il -classpath/argomento -cp. C'è un modo in cui posso caricare il JAR all'interno dello script stesso? Ho provato ad utilizzare @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 

Ma questo causa il seguente errore:

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) 

C'è un modo per eseguire questo script utilizza solo ./monitor-vouchers.groovy

risposta

12

Si dovrebbe essere in grado di fare:

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

Altre due opzioni:

  1. Mettere il vaso in $ {} user.home/Groovy/lib
  2. Se il vaso è in una posizione nota, utilizzare questo codice per caricarlo nella class loader corrente:.

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

+1

Se mai voglia di vedere ciò che è nel vostro percorso di classe, eseguire questo 'this.class.classLoader.rootLoader.URLs.each { println it} '- per me, sembra che ~/.groovy/lib non sia lì. – MarkHu