简体   繁体   English

如何以编程方式从 gradle 中的 src/java 中排除顶级包?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM