简体   繁体   中英

How to programmatically exclude top level packages from src/java in gradle?

I have a project that has about 100 top level packages. I want to be able to make a jar for some of these top level packages. 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:

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.

Not sure if this hits your target square on, but it should give you some idea of how to accomplish what you want.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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