我想在我的项目中创建一个新任务,创建一个jar存档,其中包含项目的类文件和依赖项的类文件(也称为'shaded jar'或'fat jar')。
Gradle cookbook提出的解决方案修改了JavaPlugin的标准jar任务:
jar {
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}
但是,我想保留原来的jar文件并为shaed jar创建一个额外的任务,即一个行为与jar任务完全相同的任务,但包括根据
的附加文件from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
并有另一个分类器('阴影')。
我尝试通过复制以下属性来接管jar任务的配置:
task shadedJar(type: Jar, dependsOn: configurations.compile) {
dependencies = tasks.jar.taskDependencies
source = tasks.jar.source
manifest = tasks.jar.manifest
includes = tasks.jar.includes
classifier = 'shaded'
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}
但是生成的任务不会接管'jar'的依赖关系,并且生成的jar不包含项目的类文件。此外,这种方法似乎很难成为使用现有任务作为新模板的模板的推荐方法。
对于我的特定需求(单独的shadedJar任务)和“克隆”任务,可以使用什么方法将它们用作一般其他任务的模板?
(我目前仍在使用Gradle 1.3,但欢迎使用当前Gradle版本的解决方案)
答案 0 :(得分:9)
没有内置的克隆任务的方法。但是,将fatJar
任务配置为包含与java
插件的jar
任务相同的文件很容易:
task fatJar(type: Jar) {
appendix = "fat"
from sourceSets.main.output // that's it
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}
任务自动装配将自动建立必要的任务依赖关系。
如果构建脚本继续自定义jar
任务,您可以同时将自定义应用于这两个任务:
configure([jar, fatJar]) {
version = "2.0"
entryCompression = "STORED"
}
如果与jar
任务的情况不同,您自己定义“模板”,则可以使用工厂方法“实例化”它:
def getMeAnotherOne(String name) {
task(name, type: Jar) {
version = "2.0"
entryCompression = "STORED"
}
}
getMeAnotherOne("jar1")
getMeAnotherOne("jar2")