大型多项目Gradle构建中的依赖关系解析

i7uaboj4  于 2023-05-18  发布在  其他
关注(0)|答案(1)|浏览(203)

我有一个大型的多项目构建,它有一个单独的主文件夹,其中包含一个buildSrc目录,该目录构建了一个定义我们的打包系统的gradle插件。我设想的任务之一是在构建单个项目期间使用sqlite数据库作为数据源。因此,在buildSrc/build.gradle中,我定义了一个包含sqlite jar的存储库,并将dependencies块中的jar依赖项定义为


implementation 'org.sqlite:sqlite-jdbc:3.25.2'

这允许buildSrc中的单元测试成功完成,证明jar已成功下载和使用。我在buildSrc中定义了一个gradle插件,它添加了两个任务,一个是应用在项目中找到的sql文件(通过命令行),另一个是使用

sqlite = Sql.newInstance("jdbc:sqlite:"+dbLocation.absolutePath, "org.sqlite.JDBC")
sqlite.rows(query).each { row ->
  sb.append(row.toString() + "\n") 
}

问题是第二个任务失败了,但出现了异常



Caused by: java.sql.SQLException: No suitable driver found for jdbc:sqlitejdbc:sqlite:/var/folders/vh/_gy4rj65695108sd5fpcqfd00000gn/T/sqlite1762555617470507686.db

如您所见,我使用临时文件的绝对路径定义连接字符串

我尝试过的事情:

在上述错误发生后,我立即可以看到该文件存在

$ ls /var/folders/vh/_gy4rj65695108sd5fpcqfd00000gn/T/sqlite1762555617470507686.db
/var/folders/vh/_gy4rj65695108sd5fpcqfd00000gn/T/sqlite1762555617470507686.db

我提到这一点是因为它是要确保的事情之一,以确保文件没有因为某种原因而被删除。

我还运行了一个依赖项gradle命令,以查看从子项目目录中解析或未解析的jar列表;

$ ../../master/gradlew dependencies --configuration implementation --configure-on-demand
    …
    implementation - Implementation only dependencies for source set 'main'. (n)
+--- org.sqlite:sqlite-jdbc:3.25.2 (n)
\--- project rpm-base (n)

(n) - Not resolved (configuration is not meant to be resolved)
    


有趣的是,我看到它被解析为其他配置,事实上,除了实现之外的所有其他配置都被解析而没有(n)


runtimeClasspath - Runtime classpath of source set 'main'.
+--- org.sqlite:sqlite-jdbc:3.25.2

我相信我的问题与依赖命令输出中的(n)有关,任何帮助都很感激。

我已经通过google输出,stackoverflow和chatgpt获得了建议,到目前为止没有任何工作。
感谢您的考虑和宝贵的时间。

o8x7eapl

o8x7eapl1#

我无法使用Java驱动程序解决这个问题,而是选择使用命令行进行所有数据库查询。

String runCommand(String si, String cmd){
    def sout = new StringBuilder()
    def serr = new StringBuilder()
    
    println si + "Running $cmd"
    def procBuilder = new ProcessBuilder()
    procBuilder.environment()['SHELL'] = '/bin/bash'
    procBuilder.environment()['GRADLE_EXIT_CONSOLE'] = 'true'
    procBuilder.command('/bin/bash' , "-c", "$cmd")
    def proc = procBuilder.start()
    proc.consumeProcessOutput(sout, serr)
    proc.waitForOrKill(30000)
    if (serr.length() > 0){
        throw new GradleException(serr.toString())
    }
    return sout
}
String cmd = 'sqlite3 '+dbLocation+' ".mode json" "'+query+'" ".exit"'

相关问题