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.
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.
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'
}
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
}
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:
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.
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"
}
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.
In Android Studio 1.0 gehen Sie folgendermaßen vor:
Android.libraryVariants.all { variant ->
variant.outputs.each { output ->
output.packageLibrary.exclude('libs/someLib.jar')
}
}
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
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!
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"
}