簡體   English   中英

如何以編程方式從 gradle 中的 src/java 中排除頂級包?

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

我有一個包含大約 100 個頂級包的項目。 我希望能夠為其中一些頂級封裝制作 jar。 下面的代碼找到了頂級包,但我實際上如何進行排除,所以我只得到一個?

把它概括一下會很好,這樣它就可以與不在頂層的包一起工作。

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)
    
}

在一個空目錄中,您可以使用以下腳本創建源設置的模擬:

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()
  }
}

它在運行時會生成以下內容:

─➤ 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

─➤ 

在此目錄樹的根目錄中使用以下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
}

然后你可以運行:

─➤ gradle clean build 

BUILD SUCCESSFUL in 509ms

生成:

─➤ 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

─➤ 

即兩個 jar 文件,一個包含來自頂層 package 的所有類,一個包含來自a頂層b的所有類。

不確定這是否會擊中您的目標方格,但它應該讓您了解如何完成您想要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM