0

必要な jdbc ライブラリが既に含まれている実行可能な jar に個別にパッケージ化したい一般的な jdbc 関連のコードがあるため、データベースの種類ごとに個別の実行可能な jar があります。ソースは同じままですが、パッケージ化された jdbc jar は異なります。

たとえば、jdbc-app-postgres.jar には postgres jdbc jar のみが含まれ、jdbc-app-mysql.jar には mysql jdbc jar が含まれます。

gradle を使用して、タスクなどでこれを行うことは可能ですか?

カスタムのshadowJarタスクとカスタム構成で可能であるように思われますが、私が知る限り、カスタムのシャドウjarタスクは完全な依存関係を含めて正しく動作していません(例: https://github.com/ johnrengelman/shadow/issues/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 に答える