web-dev-qa-db-ja.com

Gradleで依存関係バージョンの変数を定義するにはどうすればよいですか

現在、MavenプロジェクトをGradleに移行しようとしています

私のMavenバージョンでは、parent pomに依存バージョンがすべてこのようにリストされています:

<properties>
    <spring.version>4.2.3.RELEASE</spring.version>
    <spring.boot.version>1.3.3.RELEASE</spring.boot.version>
    ...
</properties>

そして、サブモジュールのいずれかでこのような依存関係を定義できます。

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${spring.version}</version>
</dependency>

いくつかのモジュールはこのような依存関係バージョンを共有しているため、Gradleで同じことをしようとしています。Springをアップグレードしたり、同様の操作をしたい場合は、1つ以上の場所を変更したくありません。

私が手に入れた最も近いものはこれです:

dependencies {
    ext.springVersion = '4.2.3.RELEASE'
    compile "org.springframework:spring-jdbc:$springVersion"
}

それでも、それはまだ機能しません。 Gradleでこれを達成するための推奨される方法は何ですか?それともGradleはこれを異なる方法で扱いますか?おそらく、私の心はまだ別の解決策を見るにはMavenに行き過ぎです。

Gradleでの試行は、まだexactlyではないことに注意してください。依存関係を使用するファイルに直接ではなく、separateファイルで定義できるようにしたいと思います。

27
Rodrigo Sasaki

依存関係のバージョンを指定した方法は正しく、機能するはずです。 IntelliJ Ideaにはgradleビルドスクリプト内の変数に関するいくつかの問題がありますので、それに依存する必要はなく、ビルドを実行してチェックアウトするだけで、依存関係がダウンロードされ、プロジェクトが正しくビルドされているかどうかを確認してください。

プロジェクトの依存関係を別のファイルに保存する場合、最も一般的な方法は、すべてのサブプロジェクトのsubprojectsクロージャーまたはallprojectsを介してルートbuild.scriptで定義することです。ルートを含むすべてのプロジェクトの依存関係を指定したい。これは次のようになります。

subprojects{
    dependencies{
        compile ...
    }
}

この方法で、ルートビルドスクリプト内のサブプロジェクトの一般的な構成を提供できます。それについて読む ユーザーガイド

または、ルートビルドスクリプトで変数を宣言し、必要なすべての依存関係仕様を持つマップまたは単一の依存関係リストを持つ配列として初期化し、必要に応じてサブプロジェクト内でこの変数を使用できます。ルートのこのような何か:

ext.commomLibs = [
  'testlibs' : 'junit:junit:4.8'
]

マップの値をlib仕様の配列として定義して、このすべての依存関係を指すようにすることができます。次に、サブプロジェクトで次のように使用できます。

dependencies{
    testCompile commomLibs.testlibs
}

もう1つの代替方法は、依存関係を持つ別個のビルドスクリプトを使用し、必要なビルトスクリプトに適用することです。

apply from: 'dependencies.script'

次に、依存関係を依存関係スクリプトに配置し、この依存関係が必要な場合や、一般的なロジックである場合がある他のビルドスクリプトに適用することができます。

8
Stanislav

以下のbuild.gradleファイルの設定はgradle version 4.5で機能し、今後の参考のためにここに投稿しました-

ext {
    springVersion = '5.0.3.RELEASE'
}

dependencies {
    compile  "org.springframework:spring-context:$springVersion"
}
18
Vikas Sachdeva

二重引用符を使用してください。

buildscript {
    ext {
        springBootVersion = '2.0.4.RELEASE'
        hazelCastVersion = '3.10.4'
    }

    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")

    }
}

dependencies {
    compile('org.springframework.cloud:spring-cloud-starter-config')
    compile "com.hazelcast:hazelcast-spring:${hazelCastVersion}"
    compile group: 'com.hazelcast', name: 'hazelcast', version: "${hazelCastVersion}" }
5
Kumar Abhishek

Vikas Sachdevaの答えに追加:

私のサブプロジェクトでは、この方法ではうまくいきませんでした。 Gradleはエラー「Corg not the org.springframework:spring-context:$ springVersion」をスローします。最後に、プラス記号を追加して問題を解決しました。

例:

root gradle.properties:

springVersion = '5.0.3.RELEASE'

root build.gradle

dependencies {
    compile  "org.springframework:spring-context:${springVersion}"
}

サブプロジェクトbuild.gradle

dependencies {
    compile  "org.springframework:spring-context:" + springVersion
}

注:私のgradleバージョンは5.4.1です

または、プラグインを使用して依存バージョンを管理できます。

io.spring.dependency-management

参照: https://docs.spring.io/dependency-management-plugin/docs/current/reference/html/

1
xavierzhao

別の構文シュガーがあります。これは依存関係を記述する「長い」方法だと思います。

マスター「gradle.build」

plugins {
    id 'Java'
}


ext {
    slf4jApiVersion = '1.7.28'
    junitVersion = '4.12'
}

サブモジュール/プロジェクトgradle.build

dependencies {
    testCompile group: 'junit', name: 'junit', version: "${junitVersion}"
    compile group: 'org.slf4j', name: 'slf4j-api', version: "${slf4jApiVersion}"
}

グループ、名前、およびバージョンの分離に注意してください...グループおよび名前の値を囲むSINQLE引用符、およびバージョン値変数を囲むDOUBLE引用符。

0
granadaCoder