我有一个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。
答案 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
。