2012-05-14 7 views
6

Я пишу скрипт в Groovy, и я хотел бы, чтобы кто-то мог его выполнить, просто выполнив ./myscript.groovy. Однако для этого сценария требуется сторонняя библиотека (MySQL JDBC), и я не знаю, каким образом предоставить этот сценарий, кроме как через аргумент -classpath или -cp, например.groovy script classpath

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

По причинам, я не буду вдаваться в здесь, это не на самом деле можно указать местоположение JAR для сценария с помощью -classpath/-cp аргумент. Есть ли способ загрузить JAR из самого скрипта? Я попытался с помощью @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 

Но это приводит следующее сообщение об ошибке:

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) 

Есть ли способ, что я могу выполнить этот скрипт, используя только ./monitor-vouchers.groovy

ответ

12

Вы должны быть в состоянии сделать:

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

Еще две опции:

  1. Поставьте банку в $ {user.home}/заводную/Библиотека
  2. Если сосуд находится в известном месте, используйте этот код, чтобы загрузить его в текущий загрузчик класса:.

    this.class.classLoader.rootLoader.addURL (новый URL())

+1

Если вы когда-либо хотите увидеть, что находится в вашем пути к классам, запустите этот 'this.class.classLoader.rootLoader.URLs.each { println it} '- для меня кажется, что ~/.groovy/lib там нет. – MarkHu

Смежные вопросы