首先我是 Gradle 的新手。
我有一个 Java 项目,是用 Gradle 构建的。我使用 Application 插件得到一个 fat jar,它在引擎盖下使用 java 插件。
我希望能够提供一些 JDBC jar 来与不同部署环境中的不同 DBMS(Oracle、Postgres、DB2 等)通信——这样就无需重新编译。
以前,使用 ANT,我们可以手动将 JDBC jar 放到
lib
文件夹中,应用程序将拾取它并使用它而无需编译。
目前,我正在尝试使用 Gradle 实现同样的目标。我尝试了以下方法:
添加依赖项
runtimeOnly fileTree('lib') { include '*.jar' }
:但是每次我在 lib 文件夹中放置一个新的 jar 时都需要编译。
设置
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
}
}
}
我求助于一个“更简单”的解决方案:
build.gradle
中的所有 JDBC jar 卸载到一个文件夹中——我们称之为 jdbcs。-cp
将该文件夹作为类路径的一部分。在 Windows 系统上:
java -cp "my_package.jar;jdbcs\*" my_src_pkg.func
在 Linux 上:
java -cp "my_package.jar:jdbcs\*" my_src_pkg.func
您可以从中央 Maven 获取 Oracle JDBC 驱动程序。检查给出的 instructions 以将 Gradle 与 Oracle JDBC 驱动程序一起使用。