Come definisco un classpath * di sola compilazione * in Gradle?

Qualcuno può darmi un semplice esempio build.gradle di come posso specificare le classi solo in fase di compilazione che non sono incluse nella distribuzione runtime (war).

Gradle sembra averlo trovato nel modo sbagliato in quanto “runtime” eredita da “compilare”. Non riesco a immaginare una situazione in cui vorrei classi in fase di esecuzione che non vorrei in fase di compilazione. Tuttavia, ci sono molte circostanze in cui ho bisogno di classi per generare codice in fase di compilazione che non desidero distribuire in fase di runtime!

Ho attraversato la documentazione gonfiabile dei gradle ma non ho trovato istruzioni o esempi chiari. Sospetto che ciò possa essere ottenuto definendo una ‘configurazione’ e impostandola come percorso di class del plugin CompileJava – ma la documentazione non è sufficiente a spiegare come ottenere ciò.

C’è stata molta discussione riguardo questo argomento, principalmente qui , ma non una conclusione chiara.

Sei sulla strada giusta: attualmente la soluzione migliore è dichiarare la tua configurazione provided , che includerà dipendenze compilate solo e aggiungere al tuo classpath di compilazione:

 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] } } 

In genere questo funziona bene.

Se usi il plugin war , providedCompile dovrebbe fare il trucco. Tuttavia, se è necessario escludere dipendenze dall’essere incluse in un jar , è necessario estendere l’attività jar . Di seguito è riportato un esempio per la creazione di un “jar grasso” o “uber jar” (un singolo jar che include tutte le classi delle sue dipendenze) escludendo le dipendenze contrassegnate provided :

 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) } } } 

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

Aggiornare:

A partire dal Gradle 2.12 la questione della definizione delle sole dipendenze compilate viene finalmente risolta in modo semplice e naturale dalla nuova configurazione “copmpileOnly”:

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

L’ho capito per l’installazione del mio progetto. Uso Android Studio con il plugin gradle 0.9. + Con gradle 1.11 Il progetto principale utilizza gli annunci Amazon e gli acquisti inapp amazzonici. Dipende da un progetto di libreria che utilizza amazon device messaging (ADM).

Il mio problema principale era con l’ADM, dove ho ricevuto “RuntimeException: Stub!” errore.

1.) Progetto Biblioteca: La “configurazione fornita” proposta da Lukas non funziona, come dichiarato da lui, quindi ho usato l’approccio di Richards, che tuttavia non ha funzionato altrettanto bene. Ho dovuto cambiarlo un po ‘perché non sono riuscito a trovare la lib nella cartella ext_libs del file aar. Gradle sembra impacchettare tutte le librerie nella cartella libs nel file finale di aar.

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

2.) Progetto di applicazione: qui, l’approccio con la “configurazione fornita” ha funzionato.

 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 } 

È abbastanza comune avere dipendenze di runtime che non dipendono dal tempo di compilazione. L’altro modo è un caso abbastanza speciale e in quanto tale richiede poche righe di configurazione in Gradle. Suggerisco di cercare il forum Gradle per provided .

Sembra che quello che stai veramente cercando stia dichiarando le dipendenze per la tua build , non per il percorso di class compilato. Il modo in cui questo viene fatto dipende da come viene richiamata la funzionalità desiderata (task Ant, task / plugin Gradle, uso ad-hoc dallo script di build). Se fornisci informazioni più dettagliate su ciò che stai cercando di fare, posso fornire una risposta più specifica.

Ecco alcuni link alle informazioni rilevanti nella guida utente Gradle:

  • Dipendenze esterne per lo script di compilazione
  • Dichiarazione del percorso di class per un’attività Ant personalizzata

Se usi il plugin WAR, puoi usare providedCompile come in questo esempio

 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" } 

In Gradle 2.12 è stata introdotta una compileOnly configurazione. Un post del blog che presenta queste funzionalità può essere trovato qui:

Gradle latest feature: compila solo dipendenze

Si prega di essere a conoscenza di un importante effetto collaterale:

Come risultato dell’aggiunta della configurazione “compileOlyly”, la configurazione “compile” non rappresenta più un’immagine completa di tutte le dipendenze del tempo di compilazione. Quando è necessario fare riferimento a un percorso di class compilato negli script di build o nei plugin personalizzati, è necessario utilizzare invece la proprietà compileClasspath del set di origini appropriato.

Si scopre che hanno aggiunto una configurazione “fornita” nel plugin gradle android 0.8.0 ma non funziona del tutto. Aggiunge automaticamente le librerie fornite al percorso di compilazione, ma le include anche nell’ultimo apk / apk.

Ciò che ha funzionato per me è stata la soluzione fornita da @ lukas-hanaceck, ma cambiando il nome da “fornito” a qualsiasi altro nome personalizzato. Nel mio caso si tratta di un progetto di libreria che è una dipendenza per il mio progetto di applicazione Android finale. Ecco un succo di ciò che ha funzionato per me.

 configurations { providedlibs } dependencies { providedlibs files('provided/library.jar') } libraryVariants.all { variant -> variant.javaCompile.classpath += configurations.providedlibs } 

Si compila perfettamente e il file fornito / library.jar non è incluso nell’apk finale. L’unico problema che sto riscontrando è la notifica a Android Studio dell’esistenza di library.jar. Il plug-in idea non sembra funzionare per Android Studio. Suppongo che abbiano un altro plug-in personalizzato per la sincronizzazione gradle con studio.

Non ho trovato una soluzione per Android Studio, ma questo è quello che ho provato:

In Android Studio ho dovuto aggiornare alla versione 0.5. +

sostituire gradle / gradle-wrapper.properties

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

di

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

in tutto il mio build.gradle sostituire

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

di

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

e nella biblioteca volevo usare fornito

 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') } 

e alla fine non funziona, sembra che funzioni per jar ma non per aar o apk come indicato qui https://groups.google.com/forum/#!topic/adt-dev/WIjtHjgoGwA

In Android Studio 1.0 fai questo:

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

Non abbiamo bisogno di “fornito”, prova ad aggiungere questo:

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

Godere!

L’OP apparentemente non ha cercato una risposta Android, ma alcune risposte sono specifiche per Android. Quindi ti suggerisco di dare un’occhiata a questa pagina: http://tools.android.com/tech-docs/new-build-system

La versione 0.9.0 ha introdotto un ambito fornito. Quindi, basta usare

 dependencies { provided "groupId:artifcatId:version" }