2012-05-14 7 views
6

Ich schreibe ein Skript in Groovy und ich möchte jemand in der Lage sein, es einfach auszuführen, indem Sie ./myscript.groovy ausführen. Dieses Skript erfordert jedoch eine Bibliothek eines Drittanbieters (MySQL JDBC), und ich kenne keine Möglichkeit, dies dem Skript über ein -classpath oder -cp Argument, z.groovy Skript Classpath

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

Aus Gründen, die ich hier nicht näher eingehen, ist es nicht wirklich möglich, die JAR-Position, um das Skript, um das -classpath/-cp Argument. Gibt es eine Möglichkeit, die JAR aus dem Skript selbst zu laden? Ich habe versucht, @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 

Verwendung Aber das verursacht den folgenden Fehler:

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) 

Gibt es eine Weise, die ich dieses Skript nur ./monitor-vouchers.groovy

Antwort

12

mit ausführen können, sollten Sie in der Lage sein zu tun:

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

Zwei weitere Optionen:

  1. Setzen Sie das Glas in $ {user.home}/groovy/lib
  2. Wenn das Glas in einem bekannten Ort ist, diesen Code verwenden es in der aktuellen Class-Loader zu laden.

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

+1

Wenn Sie jemals sehen wollen, was in Ihrem classpath ist, führen diese 'this.class.classLoader.rootLoader.URLs.each { println} '- für mich scheint es ~/.groovy/lib ist nicht drin. – MarkHu

Verwandte Themen