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

时间:2015-08-18 20:09:54

标签: java gradle

我在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?
}

对于这个可能天真的问题我很抱歉,但我还没有看到其他解决方案的运气。

谢谢!

2 个答案:

答案 0 :(得分:1)

可以通过以下方式完成:

apply plugin: 'java'

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

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

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

答案 1 :(得分:1)

使用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的目录,以启用子树的处理。

解决方案的演示是here,并且将包含Lol1.class。谢谢你的帮助,Opal!