Gradle exclut le fichier de sourceSet ne fonctionne pas

J'ai un projet où j'essaie d'inclure un fichier unique d'un arbre de fichiers source java dans un projet de bibliothèque. Quoi que je fasse, je ne peux pas inclure ce fichier. J'ai eu du succès dans un autre projet, à l'exclusion de tous les fichiers, sauf celui, mais cela n'a fonctionné que lors de l'exécution de Gradle à partir du projet de la bibliothèque. Lorsqu'il a été exécuté à partir du répertoire de l'application, tous les fichiers ont été inclus. Tout en essayant de créer un projet simple qui reproduit le problème, ce même excluant tout ne fonctionne pas non plus.

L'arborescence des fichiers exemple est simple:

  • View.isHardwareAccelerated () est toujours faux
  • Exportation d'une base de données SQLite vers un fichier XML dans Android
  • Android, simple-xml, comment déclarer une liste d'éléments?
  • Authentification Google avec un serveur Backend requis Scopes
  • Actualiser le fragment actuel (données ListView) restant dans la même activité
  • Comment changer l'état ToggleButton par programme?
  • application - android app that includes the two libraries library1/ build.gradle src/main/AndroidManifest.xml library2/ build.gradle src/main/AndroidManifest.xml java/src/com/company/product/ /pkg1 Source1.java, Source2.java, Source3.java libraryoneonly/Library1Source.java /pkg2 Source1.java, Source2.java, Source3.java 

    The library1 build.gradle ressemble à ceci. Aucun des éléments inclus ou exclut les travaux ci-dessous.

    Library1 / build.gradle

     apply plugin: 'com.android.library' android { sourceSets { main.jni.srcDirs = [] main.jniLibs.srcDir 'src/main/libs' main.java { srcDir "../../java/src" exclude { FileTreeElement elem -> println "Searching for files, found: " + elem.relativePath !(elem.isDirectory() || elem.name.equals('Library1Source.java')) } //include ("**/libraryoneonly/**") //include ('com/company/product/pkg1/libraryoneonly/Library1Source.java') } } dependencies { compile project(':library2') } 

    Et library2 build.gradle. Étonnamment, le non commenté ci-dessous ne fonctionne pas.

    Library2 / build.gradle

     apply plugin: 'com.android.library' android { sourceSets { main.jni.srcDirs = [] main.jniLibs.srcDir 'src/main/libs' main.java { srcDir "../../java/src" //exclude { FileTreeElement elem -> ((elem.path.contains('/libraryoneonly/')) ) } exclude ('com/company/product/pkg1/libraryoneonly/Library1Source.java') } } 

    Juste pour noter, je ne vois jamais le texte "Rechercher des fichiers, trouvé" lorsque la bibliothèque1 est en train de construire. Je ne sais pas pourquoi. Je le vois dans le projet plus vaste auquel ce test a été modélisé, selon l'origine de la construction.

    Si vous souhaitez extraire l'exemple de projet et l'essayer, voici un lien: https://github.com/gbak/gradleTest

  • Android: tirant sur la marge et / ou le rembourrage
  • Phonegap (Android Build) - Écran intermédiaire avant écran Splash
  • Android progressbar dans une liste est toujours indéterminé
  • Comment puis-je transférer mon adresse IP localhost vers un émulateur Android?
  • Android AsyncTask Meilleure façon d'accéder au contexte d'activité
  • Comment utiliser une glisse pour télécharger une image dans un bitmap?
  • 3 Solutions collect form web for “Gradle exclut le fichier de sourceSet ne fonctionne pas”

    Gradle'e SourceDirectorySet semble avoir des fonctionnalités manquantes. Docs a une note très révélatrice:

    TODO – configure comprend / exclut pour les sources individuelles dirs, et synchronise avec CopySpec TODO – permet d'ajouter FileTree

    Le manque de fonctionnalités à égalité avec CopySpec signifie qu'il n'y a pas de façon logique de faire ce que vous demandez. Le modèle d' include ajoute d'abord une liste de fichiers au sourceSet, puis vous pouvez exclude quelques fichiers de cet ensemble. Sauf,

    1. Le principal.java main.java implique implicitement **\*.java
    2. Il n'y a pas d' exclusion de tout ce qui n'est pas

    Signifie que vous êtes SOL.

    Vous pouvez déclarer un ensemble de sources main.somethingElse distinct et utiliser inclure juste un fichier, mais je n'ai pas pu comprendre comment ajouter le nouveau sourceet au chemin de compilation. Le hack suggéré ici , l'utilisation de compilation args ne fonctionne plus, java se plaint de drapeaux non valides.

    La seule solution à laquelle je pense est d'utiliser un chemin qui exclut les fichiers que vous ne voulez pas dans main.java.srcDir pour la bibliothèque1

      main.java { srcDir '../../java/src/com/company/product/pkg1/libraryoneonly' } 

    J'ai finalement compris la possibilité d'inclure un seul fichier, sans modifier le chemin srcDir :

     main.java { srcDir "../../java/src" setIncludes(new HashSet(['com/company/product/pkg1/libraryoneonly/*.java'])) } 

    Le chemin '**/*.java' est automatiquement inclus en tant qu'instance, en ajoutant d'autres inclus, comme une inclure directement dans le fichier source ne fait rien, puisqu'il s'agit déjà d'un chemin inclus de toute façon.

    L'appel setIncludes() remplace tout inclus, y compris le '**/*.java' et définit le chemin fourni [s] comme le seul chemin d'inclusion.

    Lecture sur les docs et ajout des instructions d'impression suggérées après que main.java ait aidé.

     main.java.getIncludes().each { println "Added include: $it" } main.java.sourceFiles.each { println "File in source set: " + it } 

    Merci à tous ceux qui ont aidé.

    Votre code semble être correct pour moi, il est juste que FileCollections comme sourceFiles est imprudemment évalué, c'est-à-dire que votre instruction println n'est pas exécutée tant que le contenu de l'ensemble source n'est pas demandé.

    Ajoutant quelque chose comme

     main.java.sourceFiles.each { println "File in source set: " + it } 

    Après la main.java {...} devrait effectivement faire fonctionner l' println .

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.