Java 在gradle构建中的jar归档中包含特定类

Java 在gradle构建中的jar归档中包含特定类,java,gradle,Java,Gradle,我有一个关于gradle java项目的新手问题。我希望将这个项目的输出工件jar配置为只包含项目中的某些类。我将所需的类包含在一个文件中,比如classes.txt,该文件是作为单独任务的一部分生成的。我们应该如何配置gradle构建的jar任务来实现这一点。这就是我迄今为止所尝试的: jar { // reset actions actions = [] copy { def dependentClasses = file("classes.txt")

我有一个关于gradle java项目的新手问题。我希望将这个项目的输出工件jar配置为只包含项目中的某些类。我将所需的类包含在一个文件中,比如
classes.txt
,该文件是作为单独任务的一部分生成的。我们应该如何配置gradle构建的
jar
任务来实现这一点。这就是我迄今为止所尝试的:

jar {
    // reset actions
    actions = []
    copy {
        def dependentClasses = file("classes.txt")
        if (dependentClasses.exists()) {
            dependentClasses.eachLine { include it }
        }

        from sourceSets.main.output
        includeEmptyDirs = false
        into "build/tmp/jar" //Some temporary location
    }
    // How to zip the contents?
}
我为这个可能很幼稚的问题感到抱歉,但我还没有看到其他解决方案


谢谢

可以通过以下方式完成:

apply plugin: 'java'

jar {
   def excluded = project.file('classes.txt').readLines()

   exclude { f ->
      excluded.any { e -> f.path.replaceAll(File.separator, '.').contains(e) }
   }
}

可以找到演示,
Lol1.class
将被排除。

使用Opal的答案,这里是包含文件的答案

apply plugin: 'java'

jar {
   def included = project.file('classes.txt').readLines()
   include { f ->
      included.any { i -> f.isDirectory() ? true : f.path.replaceAll(File.separator, '.').contains(i) }
   }
}
小技巧是,传递给闭包的
FileTreeElement
f
也传递了包目录,如果恰好返回false,则不会遍历下面的子树,因此对它的检查是一个返回true的目录,以支持子树的处理


该解决方案的演示是和Lol1.class将包括在内。谢谢你的帮助,欧泊

谢谢@Opal-我一直在寻找包含特定类而不是排除,但我猜解决方案应该是类似的-我会尝试一下,让你知道。但是,如果你知道解决方案,你可以在这里编辑它本身?顺便说一句,我喜欢系统化的github代码演示组织!不幸的是没有。包含不处理单个文件,而是处理组或模式。Github演示不系统;]您能发布/编辑代码以匹配模式吗?我猜,如果我们传递对应于每个类的特定模式,我们可以达到相同的效果吗?抱歉,如果我完全失去了理解力。。。