如何从文件夹动态使用 JDBC 外部 jar 而无需在 Gradle 中重新编译

问题描述 投票:0回答:2

首先我是 Gradle 的新手。

我有一个 Java 项目,是用 Gradle 构建的。我使用 Application 插件得到一个 fat jar,它在引擎盖下使用 java 插件。

我希望能够提供一些 JDBC jar 来与不同部署环境中的不同 DBMS(Oracle、Postgres、DB2 等)通信——这样就无需重新编译。

以前,使用 ANT,我们可以手动将 JDBC jar 放到

lib
文件夹中,应用程序将拾取它并使用它而无需编译。

目前,我正在尝试使用 Gradle 实现同样的目标。我尝试了以下方法:

  1. 添加依赖项

    runtimeOnly fileTree('lib') { include '*.jar' }
    :但是每次我在 lib 文件夹中放置一个新的 jar 时都需要编译。

  2. 设置

    runtimeClasspath
    sourceSets

sourceSets {
    main {
        java {
            runtimeClasspath = fileTree('lib') { include '*.jar' }
        }
    }
}

但这并没有改变任何东西。

如何做到这一点?这是我的

build.gradle
的样子:

plugins {
    id 'application' // implicitly applies java and distribution, see https://docs.gradle.org/7.4/userguide/application_plugin.html    
    id 'com.github.johnrengelman.shadow' version '7.1.2' // For fat jars
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.apache.poi:poi:5.2.3'
    implementation 'org.apache.poi:poi-ooxml:5.2.3'

    // :
    // more implementation dependencies...
    // :

    // runtimeOnly fileTree('lib') { include '*.jar' } <- requires compilation

}

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
    
}

application {
    mainClass = 'my_pkg.ProcessAll'
}

shadowJar {
    archiveBaseName.set('MyApp')
    classifier = null
}


sourceSets {
    main {
        java {
            runtimeClasspath = fileTree('lib') { include '*.jar' } // <- doesn't work
        }
    }
}
java gradle jdbc
2个回答
0
投票

我求助于一个“更简单”的解决方案:

  • 部署后,我将 Gradle
    build.gradle
    中的所有 JDBC jar 卸载到一个文件夹中——我们称之为 jdbcs。
  • 我告诉java在运行软件时使用
    -cp
    将该文件夹作为类路径的一部分。

在 Windows 系统上:

java -cp "my_package.jar;jdbcs\*" my_src_pkg.func

在 Linux 上:

java -cp "my_package.jar:jdbcs\*" my_src_pkg.func


-1
投票

您可以从中央 Maven 获取 Oracle JDBC 驱动程序。检查给出的 instructions 以将 Gradle 与 Oracle JDBC 驱动程序一起使用。

© www.soinside.com 2019 - 2024. All rights reserved.