webentwicklung-frage-antwort-db.com.de

Wie definiere ich in Gradle einen * only * -Klassenpfad zur Kompilierungszeit?

Kann mir bitte jemand ein einfaches build.gradle-Beispiel geben, wie ich Klassen nur zur Kompilierungszeit angeben kann, die nicht in der Laufzeitbereitstellung (war) enthalten sind.

Gradle scheint dies falsch verstanden zu haben, da 'Laufzeit' von 'Kompilieren' erbt. Ich kann mir keine Situation vorstellen, in der ich zur Laufzeit Klassen haben möchte, die ich zur Kompilierungszeit nicht haben möchte. Es gibt jedoch viele Situationen, in denen ich Klassen zum Generieren von Code zur Kompilierungszeit benötige, die ich zur Laufzeit nicht bereitstellen möchte!

Ich habe die aufgeblähte gradle-Dokumentation durchgesehen, kann aber keine klaren Anweisungen oder Beispiele finden. Ich vermute, dass dies erreicht werden kann, indem eine 'Konfiguration' definiert und als Klassenpfad des CompileJava-Plugins festgelegt wird. In der Dokumentation wird jedoch nicht erläutert, wie dies erreicht werden kann.

62
Alex Worden

Es wurde viel über dieses Thema diskutiert, hauptsächlich hier , aber keine klare Schlussfolgerung.

Sie sind auf dem richtigen Weg: Derzeit ist es die beste Lösung, Ihre eigene provided -Konfiguration zu deklarieren, die nur Kompilierungsabhängigkeiten enthält und Ihrem Kompilierungsklassenpfad hinzufügt:

configurations{
  provided
}

dependencies{
  //Add libraries like lombok, findbugs etc
  provided '...'
}

//Include provided for compilation
sourceSets.main.compileClasspath += [configurations.provided]

// optional: if using 'idea' plugin
idea {
  module{
    scopes.PROVIDED.plus += [configurations.provided]
  }
}

// optional: if using 'Eclipse' plugin
Eclipse {
  classpath {
    plusConfigurations += [configurations.provided]
  }
}

Normalerweise funktioniert das gut.

56
rodion

Wenn Sie das war Plugin verwenden, sollte providedCompile den Trick machen. Wenn Sie jedoch Abhängigkeiten von der Aufnahme in ein Jar ausschließen müssen, müssen Sie die Task jar erweitern. Im Folgenden finden Sie ein Beispiel für die Erstellung eines "Fat Jars" oder "Uber Jars" (eines einzelnen Jars, das alle Klassen seiner Abhängigkeiten enthält), mit Ausnahme der mit provided gekennzeichneten Abhängigkeiten:

configurations {
    provided
    compile.extendsFrom provided
}

dependencies {
    provided "group.artifact:version"
    compile "group.artifact:version"
}

jar {
    dependsOn configurations.runtime
    from {
        (configurations.runtime - configurations.provided).collect {
            it.isDirectory() ? it : zipTree(it)
        }
    } 
}

Gutschrift: http://kennethjorgensen.com/blog/2014/fat-jars-with-excluded-dependencies-in-gradle/

Update:

Ab Gradle 2.12 wird das Problem, nur Kompilierungsabhängigkeiten zu definieren, durch die neue Konfiguration "copmpileOnly" auf einfache und natürliche Weise gelöst:

dependencies {
    compileOnly 'javax.servlet:servlet-api:2.5'
}
12
Doron Gold

Ich habe es für mein Projektsetup herausgefunden. Ich verwende Android Studio, das mit dem Gradle-Plugin 0.9. + Mit Gradle 1.11 ausgeführt wird. Das Hauptprojekt verwendet Amazon-Anzeigen und Amazon-In-App-Käufe. Es hängt von einem Bibliotheksprojekt ab, das Amazon Device Messaging (ADM) verwendet.

Mein Hauptproblem war mit dem ADM, wo ich die "RuntimeException: Stub!" Error.

1.) Bibliotheksprojekt: Die von Lukas vorgeschlagene "zur Verfügung gestellte Konfiguration" funktioniert nicht, wie von ihm angegeben. Daher habe ich den Richards-Ansatz verwendet, der jedoch nicht sofort funktioniert hat. Ich musste es ein wenig ändern, da ich die lib im ext_libs-Ordner der aar-Datei nicht finden konnte. Gradle scheint alle Bibliotheken in den Ordner libs in der endgültigen aar-Datei zu packen.

Android.libraryVariants.all { variant ->
variant.packageLibrary.exclude( 'libs/Amazon-device-messaging-1.0.1.jar' )
}

2.) Anwendungsprojekt: Hier hat der Ansatz mit der "vorgesehenen Konfiguration" funktioniert.

configurations{
    provided
} 
dependencies {
    compile 'fr.avianey:facebook-Android-api:[email protected]'
    compile files('ext_libs/Amazon-ads-5.3.22.jar')
    compile files('ext_libs/in-app-purchasing-1.0.3.jar' )
    provided files('ext_libs/Amazon-device-messaging-1.0.1.jar')
}

Android.applicationVariants.all {
    variant -> variant.javaCompile.classpath += configurations.provided
}
9
Mike T

Es ist durchaus üblich, Laufzeitabhängigkeiten zu haben, bei denen es sich nicht um Kompilierzeitabhängigkeiten handelt. Der umgekehrte Fall ist ein ziemlich spezieller Fall und erfordert daher einige Konfigurationsschritte in Gradle. Ich schlage vor, im Gradle-Forum nach provided zu suchen.

Es hört sich so an, als würden Sie wirklich Abhängigkeiten für Ihren Build deklarieren, nicht für den Kompilierungsklassenpfad. Wie dies getan wird, hängt davon ab, wie die gewünschte Funktionalität aufgerufen wird (Ant-Task, Gradle-Task/Plug-In, Ad-hoc-Verwendung aus dem Build-Skript). Wenn Sie detailliertere Informationen zu dem bereitstellen, was Sie versuchen, kann ich eine spezifischere Antwort geben.

Hier einige Links zu relevanten Informationen im Gradle-Benutzerhandbuch:

6

In Gradle 2.12 wurde eine compileOnly Konfiguration eingeführt. Ein Blog-Beitrag, in dem diese Funktionen vorgestellt werden, ist hier zu finden:

Gradle neueste Funktion: Nur Abhängigkeiten kompilieren

Bitte beachten Sie eine wichtige Nebenwirkung:

Durch das Hinzufügen der Konfiguration "compileOnly" wird in der Konfiguration "compile" nicht mehr ein vollständiges Bild aller Abhängigkeiten der Kompilierungszeit angezeigt. Wenn Sie in Build-Skripten oder benutzerdefinierten Plug-ins einen Kompilierungsklassenpfad benötigen, sollten Sie stattdessen die compileClasspath -Eigenschaft des entsprechenden Quellensets verwenden.

6
xsveda

Wenn Sie das WAR-Plugin verwenden, können Sie providedCompile wie in diesem Beispiel verwenden

dependencies {
    compile module(":compile:1.0") {
        dependency ":[email protected]"
        dependency ":providedCompile-transitive:[email protected]"
    }
    providedCompile "javax.servlet:servlet-api:2.5"
    providedCompile module(":providedCompile:1.0") {
        dependency ":providedCompile-transitive:[email protected]"
    }
    runtime ":runtime:1.0"
    providedRuntime ":providedRuntime:[email protected]"
    testCompile "junit:junit:4.11"
    moreLibs ":otherLib:1.0"
}
6
Adrian H.

Es stellt sich heraus, dass sie eine "bereitgestellte" Konfiguration im gradle Android Plugin 0.8.0 hinzugefügt haben, aber es funktioniert nicht ganz. Es fügt die bereitgestellten Bibliotheken automatisch zum Kompilierungspfad hinzu, fügt sie aber auch in das finale aar/apk ein.

Was für mich funktionierte, war die Lösung von @ lukas-hanaceck, aber durch Ändern des Namens von "zur Verfügung gestellt" in einen anderen benutzerdefinierten Namen. In meinem Fall ist dies ein Bibliotheksprojekt, das eine Abhängigkeit für mein letztes Anwendungsprojekt Android darstellt. Hier ist eine Zusammenfassung dessen, was für mich funktioniert hat.

configurations {
   providedlibs
}

dependencies {
   providedlibs files('provided/library.jar')
}

libraryVariants.all {
    variant -> variant.javaCompile.classpath += configurations.providedlibs
}

Es kompiliert perfekt und die mitgelieferte/library.jar ist nicht in der finalen apk enthalten. Das einzige Problem, das ich habe, ist die Benachrichtigung von Android studio über die Existenz von library.jar. Das Ideen-Plugin scheint für Android Studio nicht zu funktionieren. Ich vermute, dass sie ein anderes benutzerdefiniertes Plugin für die Synchronisierung von Gradle mit Studio haben.

3
aarkay

In Android Studio 1.0 gehen Sie folgendermaßen vor:

Android.libraryVariants.all { variant ->
    variant.outputs.each { output ->
        output.packageLibrary.exclude('libs/someLib.jar')
    }
}
2
Thomas Hofmann

Ich habe keine Lösung für Android Studio gefunden, aber dies habe ich versucht:

In Android Studio musste ich auf Version 0.5. + Updaten

in gradle/gradle-wrapper.properties ersetzen

distributionUrl=http\://services.gradle.org/distributions/gradle-1.9-rc-3-bin.Zip

durch

distributionUrl=http\://services.gradle.org/distributions/gradle-1.11-all.Zip

in allen meinen build.gradle ersetzen

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

durch

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

und in der bibliothek wollte ich zur verfügung stellen

configurations {
    provided
}

//put applicationVariants in case it is apply plugin: 'Android' and not apply plugin: 'Android-library'
Android.libraryVariants.all {
    variant -> variant.javaCompile.classpath += configurations.provided
}

dependencies {
    provided files('ext_libs/Amazon-device-messaging-1.0.1.jar')
}

und am Ende funktioniert es anscheinend nicht für jar, aber nicht für aar oder apk, wie hier angegeben https://groups.google.com/forum/#!topic/adt-dev/WIjtHjgoGwA

2
Lukas Hanacek

Wir brauchen nicht "zur Verfügung gestellt", versuchen Sie dies hinzuzufügen:

Android.libraryVariants.all { variant ->
    variant.packageLibrary.exclude( 'ext_libs/Amazon-device-messaging-1.0.1.jar' )
}

Genießen!

0
Richard Li

Das OP suchte anscheinend nicht nach einer Antwort Android=), aber einige Antworten gelten nur für Android. Ich schlage vor, dass Sie sich diese Seite ansehen: http://tools.Android. com/tech-docs/new-build-system

Version 0.9.0 führte einen bereitgestellten Bereich ein. Also einfach benutzen

dependencies {
    provided "groupId:artifcatId:version"
}
0
Snicolas