web-dev-qa-db-ja.com

Android Nexusを使用したライブラリ依存関係を持つGradleライブラリ依存関係

プロジェクトを、依存関係をホストするためにGradleと内部SonaTypeNexusを使用するように切り替えています。私のコアプロジェクトはライブラリプロジェクトAに依存しており、ライブラリプロジェクトAはライブラリプロジェクトBに依存しています。

私の問題は、メインプロジェクトにLibAを追加するとすぐに、「モジュールバージョンcom.example:LibA:1.1はライブラリに依存しますが、ライブラリ自体ではありません」というエラーが発生することです。

同じビルドスクリプトでjar依存関係を持つライブラリプロジェクトを追加することに問題はありません。 LOCAL(プロジェクト内)Androidライブラリでこれを成功させている人を見たことがありますが、Mavenリポジトリでこれを行っている人は誰もいません。

これはgradleのバグですか、それともライブラリビルドを誤って構成しましたか?

コアプロジェクトビルド

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.Android.tools.build:gradle:0.6.+'
    }
}
apply plugin: 'Android'

repositories {
    maven {
        url "http://localhost:8081/nexus/content/repositories/releases/"
    }

    maven {
        url "http://localhost:8081/nexus/content/repositories/central/"
    }
}

Android {
    compileSdkVersion 19
    buildToolsVersion "19.0.0"

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 19
    }
}

dependencies {
    compile 'com.Android.support:support-v4:+'
    compile('com.example:LibA:1.+')
}

LibAビルド

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.Android.tools.build:gradle:0.6.+'
    }
}

apply plugin: 'Android-library'

Android {
    compileSdkVersion 19
    buildToolsVersion "19.0.0"

    defaultConfig {
        minSdkVersion 9
        targetSdkVersion 17

        versionCode = "3"
        versionName = "1.2"
    }

    Android {
        sourceSets {
            main {
                manifest.srcFile 'AndroidManifest.xml'
                Java.srcDirs = ['src']
                resources.srcDirs = ['src']
                aild.srcDirs = ['src']
                renderscript.srcDirs = ['src']
                res.srcDirs = ['res']
                assets.srcDirs = ['assets']
            }

        }
    }

    repositories {
        mavenCentral()
    }

    dependencies {
        compile ('com.example:LibB:1.+')
    } ...

LibBビルド

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.Android.tools.build:gradle:0.6.+'
    }
}

apply plugin: 'Android-library'

Android {
    compileSdkVersion 19
    buildToolsVersion "19.0.0"

    defaultConfig {
        minSdkVersion 9
        targetSdkVersion 17

        versionCode = "1"
        versionName = "1.0"
    }

    Android {
        sourceSets {
            main {
                manifest.srcFile 'AndroidManifest.xml'
                Java.srcDirs = ['src']
                resources.srcDirs = ['src']
                aild.srcDirs = ['src']
                renderscript.srcDirs = ['src']
                res.srcDirs = ['res']
                assets.srcDirs = ['assets']
            }

        }
    }

    repositories {
        mavenCentral()
    }

    dependencies {
    } ...

編集:エラーの-info出力を追加します。

* What went wrong:
A problem occurred configuring project ':GradleTest'.
> Failed to notify project evaluation listener.
   > Module version com.example:LibA:1.+ depends on libraries but is not a library itself

編集2:LibA用のローカルMavenアップロードスクリプトを追加する

apply plugin: 'maven'
apply plugin: 'signing'

group = "com.example"
version = defaultConfig.versionName

configurations {
    archives {
        extendsFrom configurations.default
    }
}

signing {
    required { has("release") && gradle.taskGraph.hasTask("uploadArchives") }
    sign configurations.archives
}


uploadArchives {
    configuration = configurations.archives
    repositories.mavenDeployer {
        beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }
        repository(url: sonatypeRepo) {
            authentication(userName: sonatypeUsername,
                    password: sonatypePassword)
        }

        pom.project {
            name 'com-example'
            packaging 'aar'
            description 'none'
            url 'https://internal github link'

            scm {
                url 'scm:git@https://internal github link'
                connection 'git@https://internal github link'
                developerConnection 'git@https://internal github link'
            }

            licenses {
                license {
                    name 'example'
                    url 'example'
                    distribution 'example'
                }
            }

            developers {
                developer {
                    id 'example'
                    name 'example'
                    email 'example'
                }
            }

            groupId "com.example"
            artifactId rootProject.name //LibA
            version defaultConfig.versionName
        }
    }
}
28
sgarman

この問題は、Gradleの新しいバージョンとAndroid Gradleプラグインで解消されました。初期リリースのバグのようです。

0
sgarman

おそらく問題は、ライブラリプロジェクトのリポジトリとしてmavenCentralを使用していることです

repositories {
    mavenCentral()
}

実際の依存関係が存在するネクサスリポジトリではありません

repositories {
    maven {
        url "http://localhost:8081/nexus/content/repositories/releases/"
}

    maven {
        url "http://localhost:8081/nexus/content/repositories/central/"
    }
}
2
Audrius K

LibAを含めるための依存関係の行が間違っています。ライブラリプロジェクトを含めるには、次を使用します。

compile project(':LibA')

ライブラリのディレクトリがプロジェクトディレクトリのルートにない場合は、コロンで区切られたパスを指定する必要があります。たとえば、ディレクトリ構造が次の場合です。

 projectFolder 
 | 
 +-coreProject 
 | 
 +-ライブラリ
 | 
 +- LibA 
 | 
 +-LibB 

依存関係は次のようになります。

compile project(':libraries:LibA')

これは、settings.gradleファイルで使用する表記法と同じです。

2
Scott Barta

Jarとaarの両方のライブラリアーティファクトをアップロードした場合は、これを試してください。

compile 'com.example:LibA:1.1.1@aar'
2
KeithYokoma

ライブラリ間に循環依存を誤って導入した後、同様のエラーメッセージが表示されました。

庶民院のbuild.gradle-utils

dependencies {
    ...
    instrumentTestCompile project(':test-utils')
}

test-utilsのbuild.gradle

dependencies {
    ...
    compile project(':commons-utils')
}

これを修正すると問題が解決しました。エラーメッセージはあまり明確ではありません。

1
ben75

確かにわからない、ほんの2、3の考え:

  1. gradle assembleの代わりにgradle buildを実行してみましたか?エラーはテストタスクに関連しているので、これはテストをスキップするはずです。
  2. ばかげているかもしれませんが、最初のライブラリから2番目のライブラリへの依存を削除し、最初のライブラリの前にメインのビルドファイルリストに配置してみてください。何か関係のある記憶があります。このようにして、2番目のライブラリをクラスパスに追加して、最初のライブラリをコンパイルできるようにすることができます。
  3. 手作業で.aarファイルを作成し、それを手作業でリポジトリにアップロードしてみてください。
  4. これはハックですが、うまくいくかもしれません。この:GradleTestモジュールを除外することを検討しましたか? セクション50.4.7 を参照してください
1
Dmide

最初のbuild.gradleファイルのサブモジュールとして使用したくない場合は、ローカルのMavenリポジトリを追加できます。

mavenLocal()

//repositories
repositories {
    mavenCentral()
    mavenLocal()
}

ただし、最初にlibAでinstallを実行する必要があります。

私の仕事では、build.gradleファイルで依存プロジェクトを宣言するときに、compile project(':google-play-services_lib')の代わりにcompile ('google-play-services_lib')を使用しました。これがGradleでこれを行う正しい方法だと思います: http://www.gradle.org/docs/current/userguide/dependency_management.html#sub:project_dependencies

1
omermuhammed