我需要用 common ( ) 存档的结构打包一个jar
(或war
格式无关,请进一步阅读)。这意味着我需要充满 dep-cy的文件夹(不是扁平/阴影)和所有常见的东西,如资源等。war
wab
WEB-INF/classes/lib
jar
因此,与非常常见的 NON-osgi 的主要区别war
在于正确编写的清单。问题是,任务的BND
进程,然后战争插件搞砸了一切。Jar
Gradle
现在我已经找到了解决方案,但我对此并不满意。总的来说,我觉得应该有更好的方法。主要有两种策略:
- 不使用
war
插件并依赖BND
丰富的功能。 - 使用
war
插件,但以某种方式重新排列构建,所以它做它的事情,但让它做它的BND
事情,据说在war
. (所以,首先是WAR
在BND
之后。)
一点输入数据。我相信这是 bnd 中的一个主要 SUPER_BUG,因为我所说的所有内容都应该只使用一个指令-wablib
,但是,它的主要问题是它以不同的方式而不是例如以某种方式-includeresource
工作。-wablib
获取某种 full_path_to_resource 的输入,这在 gradle 和总体上进行项目评估和解决时不可用,如果它可以采取同样的jar_name.jar
方式,它可能会很棒includeresource
。但事实并非如此!因此,即使在尝试提取具有所有依赖项的完整路径的字符串之后,也永远不会gradle's configuration is not allowed to be manually resolved
获取这些路径。
另一方面,第二种列出的方式有效,但它看起来和感觉就像一根拐杖。好像不应该那样。我的意思是手动构建Bundle-ClassPath
andInclude-Resources
如何使用插件轻松创建WAR
s而不是扁平/阴影?WAB
war
gradle
片段(更新)
我设法通过添加;lib:=true
bnd 来避免显式构造 manifestClasspath 。
tasks.withType<Jar> {
manifest {
val manifestIncludeJars = configurations.
implementation.
incoming.
dependencies.
joinToString(",") {
"lib/${it.name}.jar=${it.name}-[0-9]*.jar;lib:=true"
}
attributes(mapOf(
SNAPSHOT to "\${tstamp}-SNAPSHOT",
"Automatic-Module-Name" to "${project.group}.\${replace;\${bsn};[-_];.}",
BUNDLE_VERSION to project.version,
INCLUDERESOURCE to manifestIncludeJars
))
}
}
更新
我也设法通过使用没有 gradle 'war' 插件的 bnd 来获得我想要的东西。但这不是我想要的。这构造了整个jar
//无论你叫什么war
,wab
它的结构与 gradle 'war' 插件和正确的清单完全相同,但我想将正确的清单创建与组装档案分开,所以没有从 gradle 到 bnd 的委托工具功能
# [ WEB(APP) / WAB / WAR ]
-wab: src/main/webapp
-includeresource: WEB-INF/classes=src/main/resources
# This does the magic since gradle and bnd share properties during build
deps: ${project.sourceSets.main.runtimeClasspath.files}
# remove the square bracket form the last dependency so it to be incuded in archive
lastDep: {substring;${last;${deps}};0;-1}
-wablib: ${format;%s,;${filter;${deps},${lastDep};.*\.jar$}}