2012-05-14 44 views
6

Tôi đang viết một tập lệnh trong Groovy và tôi muốn ai đó có thể thực thi nó đơn giản bằng cách chạy ./myscript.groovy. Tuy nhiên, tập lệnh này yêu cầu thư viện của bên thứ ba (MySQL JDBC) và tôi không biết cách nào để cung cấp tệp này cho tập lệnh khác ngoài thông qua đối số -classpath hoặc -cp, ví dụ:đường dẫn tập lệnh groovy

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

Vì lý do tôi không truy cập vào đây, không thể cung cấp vị trí JAR cho tập lệnh bằng đối số -classpath/-cp. Có cách nào để tôi có thể tải JAR từ bên trong tập lệnh không? Tôi đã cố gắng sử dụng @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 

Nhưng điều này gây ra các lỗi sau:

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ó cách nào tôi có thể thực hiện kịch bản này chỉ sử dụng ./monitor-vouchers.groovy

Trả lời

12

Bạn sẽ có thể làm:

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

Hai tùy chọn khác:

  1. Đặt jar trong $ {user.home}/groovy/lib
  2. Nếu jar là ở một vị trí nổi tiếng, sử dụng mã này để nạp nó vào bộ nạp lớp hiện tại:.

    this.class.classLoader.rootLoader.addURL (URL mới())

+1

Nếu bạn đã bao giờ muốn nhìn thấy những gì có trong classpath của bạn, hãy chạy này 'this.class.classLoader.rootLoader.URLs.each { println it} '--cho tôi, có vẻ như ~/.groovy/lib không có trong đó. – MarkHu

Các vấn đề liên quan