【问题标题】:How to add external jar files to gradle build script如何将外部 jar 文件添加到 gradle 构建脚本
【发布时间】:2011-06-13 11:33:44
【问题描述】:

现在我使用 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 文件?谢谢。

【问题讨论】:

    标签: gradle


    【解决方案1】:

    这对我有用。为什么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]
        }
    }
    

    【讨论】:

    • 谢谢!您的回答为我解决了类似的问题,并提示我写信 this Q&A
    【解决方案2】:

    我很幸运遇到了这样的事情:

    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'
        }
    }
    

    【讨论】:

    • 嗨艾伦,谢谢你的回答。我已经尝试了您的两个建议,但都失败了。然后我在 $GRADLE_HOME/lib/ 中创建了一个 mysql-connector-java.jar 的软链接,它可以工作。那么问题可能是什么?或者你能给我一些提示吗?顺便说一句,我的 gradle 版本是 0.9.1 。再次感谢您。
    • 某事如何失败有时比仅仅知道它失败更重要。请更新您的问题以说明具体情况。
    • 这很简单!不知道为什么另一个答案得到了更多的选票?我的背景:尝试为 Oracle 使用 Liquibase 插件
    • 这里的答案无法经过测试 - 它不起作用,因为加载 SQL 驱动程序的类加载器不是正确的“根”类加载器。并且在根目录中链接库的解决方案 - 完成加载到根类加载器的解决方案 - 显然不是独立的(你不能只检查项目并构建它,你必须弄乱你的本地 Gradle 安装,即一个明确的非解决方案)。
    【解决方案3】:

    下面的 sn-p 可以很好地用于连接和查询 Microsoft SQL SERVER 中的数据库。请注意,Microsoft 不会在 MavenCentral() 等任何在线存储库中提供 jar 文件“sqljdbc42.jar”(这是 jdbc 驱动程序)。因此,您需要从 Microsoft 的网站下载此 jar 并保存在项目工作区目录中。 Download '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()
                }
    

    【讨论】:

      猜你喜欢
      • 2020-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-07
      • 2015-02-06
      相关资源
      最近更新 更多