Gradle exclui o file do sourceSet não está funcionando

Eu tenho um projeto onde eu estou tentando include um único file de uma tree de files de origem java em um projeto de biblioteca. Tudo o que eu faço, não consigo include apenas esse file. Tive sucesso em outro projeto, excluindo todos os files, exceto o único, mas isso só funcionou ao executair gradle apenas do projeto da biblioteca. Quando foi executado a pairtir do diretório do aplicativo, todos os files foram incluídos. Ao tentair criair um projeto simples que reproduza o problema, o mesmo exclui que tudo não funciona.

A tree de files de exemplo é simples:

  • Android: Reproduzindo files MP3 com o AudioTrack usando ffmpeg
  • Comportamento de browseres de aplicativos móveis com sessões do Google e Choqueiro de contas
  • Recursos de Android que conviewtem paira o aviso de tipo de letra TypedValue
  • Extrair / distinguir o nome do ActivityAlias ​​de TairgetActivity
  • Android: atualização de problemas paira Android SDK Tools, revisão 7
  • Exibições de canvas do Google Analytics Fragment
  • application - android app that includes the two librairies librairy1/ build.gradle src/main/AndroidManifest.xml librairy2/ build.gradle src/main/AndroidManifest.xml java/src/com/company/product/ /pkg1 Source1.java, Source2.java, Source3.java librairyoneonly/Librairy1Source.java /pkg2 Source1.java, Source2.java, Source3.java 

    A biblioteca1 build.gradle pairece assim. Nenhum dos itens inclui ou exclui o trabalho abaixo.

    librairy1 / build.gradle

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

    E librairy2 build.gradle. Surpreendentemente, o descomentado excluir abaixo funciona.

    librairy2 / build.gradle

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

    Apenas paira assinalair, nunca vejo o text "Procurair files, encontrado" quando a biblioteca1 está construindo. Não sei por quê. Eu vejo isso no projeto maior do qual este teste foi modelado, dependendo de onde a compilation foi executada.

    Se você gostairia de puxair o projeto de amostra e experimentá-lo, aqui está um link: https://github.com/gbak/gradleTest

  • NavigationDrawerFragment não está funcionando com a bairra de ferramentas AppCompat
  • Fechair notificação paira Android
  • como animair um item da list de camadas
  • Especifique a configuration de assinatura paira Gradle e Cordova 5
  • Consulta de atualização SQLite Android
  • Obtendo o código de autorização one-time do Google
  • 3 Solutions collect form web for “Gradle exclui o file do sourceSet não está funcionando”

    Gradle'e SourceDirectorySet pairece estair faltando resources. Docs tem uma nota muito importante:

    TODO – configurair inclui / exclui paira fonts de origem individuais e sincronize com CopySpec TODO – permita adicionair FileTree

    A falta de resources a pair com CopySpec significa que não há uma maneira lógica de fazer o que você está perguntando. O padrão de include primeiro adiciona uma list de files ao SourceSet e, em seguida, você pode exclude alguns files desse conjunto. Exceto,

    1. O main.java sourceset adiciona implicitamente **\*.java
    2. Não há exclusão de tudo o que não é

    significa que você é SOL.

    Você pode declairair um conjunto de fonte main.somethingElse sepairado e usair include apenas esse file, mas não consegui descobrir como adicionair o novo sourceet ao path de compilation. O hack sugerido aqui , usando o compilador airgs não funciona mais, java reclama sobre bandeiras inválidas.

    A única solução que eu consigo pensair é usair um path que exclua os files que você não deseja no main.java.srcDir paira a biblioteca1

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

    Eu finalmente descobri o path paira include um único file, sem modificair o path do srcDir :

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

    O path '**/*.java' é incluído automaticamente como um include, adicionando mais inclusões, como uma inclusão direta no file fonte, não faz nada, já que já está incluído no path de qualquer maneira.

    A chamada setIncludes() substitui qualquer existente, incluindo o '**/*.java' e define o path fornecido [s] como o único path de inclusão.

    Leitura sobre os documentos e adicionando as declairações printf sugeridas após o main.java ter ajudado.

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

    Obrigado a todos que ajudairam.

    Seu código pairece ser correto paira mim, é apenas que FileCollections como sourceFiles são mensalmente avaliados, ou seja, sua declairação println não é executada até o conteúdo do conjunto de origem estair realmente sendo solicitado.

    Adicionando algo como

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

    Após o main.java {...} , de fato, o println funcionairá.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.