如何将外部jar文件添加到Gradle构建脚本

30

现在我使用 Gradle 作为我的构建工具。我的某个任务需要访问 MySQL 数据库。以下是我的 Gradle 脚本:

import groovy.sql.Sql

buildscript {
    dependencies {
        classpath files('/usr/share/java/mysql-connector-java.jar')
    }
}


task connectToDb << {
    def props = [user: 'user', password: 'password', allowMultiQueries: 'true'] as Properties
    def url = 'jdbc:mysql://mysqlhost:3306/db'
    def driver = 'com.mysql.jdbc.Driver'
    def sql = Sql.newInstance(url, props, driver)

    sql.eachRow('show tables') { row ->
        println row[0]
    }
}

我试图在Ubuntu Lucid系统上运行它,但总是失败。 Gradle使用以下信息抱怨: 任务':connectToDb'执行失败。 原因:java.lang.ClassNotFoundException:com.mysql.jdbc.Driver

似乎构建脚本没有包含mysql连接器jar库。请问有谁能告诉我如何正确配置外部jar文件?谢谢。

3个回答

43

这对我很有效。 请参阅有关原因的此线程http://gradle.1045684.n5.nabble.com/using-jdbc-driver-in-a-task-fails-td1435189.html

import groovy.sql.Sql

repositories {
    mavenCentral()
}
configurations {
    driver
}
dependencies {
    driver group: 'mysql', name: 'mysql-connector-java', version: '5.1.16'
}

URLClassLoader loader = GroovyObject.class.classLoader
configurations.driver.each {File file ->
    loader.addURL(file.toURL())
}

task connectToDb << {
    def props = [user: 'user', password: 'password', allowMultiQueries: 'true'] as Properties
    def url = 'jdbc:mysql://mysqlhost:3306/db'
    def driver = 'com.mysql.jdbc.Driver'
    def sql = Sql.newInstance(url, props, driver)

    sql.eachRow('show tables') { row ->
        println row[0]
    }
}

谢谢!你的答案为我解决了一个类似的问题,也促使我写了这个问答 - Taytay

10

我用类似这样的方法得到了成功:

buildscript {
    dependencies {
        classpath fileTree(dir: '/usr/share/java',
            includes: ['mysql-connector-java.jar'])
    }
}

说实话,如果是在你的情况下,我更喜欢这个:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'mysql:mysql-connector-java:5.1.16'
    }
}

嗨,Alan,谢谢你的回答。我尝试了你提供的两个建议,但它们都失败了。然后我在$GRADLE_HOME/lib/中创建了mysql-connector-java.jar的软链接,现在它可以工作了。那么问题可能是什么?或者你能给我一些提示吗?顺便说一下,我的gradle版本是0.9.1。再次感谢你。 - Jeff Li
有时候,知道某个东西失败的方式比仅仅知道它失败更加重要。请更新您的问题以指明具体情况。 - Alan Krueger
这很简单!不确定为什么其他答案得到了更多的投票?我的背景:尝试使用Liquibase插件来操作Oracle。 - RN.
这里的答案可能没有经过测试 - 它不起作用,因为加载SQL驱动程序的类加载器不是正确的“根”类加载器。而将lib链接到root中的解决方案 - 实现了将其加载到root类加载器中 - 显然不是自包含的(您不能只检出项目并构建它,您必须干扰本地Gradle安装,即明显的非解决方案)。 - stolsvik

0

以下代码片段可用于连接和查询Microsoft SQL SERVER数据库。请注意,微软不会在任何在线仓库(如MavenCentral())上提供jar文件“sqljdbc42.jar”(即jdbc驱动程序)。因此,您需要从微软的网站下载此jar文件并保存在项目工作区目录中。 下载'sqljdbc_4.2.6420.100_enu.exe'

解压下载的文件并进入Microsoft JDBC Driver 4.2 for SQL Server-->sqljdbc_4.2-->enu。在这里,您将看到文件sqljdbc42.jar。将该文件复制到项目工作区。我将其复制到名为'lib'的目录中。

            repositories {
                flatDir name: 'localRepository', dirs: 'lib'
            }
            configurations {
                driver
            }
            dependencies {
                driver group: 'sql', name: 'sqljdbc42', version:''
            }


            URLClassLoader loader = GroovyObject.class.classLoader
            configurations.driver.each { File file ->
                loader.addURL(file.toURL())
            }

            task connectToCoreDb << {
                def props = [user: 'sa', password: 'shock', allowMultiQueries: 'true'] as Properties
                def connectionUrl = "jdbc:sqlserver://cpt-op-01-db1:1433;databaseName=buds"
                def driver = 'com.microsoft.sqlserver.jdbc.SQLServerDriver'
                def sql = Sql.newInstance(connectionUrl, props, driver)
                sql.eachRow('SELECT name, alias, expiry_date FROM [buds].[dbo].[obj_keystore] ) { row ->
                    println "$row.name $row.alias $row.expiry_date"
                }
                logger.info "Closing connection..."
                sql.close()
            }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接