0

我有一些通用的 jdbc 相关代码,我想将它们单独打包到一个可运行的 jar 中,其中已包含所需的 jdbc 库,因此每种数据库类型都有一个单独的可运行 jar。源将保持不变,但打包的 jdbc jar 会有所不同。

例如 jdbc-app-postgres.jar 将只包含 postgres jdbc jar,而 jdbc-app-mysql.jar 将包含 mysql jdbc jar。

是否可以使用 gradle 处理任务或其他任何事情?

似乎应该可以使用自定义 shadowJar 任务和自定义配置,但据我所知,自定义 shadow jar 任务无法正确使用包含的完整依赖项(例如:https ://github.com/约翰伦格尔曼/影子/问题/448

理想情况下,解决方案看起来像,但任何对我有用的东西

configurations {
    mysql.extendsFrom implementation
}
....

task buildMysql(type: ShadowJar) {
    archiveName = "jdbc-mysql.${extension}"
    from sourceSets.main.output
    configurations = [configurations.mysql]
}

4

1 回答 1

0

实际上,我似乎找到了一种可行的方法

首先,创建您的自定义配置和依赖项,例如:

configurations {
    mysql.extendsFrom runtimeClasspath
    // etc ...

    compileClasspath.extendsFrom(mysql, ...)
}

dependencies {
  implementation "com.example:example:1.0.0"
  mysql "mysql:mysql-connector-java:8.0.16"

}

然后是您的自定义构建任务

task buildMysql(type: com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar) {
    archiveName = "jdbc-mysql.${extension}"
    manifest {
        attributes('Main-Class': 'com.example.App')
    }
    exclude('META-INF/INDEX.LIST', 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA', 'module-info.class')

    configurations = [project.configurations.mysql]
    from project.convention.getPlugin(JavaPluginConvention).sourceSets.main.output
}
于 2021-06-01T20:05:32.907 回答