我需要的
我们使用 Gradle 和shadowJar打包我们的产品。我们使用的一些库利用了 Jar Manifests 中的各个部分,特别是诸如 Implementation-Title 和 Implementation-Version 之类的属性。这些有时会显示在我们的产品(输出)中,所以我希望它们能够在 shawdowJar-Process 中存活下来。
例子
lib1.jar/META-INF/MANIFEST.MF
Manifest-Version: 1.0
...
Name: org/some/lib
...
Implementation-Title: someLib
Implementation-Version: 2.3
...
lib2.jar/META-INF/MANIFEST.MF
Manifest-Version: 1.0
...
Name: org/some/other/lib
...
Implementation-Title: someOtherLib
Implementation-Version: 5.7-RC
...
=> product.jar/META-INF/MANIFEST.MF
Manifest-Version: 1.0
...
Name: org/some/lib
...
Implementation-Title: someLib
Implementation-Version: 2.3
...
Name: org/some/other/lib
...
Implementation-Title: someOtherLib
Implementation-Version: 5.7-RC
...
我发现了什么
- 使用 shadowJar操作生成的清单相当容易:
project.shadowJar {
manifest {
attributes(["Implementation-Title" : "someLib"], "org/some/lib")
attributes(["Implementation-Title" : "someOtherLib"], "org/some/other/lib")
}
}
静态地生成我想要的东西。
- shadowJar 可以为我提供依赖项列表。但是,当我像这样遍历 FileCollection
project.shadowJar {
manifest {
for (dependency in includedDependencies) {
// read in jar file and set attributes
}
}
}
Gradle 不高兴:“在依赖项解析中包含依赖项配置 ':project:products:<ProductName>:compile' 后无法更改依赖项。”
- 当我定义一个新任务时
def dependencies = [];
project.tasks.register('resolveDependencies') {
doFirst {
gradleProject.configurations.compile.resolvedConfiguration.resolvedArtifacts.each {
dependencies.add(it.file)
}
}
}
project.tasks['shadowJar'].dependsOn(project.tasks['resolveDependencies']);
project.shadowJar {
manifest {
// dependencies will be empty when this code is called
for (dependency in dependencies) {
// read in jar file and set attributes
}
}
}
依赖关系没有及时解决。
我想知道的
如何在不破坏 Gradle 的情况下访问依赖项?或者,是否有另一种方法可以将命名的各个部分与 shadowJar 合并?