2015-08-18 58 views
2

我在gradle java项目上有一个新手问题。我希望将这个输出工件jar配置为只包含来自我的项目的某些类。我将所需的类包含在文件中,如classes.txt,它是作为单独任务的一部分生成的。应该如何配置gradle build的jar任务,以便做到这一点。这是我到目前为止已经试过:在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? 
} 

我很遗憾的可能是幼稚的问题,但我还没有看到有其他的解决方案运气。

谢谢!

回答

1

用欧泊的答案,这里是答案包含文件的

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

轻微的诀窍是,FileTreeElementf被传递给closure也有通过包目录,如果出现这种情况返回false ,下面的子树不会被遍历,因此检查它是一个返回true的目录来启用子树的处理。

解决方案示例为here,并且将包含Lol1.class。感谢您的帮助,Opal!

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将被排除在外。

+0

谢谢@Opal - 我正在寻找包括特定的类而不是排除,但我猜测解决方案应该是类似的 - 将尝试它并让你知道。但是,如果您知道解决方案不在您的头顶,您可以在此自行编辑它?顺便说一句,喜欢系统的Github代码演示组织! – Kilokahn

+0

不幸的不是。包括不处理单个文件,但组或模式。 Github演示不是系统的;] – Opal

+0

您可以发布/编辑代码以匹配模式吗?我猜如果我们传递与每个类相对应的特定模式,我们可以达到相同的效果?道歉,如果我完全了解我的理解...... – Kilokahn

相关问题