62 votes

Comment définir un classpath au moment de la compilation * seulement * dans Gradle?

Quelqu'un peut-il me donner une simple construction.gradle exemple de la façon dont je peux spécifier au moment de la compilation-seules les classes qui ne sont pas inclus dans le déploiement du runtime (la guerre).

Gradle semble avoir obtenu de cette façon le mal autour de depuis des "runtime" hérite de "compiler'. Je ne peux pas imaginer une situation où je voudrais classes au moment de l'exécution que je ne voudrais pas au moment de la compilation. Cependant, il existe bien des cas où j'ai besoin de classes pour générer du code à la compilation que je ne souhaite pas se déployer lors de l'exécution!

J'ai labouré le ballonnement gradle de la documentation, mais ne trouvez pas tout des instructions claires et des exemples. Je soupçonne que cela pourrait être réalisé par la définition d'une "configuration", et de le définir comme le classpath de l'CompileJava plugin - mais la documentation ne permet pas d'expliquer comment atteindre cet objectif.

56voto

rodion Points 6275

Il y a eu beaucoup de discussions sur ce sujet, principalement ici , mais pas de conclusion claire.

Vous êtes sur la bonne voie: actuellement, la meilleure solution consiste à déclarer votre propre configuration provided , qui inclura des dépendances de compilation uniquement et à ajouter à votre chemin de classe de compilation:

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

Cela fonctionne généralement bien.

12voto

Doron Gold Points 84

La réponse de @rodion fonctionne. Cependant, je ne pouvais pas le faire fonctionner dans IntelliJ. Voici une solution légèrement différente et plus concise qui fonctionne à la fois dans IntelliJ et Eclipse:

 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édit: http://kennethjorgensen.com/blog/2014/fat-jars-with-excluded-dependencies-in-gradle/

9voto

Mike T Points 244

J'ai pensé à elle pour mon projet d'installation. J'utilise Android Studio en cours d'exécution avec le plugin gradle 0.9.+ avec gradle 1.11 Le projet principal utilise amazon annonces et amazon dans des applis achats. Il dépend d'un projet de bibliothèque à l'aide d'amazon dispositif de messagerie(SMA).

Mon principal problème était avec le SMA où j'ai eu la "RuntimeException: Stub!" erreur.

1.) Projet De Bibliothèque: La "condition de configuration" proposé par Lukas ne fonctionne pas, comme indiqué par lui, j'ai donc utilisé Richards approche, qui, cependant, ne fonctionne pas hors de la boîte. J'ai dû changer un peu, car je ne pouvais pas trouver la lib dans le ext_libs dossier de l'aar fichier. Gradle semble pack toutes les bibliothèques dans le dossier libs dans le dans le final de l'aar-fichier.

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

2.) Projet D'Application : Ici, l'approche avec la "condition de configuration" travaillé.

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
}

6voto

Peter Niederwieser Points 36369

Il est assez courant d'avoir des dépendances d'exécution qui ne sont pas de la compilation des dépendances. L'inverse est plutôt un cas particulier et en tant que telle, exige quelques lignes de configuration dans Gradle. Je suggère à la recherche de la Gradle forum pour provided.

Cela ressemble à ce que vous êtes vraiment après est de déclarer les dépendances pour votre construire, pas pour la compilation du chemin de classe. Comment c'est fait dépend de la façon dont la fonctionnalité est appelé (tâche Ant, Gradle tâche/plugin ad-hoc sur l'utilisation du script de construction). Si vous fournissez des informations plus détaillées sur ce que vous essayez de faire, je peux fournir plus de réponse spécifique.

Voici quelques liens vers des informations pertinentes dans le Gradle guide de l'utilisateur:

6voto

Adrian H. Points 146

Si vous utilisez le plugin WAR, vous pouvez utiliser providedCompile comme dans cet exemple

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X