compilation - warning - update gradle
¿Cómo puedo definir un classpath*solo*en tiempo de compilación en Gradle? (11)
El OP aparentemente no buscó una respuesta de Android, pero algunas respuestas son específicas de Android. Así que le sugiero que mire esta página: http://tools.android.com/tech-docs/new-build-system
La versión 0.9.0 introdujo un alcance proporcionado. Entonces, solo usa
dependencies {
provided "groupId:artifcatId:version"
}
¿Puede alguien darme un simple ejemplo build.gradle de cómo puedo especificar clases de tiempo de compilación que no están incluidas en la implementación en tiempo de ejecución (war).
Parece que Gradle ha recibido esto al revés ya que ''runtime'' hereda de ''compile''. No puedo imaginar una situación en la que me gustaría tener clases en tiempo de ejecución que no quisiera en el momento de la compilación. Sin embargo, hay muchas circunstancias en las que necesito clases para generar código en tiempo de compilación que no deseo implementar en tiempo de ejecución.
He repasado la documentación de gradle hinchada pero no puedo encontrar instrucciones claras o ejemplos. Sospecho que esto podría lograrse definiendo una ''configuración'' y configurándola como la ruta de clase del complemento CompileJava, pero la documentación no explica cómo lograr esto.
En Android Studio 1.0 haz esto:
android.libraryVariants.all { variant ->
variant.outputs.each { output ->
output.packageLibrary.exclude(''libs/someLib.jar'')
}
}
En Gradle 2.12 se ha introducido una configuración de compileOnly
. Una publicación de blog que presenta estas características se puede encontrar aquí:
Última función de Gradle: Compilar solo dependencias
Tenga en cuenta un efecto secundario importante:
Como resultado de la adición de la configuración "compileOnly", la configuración de "compilación" ya no representa una imagen completa de todas las dependencias de tiempo de compilación. Cuando se necesita hacer referencia a una ruta de clase de compilación en los scripts de compilación o los complementos personalizados, se debe usar en su lugar la propiedad compileClasspath del conjunto de origen apropiado.
Es bastante común tener dependencias de tiempo de ejecución que no sean dependencias de tiempo de compilación. A la inversa, es un caso bastante especial y, como tal, requiere algunas líneas de configuración en Gradle. Sugiero buscar en el foro de Gradle para provided
.
Parece que lo que realmente buscas es declarar dependencias para tu compilación , no para la ruta de la clase de compilación. Cómo se hace esto depende de cómo se invoca la funcionalidad deseada (tarea Ant, tarea / complemento de Gradle, uso ad-hoc del script de compilación). Si proporciona información más detallada sobre lo que está tratando de hacer, puedo proporcionar una respuesta más específica.
Aquí hay algunos enlaces a información relevante en la guía de usuario de Gradle:
Hubo mucha discusión con respecto a este tema, principalmente here , pero no con una conclusión clara.
Está en el camino correcto: actualmente, la mejor solución es declarar su propia configuración provided
, que incluirá dependencias de solo compilación y agregará a su compilación classpath:
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]
}
}
Por lo general, esto funciona bien.
Lo descubrí para la configuración de mi proyecto. Uso Android Studio corriendo con el plugin de gradle 0.9. + Con gradle 1.11 El proyecto principal usa anuncios amazon y compras de Amazon Inpp. Depende de un proyecto de biblioteca que utilice la mensajería de dispositivo amazónico (ADM).
Mi principal problema fue con el ADM donde obtuve el "RuntimeException: Stub!" error.
1.) Proyecto de biblioteca: La "configuración proporcionada" propuesta por Lukas no funciona, como él mismo declaró, así que utilicé el enfoque de Richards, que sin embargo no funcionó tan bien. Tuve que cambiarlo un poco ya que no pude encontrar la lib en la carpeta ext_libs del archivo aar. Gradle parece empaquetar todas las bibliotecas en la carpeta libs en el archivo aar final.
android.libraryVariants.all { variant ->
variant.packageLibrary.exclude( ''libs/amazon-device-messaging-1.0.1.jar'' )
}
2.) Proyecto de aplicación: Aquí, el enfoque con la "configuración proporcionada" funcionó.
configurations{
provided
}
dependencies {
compile ''fr.avianey:facebook-android-api:+@aar''
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
}
No encontré una solución para Android Studio, pero esto es lo que intenté:
En el estudio de Android tuve que actualizar a la versión 0.5. +
en gradle / gradle-wrapper.properties replace
distributionUrl=http/://services.gradle.org/distributions/gradle-1.9-rc-3-bin.zip
por
distributionUrl=http/://services.gradle.org/distributions/gradle-1.11-all.zip
en todo mi build.gradle replace
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath ''com.android.tools.build:gradle:0.7.+''
}
}
por
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath ''com.android.tools.build:gradle:0.9.+''
}
}
y en la biblioteca que quería utilizar siempre
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'')
}
y al final no funciona, parece que funciona para jar pero no para aar o apk como se indica aquí https://groups.google.com/forum/#!topic/adt-dev/WIjtHjgoGwA
No necesitamos "proporcionado", intente agregar esto:
android.libraryVariants.all { variant ->
variant.packageLibrary.exclude( ''ext_libs/amazon-device-messaging-1.0.1.jar'' )
}
¡Disfrutar!
Resulta que han agregado una configuración "proporcionada" en el plugin android de gradle 0.8.0 pero no funciona del todo. Agrega las bibliotecas proporcionadas a la ruta de compilación automáticamente, pero también las incluye en el aar / apk final.
Lo que funcionó para mí fue la solución provista por @ lukas-hanaceck, pero cambiando el nombre de "proporcionado" a cualquier otro nombre personalizado. En mi caso, este es un proyecto de biblioteca que es una dependencia para mi proyecto final de aplicación de Android. Aquí hay una esencia de lo que funcionó para mí.
configurations {
providedlibs
}
dependencies {
providedlibs files(''provided/library.jar'')
}
libraryVariants.all {
variant -> variant.javaCompile.classpath += configurations.providedlibs
}
Se compila perfectamente y el archivo / library.jar proporcionado no está incluido en la apk final. El único problema que tengo es notificar a Android studio de la existencia de library.jar. El complemento idea no parece funcionar para Android studio. Supongo que tienen otro complemento personalizado para sincronizar gradle con Studio.
Si usa el complemento WAR, puede usar providedCompile
como en este example
dependencies {
compile module(":compile:1.0") {
dependency ":compile-transitive-1.0@jar"
dependency ":providedCompile-transitive:1.0@jar"
}
providedCompile "javax.servlet:servlet-api:2.5"
providedCompile module(":providedCompile:1.0") {
dependency ":providedCompile-transitive:1.0@jar"
}
runtime ":runtime:1.0"
providedRuntime ":providedRuntime:1.0@jar"
testCompile "junit:junit:4.11"
moreLibs ":otherLib:1.0"
}
Si usa el complemento de guerra , providedCompile
queCompile deba hacer el truco. Sin embargo, si necesita excluir dependencias de ser incluidas en un jar , tendrá que extender la tarea jar
. A continuación se muestra un ejemplo para crear un "jar gordo" o "jar de uber" (un solo jar que incluye todas las clases de sus dependencias) excluyendo las dependencias marcadas 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)
}
}
}
Crédito: http://kennethjorgensen.com/blog/2014/fat-jars-with-excluded-dependencies-in-gradle/
Actualizar:
A partir de Gradle 2.12 , la nueva configuración "copmpileOnly" resuelve finalmente la cuestión de definir dependencias de compilación únicamente de forma simple y natural:
dependencies {
compileOnly ''javax.servlet:servlet-api:2.5''
}