10

Gradleを介してEclipse Androidプロジェクトに依存関係を自動的に追加する際に問題があります。私はgradleの経験が少ししかありません。これまで、gradle を使用して 2 つの Java プロジェクトをビルドしました。1 つの jar と実行可能 jar。これは問題なく動作します。Eclipse プラグインを使用して Eclipse プロジェクトを生成し、依存関係をビルド パスに追加しました。新しい依存関係をgradleスクリプトに追加し、gradle eclipseでgradleを開始し、プロジェクトを更新し、依存関係がビルドパスに存在するので、それらを使用できます。ここがそのスクリプトの重要な部分です。

apply plugin: 'java'
apply plugin: 'eclipse'
repositories {
   mavenCentral()
}

dependencies {
   compile 'commons-io:commons-io:2.4'
}

というわけで、androidプラグインと組み合わせてみました。これが私のホールグラドルスクリプトです。

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.4'
    }
}

apply plugin: 'android'
apply plugin: 'eclipse'

repositories {
mavenCentral()
}

dependencies {
compile 'org.apache.commons:commons-lang3:3.1'
}

android {
    compileSdkVersion 17
    buildToolsVersion "17"

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 17
    }
    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }

        instrumentTest.setRoot('tests')
    }
}

gradle eclipse を使用しても何も起こりません。次に、Java プラグインが依存関係をビルド パスに追加することがわかりました。だから私は追加しました

apply plugin: 'java'

それに、JavaプラグインがAndroidプラグインと互換性がないというエラーが発生しました。次に、jar ファイルをプロジェクトの lib フォルダーに自動的にコピーするソリューションを見つけました。

def libDir = file('libs')

task copyLibs(type: Copy) {

    doFirst {
        libDir.mkdirs()
    }
    from configurations.runtime
    into libDir
}

ただし、このタスクには、configuration.runtime 用の Java プラグインも必要です。apk ファイルを作成するには Android プラグインが必要なので、Android プラグインを削除することは解決策ではありません。Androidプラグインと互換性のあるEclipseプロジェクトのビルドパスまたはlibフォルダーに依存関係を追加できるかどうか、誰か考えがありますか?

編集: 私のアイデアの 1 つは、java-plugin を eclipse-plugin に配置して、Eclipse プラグインが適用されるときにのみ適用されるようにすることでした。このようなもの:

apply plugin: 'eclipse'

eclipse{
    apply plugin: 'java'
}

しかし、Java と Android のプラグインに互換性がないというエラーが表示されます。gradleが間違っていることを理解しているかもしれませんが、通常、AndroidプラグインではなくEclipseプラグインを起動するときにのみJavaプラグインを適用する必要があります。私のgradleの理解と経験は、この方法でこれを解決したり、なぜそれが不可能なのかを理解するのに十分ではありません。

4

5 に答える 5

12

私のソリューションは、Android でのみ使用される libs ディレクトリに依存関係をコピーするという点で、Rafael のソリューションに基づいています。ただし、参照されている AAR を Eclipse で使用するために完全に分解するために、さらに進んでいきます。

Gradle ビルド ファイル

Android プロジェクトの build.gradle の末尾に次を追加します。

task copyJarDependencies(type: Copy) {
    description = 'Used for Eclipse. Copies all dependencies to the libs directory. If there are any AAR files it will extract the classes.jar and rename it the same as the AAR file but with a .jar on the end.'
    libDir = new File(project.projectDir, '/libs')
    println libDir
    println 'Adding dependencies from compile configuration'
    configurations.compile.filter {it.name.endsWith 'jar'}.each { File file -> moveJarIntoLibs(file)}
    println 'Adding dependencies from releaseCompile configuration'
    configurations.releaseCompile.filter {it.name.endsWith 'jar'}.each { File file -> moveJarIntoLibs(file)}
    println 'Adding dependencies from debugCompile configuration'
    configurations.debugCompile.filter {it.name.endsWith 'jar'}.each { File file -> moveJarIntoLibs(file)}
    println 'Adding dependencies from instrumentTestCompile configuration'
    configurations.instrumentTestCompile.filter {it.name.endsWith 'jar'}.each { File file -> moveJarIntoLibs(file)}
    println 'Extracting dependencies from compile configuration'
    configurations.compile.filter {it.name.endsWith 'aar'}.each { File file -> moveAndRenameAar(file) }
    println 'Extracting dependencies from releaseCompile configuration'
    configurations.releaseCompile.filter {it.name.endsWith 'aar'}.each { File file -> moveAndRenameAar(file) }
    println 'Extracting dependencies from debugCompile configuration'
    configurations.debugCompile.filter {it.name.endsWith 'aar'}.each { File file -> moveAndRenameAar(file) }
    println 'Extracting AAR dependencies from instrumentTestCompile configuration'
    configurations.instrumentTestCompile.filter {it.name.endsWith 'aar'}.each { File file -> moveAndRenameAar(file) }
}

void moveJarIntoLibs(File file){
    println 'Added jar ' + file
        copy{
            from file
            into 'libs'
        }
}

void moveAndRenameAar(File file){
    println 'Added aar ' + file
    def baseFilename = file.name.lastIndexOf('.').with {it != -1 ? file.name[0..<it] : file.name}

    // directory excluding the classes.jar
    copy{
        from zipTree(file)
        exclude 'classes.jar'
        into 'libs/'+baseFilename
    }

    // Copies the classes.jar into the libs directory of the expoded AAR.
    // In Eclipse you can then import this exploded ar as an Android project
    // and then reference not only the classes but also the android resources :D 
    copy{
        from zipTree(file)
        include 'classes.jar'
        into 'libs/' + baseFilename +'/libs'
        rename { String fileName ->
            fileName.replace('classes.jar', baseFilename + '.jar')
        }
    }
}

Gradle を使用したビルド

走る :

"gradle clean build"

すべての依存関係と展開された AAR が libs ディレクトリにあります。Eclipse に必要なのはこれだけです。

Eclipse でのインポート

ここからが本当のメリットの始まりです。上記の gradle ステップから libs ディレクトリを生成すると、そこにもフォルダーがあることに気付くでしょう。これらの新しいフォルダーは、build.gradle ファイルから展開された AAR 依存関係です。

優れた点は、既存の Android プロジェクトを Eclipse にインポートすると、展開された AAR フォルダーもインポート可能なプロジェクトとして検出されることです。

1.プロジェクトのlibsディレクトリの下にあるこれらのフォルダーをインポートします。 「ビルド」フォルダーはインポートしないでください。これらはGradleによって生成されます

2.追加したすべての AAR プロジェクトでProject -> Cleanを実行してください。ワークスペースで、AAR 展開された各プロジェクトの project.properties に次のものが含まれていることを確認します。

target=android-<YOUR INSTALLED SKD VERSION GOES HERE>
android.library=true

3.これで、メインの Android プロジェクトで、ADT を使用してライブラリ参照を追加するか、project.properties ファイルを編集して追加することができます。

android.libraries.reference.1=libs/someExplodedAAR/

4.メインの Android プロジェクトを右クリックし、Run as -> Android Application を選択します。

しかし、これはどういう意味ですか?

  1. つまり、Eclipse でクラスとリソースの両方を参照するために、Android AAR Gradle 依存関係のソース コードは必要ありません。

  2. 上記の gradle ビルド スクリプトは、AAR ファイルを取得し、Eclipse で使用できるように準備します。これをワークスペースに追加したら、実際のメインの Android プロジェクトに集中できます。

  3. Eclipse を使用してデバッグおよび開発し、AAR 依存関係が APK に適切にバンドルされている ADT を使用してデプロイできるようになりました。特定のビルドを作成する必要がある場合は、gradle を使用できます。

于 2014-04-20T08:01:16.847 に答える
4

最後に、自分に合った解決策を見つけました。このタスクは、依存関係をプロジェクトの libs フォルダーにコピーします。

task copyDependencies(type: Copy) 
{
    description = 'Copy depencies to libs. Useful for Eclipse'
    libDir = new File(project.projectDir, '/libs')
    println libDir
    println 'Adding dependencies from compile configuration'
    for(file in configurations.compile) 
    {
        println 'Added ' + file
        copy 
        {
            from file
            into libDir
        }
    }
    println 'Adding dependencies from releaseCompile configuration'
    for(file in configurations.releaseCompile)
    {
        println 'Added ' + file
        copy
        {
            from file
            into libDir
        }
    }
    println 'Adding dependencies from debugCompile configuration'
    for(file in configurations.debugCompile)
    {
        println 'Added ' + file
        copy
        {
            from file
            into libDir
        }
    }

    println 'Adding dependencies from instrumentTestCompile configuration'
    for(file in configurations.instrumentTestCompile)
    {
        println 'Added ' + file
        copy
        {
            from file
            into libDir
        }
    }
}
于 2013-05-26T18:46:19.083 に答える
0

JavaJedi のソリューションのおかげで、Gradle の入出力注釈を使用して別のソリューションを作成しました。これは同じ原則に基づいていますが、より一般的に使用され (たとえば、タイプCopyJarsまたはの新しいタスクを簡単に定義できますExtractAars)、ファイルのコピーが必要かどうかを Gradle が判断できるようにします。

于 2014-09-11T00:53:53.537 に答える
0

これは、@JavaJedi および @gubaer からの以前のすべてのソリューションに基づく私のソリューションです。

ステップ1

copyAarsbuild.gradle にタスクを追加します。Android Studio や他の Gradle プラグインやタスクとの競合を避けるために、AAR の依存関係を「libs」ではなく、特別なフォルダー「deps」に解凍してコピーします。その後、展開されたすべての AAR を Android ライブラリ プロジェクトとして手動でインポートし、依存関係として Eclipse のメイン プロジェクトに追加する必要があります。これは、@JavaJedi の修正されたソリューションです。

task copyAars << {
    configurations.compile.filter { it.name.endsWith 'aar' }.each { File file -> copyAndRenameAar(file) }
}

void copyAndRenameAar(File file) {
    println 'Added aar ' + file
    def baseFilename = file.name.lastIndexOf('.').with { it != -1 ? file.name[0..<it] : file.name }

    // directory excluding the classes.jar
    copy {
        from zipTree(file)
        exclude 'classes.jar'
        into "deps/aars/exploded/" + baseFilename
    }

    // Copies the classes.jar into the libs directory of the expoded AAR.
    // In Eclipse you can then import this exploded aar as an Android project
    // and then reference not only the classes but also the android resources
    copy {
        from zipTree(file)
        include 'classes.jar'
        into "deps/aars/exploded/" + baseFilename + "/libs"
        rename { String fileName -> fileName.replace('classes.jar', baseFilename + '.jar') }
    }
}

ステップ2

eclipseClasspathbuild.gradle にタスクを追加します。JAR 依存関係は別の方法で追加されます。それらはフィルタリングされ、.classpath ファイルに直接追加されるため、Eclipse メイン プロジェクトで自動的に使用可能になります。これは @gubaer からの修正されたソリューションです。AAR を除き、「コンパイル」構成からのみ、JAR のみが含まれますが、構成を簡単に追加できます。

task eclipseClasspath << {
    def classpath = new XmlParser().parse(file(".classpath"))
    def libs = classpath.grep { it.'@gradle-dependency' == "true" }
    libs.each { classpath.remove(it) }

    configurations.compile.filter { it.name.endsWith 'jar' }
    .collect { file ->
        new Node(null, "classpathentry", [
            "path": file.toString(),
            "kind": "lib",
            "exported": "true",
            "gradle-dependency": "true"
        ])
    }
    .each { classpath.append(it) }

    file(".classpath").withWriter { writer ->
        writer << new groovy.xml.StreamingMarkupBuilder().bind { mkp.xmlDeclaration() }
        def printer = new XmlNodePrinter(new PrintWriter(writer))
        printer.print(classpath)
    }
}

ステップ 3

http://marketplace.eclipse.org/content/java-source-attacherプラグインを Eclipse にインストールします。その後、各 JAR を右クリックして、[Attach Java Source] を選択できます。Gradle の依存関係の場合、これは私の経験では 99% の確率で機能します。

于 2015-02-09T12:53:18.477 に答える