在Gradle中包含特定源文件夹中的文件

时间:2017-01-10 09:21:13

标签: java gradle

我有一个java项目,我想用gradle构建,源代码采用以下结构,

src
 |
 +-main
 |  |
 |  +-java
 |     |
 |     +-package
 |        |
 |        +- Utils.java
 |        +- Other.java
 |        +- Files.java 
 |        +- Folders.java
 +-awesome
    |
    +-java
       |
       +-package
          |
          +- Utils.java

现在,我想从sourceSet src/main/java构建文件,但在Utils.java而不是src/awesome/java源集中包含main

我尝试了以下选项(失败):

1。在exclude

中提供完整的文件路径
sourceSets {
    main {
        java {
            srcDir "src/awesome/java"
            exclude "${projectDir}/src/main/java/package/Utils.java"
        }
    }
}
  

输出:错误:重复类package.Utils

看起来提供完整文件路径在排除模式中不起作用。

2。使用2个java闭包:

sourceSets {
    main {
        java {
            exclude "package/Utils.java"
        }
        java {
            srcDir "src/awesome/java"
        }
    }
}

但是这会从两个源位置删除Utils.java类。

是否可以从gradle中的其他位置提供单个源文件?

注意:我无法单独编译Utils.java类,因为它与其他类有依赖关系。 (我知道它很糟糕,不需要擦它)。

也无法将文件复制到main/java/package位置,因为它可能会污染SCM。

2 个答案:

答案 0 :(得分:1)

我建议您在DAG中插入任务以合并源并构建合并文件夹

例如:

sourceSets.main.java {
   srcDirs = ["$buildDir/mergedSources"]
}
task mergeSources(Type:Copy) {
   from 'src/awesome/java'
   from 'src/main/java'
   duplicatesStrategy = DuplicatesStrategy.EXCLUDE // (see https://docs.gradle.org/current/javadoc/org/gradle/api/file/DuplicatesStrategy.html#EXCLUDE)
   into "$buildDir/mergedSources"
}
compileJava.dependsOn mergeSources
  

也不可能将文件复制到main / java / package位置,因为它可能会污染SCM。

假设您已从SCM中排除$buildDir,则不会“污染”SCM

答案 1 :(得分:0)

看起来我们可以使用exclude(Closure)exclude(Spec)方法排除特定文件,而不是传递字符串。

这是我如何实现它,

sourceSets {
    main {
        java {
            srcDir "src/awesome/java"
            exclude { fileTreeElement ->
                fileTreeElement.file.equals("${projectDir}/src/main/java/package/Utils.java" as File)
            }
        }
    }
}

这样,它包含来自awesome子文件夹的Utils.java,并从主子文件夹中排除Utils.java