[英]How to programmatically exclude top level packages from src/java in gradle?
I have a project that has about 100 top level packages.我有一个包含大约 100 个顶级包的项目。 I want to be able to make a jar for some of these top level packages.
我希望能够为其中一些顶级封装制作 jar。 The code below finds the top level packages, but how do I actually do the exclusions so i only get one?
下面的代码找到了顶级包,但我实际上如何进行排除,所以我只得到一个?
It would be nice to generalize this so that it could work with packages that are not at the top level.把它概括一下会很好,这样它就可以与不在顶层的包一起工作。
sourceSets {
List<String> folders=new LinkedList<>()
String target="r"
for(String path:main.java.srcDirs)
for(String name:new File(path).list())
if(!name.equals(target))
if(new File(path,name).isDirectory())
folders.add(name)
println("how to exclude these folders: "+folders)
}
In an empty directory you can create a simulation of your source setup with the following script:在一个空目录中,您可以使用以下脚本创建源设置的模拟:
def dir = new File('src/main/java')
['a', 'b', 'c', 'd', 'e'].each { l1 ->
['x', 'y', 'z', 'r', 'v'].each { l2 ->
def f = new File(dir, "$l1/$l2/SampleClass.java")
f.parentFile.mkdirs()
f.text = """\
package ${l1}.${l2};
class SampleClass {
}
""".stripIndent()
}
}
which, when run, generates the following:它在运行时会生成以下内容:
─➤ groovy write.groovy
─➤ find src/main/java -type f | sort
src/main/java/a/r/SampleClass.java
src/main/java/a/v/SampleClass.java
src/main/java/a/x/SampleClass.java
src/main/java/a/y/SampleClass.java
src/main/java/a/z/SampleClass.java
src/main/java/b/r/SampleClass.java
src/main/java/b/v/SampleClass.java
src/main/java/b/x/SampleClass.java
src/main/java/b/y/SampleClass.java
src/main/java/b/z/SampleClass.java
src/main/java/c/r/SampleClass.java
src/main/java/c/v/SampleClass.java
src/main/java/c/x/SampleClass.java
src/main/java/c/y/SampleClass.java
src/main/java/c/z/SampleClass.java
src/main/java/d/r/SampleClass.java
src/main/java/d/v/SampleClass.java
src/main/java/d/x/SampleClass.java
src/main/java/d/y/SampleClass.java
src/main/java/d/z/SampleClass.java
src/main/java/e/r/SampleClass.java
src/main/java/e/v/SampleClass.java
src/main/java/e/x/SampleClass.java
src/main/java/e/y/SampleClass.java
src/main/java/e/z/SampleClass.java
─➤
With the following build.gradle
in the root of this directory tree:在此目录树的根目录中使用以下
build.gradle
:
apply plugin: 'java'
task jara(type: Jar) {
archiveBaseName = 'jara'
from jar.source
include 'a/**/*'
}
task jarb(type: Jar) {
archiveBaseName = 'jarb'
from jar.source
include 'b/**/*'
}
artifacts {
archives jara, jarb
}
you can then run:然后你可以运行:
─➤ gradle clean build
BUILD SUCCESSFUL in 509ms
which generates:生成:
─➤ ls -1 build/libs
groovy-how-to-programmatically-exclude-top-level-packages-from-src-java-in-gradle.jar
jara.jar
jarb.jar
─➤ unzip -l build/libs/jara.jar
Archive: build/libs/jara.jar
Length Date Time Name
--------- ---------- ----- ----
0 2020-12-21 15:56 META-INF/
25 2020-12-21 15:56 META-INF/MANIFEST.MF
0 2020-12-21 15:56 a/
0 2020-12-21 15:56 a/r/
266 2020-12-21 15:56 a/r/SampleClass.class
0 2020-12-21 15:56 a/y/
266 2020-12-21 15:56 a/y/SampleClass.class
0 2020-12-21 15:56 a/z/
266 2020-12-21 15:56 a/z/SampleClass.class
0 2020-12-21 15:56 a/x/
266 2020-12-21 15:56 a/x/SampleClass.class
0 2020-12-21 15:56 a/v/
266 2020-12-21 15:56 a/v/SampleClass.class
--------- -------
1355 13 files
─➤ unzip -l build/libs/jarb.jar
Archive: build/libs/jarb.jar
Length Date Time Name
--------- ---------- ----- ----
0 2020-12-21 15:56 META-INF/
25 2020-12-21 15:56 META-INF/MANIFEST.MF
0 2020-12-21 15:56 b/
0 2020-12-21 15:56 b/r/
266 2020-12-21 15:56 b/r/SampleClass.class
0 2020-12-21 15:56 b/y/
266 2020-12-21 15:56 b/y/SampleClass.class
0 2020-12-21 15:56 b/z/
266 2020-12-21 15:56 b/z/SampleClass.class
0 2020-12-21 15:56 b/x/
266 2020-12-21 15:56 b/x/SampleClass.class
0 2020-12-21 15:56 b/v/
266 2020-12-21 15:56 b/v/SampleClass.class
--------- -------
1355 13 files
─➤
ie two jar files, one with all the classes from the a
top level package, one with all the classes from the b
top level package.即两个 jar 文件,一个包含来自顶层 package 的所有类,一个包含来自
a
顶层b
的所有类。
Not sure if this hits your target square on, but it should give you some idea of how to accomplish what you want.不确定这是否会击中您的目标方格,但它应该让您了解如何完成您想要的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.