如何编写清单.MF 在 Gradle WAR 插件处理后,仍在使用 bnd 功能?



我需要打包一个具有常见war(wab)存档结构的jar(或war,格式无关紧要,请进一步阅读)。这意味着我需要WEB-INF/classes/lib文件夹,里面装满了 dep-cyjar(不是扁平/阴影)和所有常见的东西,如资源等。

因此,与非常常见的 NON-osgiwar的主要区别在于正确编写的清单。问题是BND进程JarGradle,然后战争插件搞砸了一切。

现在我已经找到了解决方案,但我对此不满意。总的来说,我觉得应该有更好的方法。主要有两种策略:

  1. 不使用war插件并依赖BND丰富的功能。
  2. 使用war插入,但不知何故重新排列构建,所以它做了它的事情,但让BNDwar之后也做它的事情。(所以,首先是BND之后的WAR

一点输入数据。我相信这是 bnd 的一个主要SUPER_BUG,因为我所说的一切都应该只适用于一个指令-wablib,但是,它的主要问题是它以某种方式以不同的方式工作,而不是-includeresource示例。-wablib获得某种full_path_to_resource输入,这在 gradle 的项目评估和解决时不可用,总的来说,如果它可以像includeresource那样只需要一个jar_name.jar,那可能会很棒。但事实并非如此!因此,即使在尝试拉取具有所有依赖项的完整路径的字符串之后,也永远不会gradle's configuration is not allowed to be manually resolved获取这些路径。

另一方面,第二种列出的方式有效,但它看起来和感觉都像一根拐杖。好像不应该是那样的。我的意思是手动构建Bundle-ClassPathInclude-Resources

如何使用wargradle插件轻松创建WARWAB而不是扁平/阴影?

代码段(已更新)

我设法避免显式构造 manifestClasspath,只需添加;lib:=true这样 bnd 就可以了。

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

更新

此外,我设法通过使用 bnd 而没有 gradle "war"插件来获得我想要的东西。但这不是我想要的。这构造了整个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$}}

最终,BJ Hargrave 表示,没有直接的方法可以同时使用 WAR Gradle 插件和 bnd Gradle 插件,所以要走的路只是其中之一。 Bnd Gradle插件不支持与Gradle WAR插件的规范战争项目相同的目录结构,因此可能存在困难。此外,生成的神器尽管具有类似 WAR 的结构,但它仍然是一个.jar。但一般来说,我只需使用 bnd 工具 Gradle 插件即可实现所需的结构。

附言问题和答案仅适用于非工作区设置和bnd-gradle-builder插件

这是我的战争(例如网络)项目的bnd.bnd(非工作区)

#     ___   ___     ____  ____________  ________ __________
#    / _ | / _ __ / / / / / __/_  __/ /_  __/ // /  _/ __/
#   / __ |/ // / // / /_/ /   / /     / / / _  // /_ 
#  /_/ |_/____/___/____/___/ /_/     /_/ /_//_/___/___/
#
# ADJUST THIS
# [ BLUEPRINT ] //overrides Blueprint header if exists
Bundle-Blueprint:
# [ IMPEXP ]
-exportcontents: ${packages;ANNOTATED;org.osgi.annotation.versioning.Version}
Import-Package: *
# [ WEB(APP) / WAB / WAR ]
Web-ContextPath: /myapp
# //Pax Web support not 100% OSGi 4.2 compliant https://ops4j1.jira.com/browse/PAXWEB-206
Webapp-Context: /myapp
-wab: src/main/webapp
# // for instance regex for end and start (^[)|(]$)
-wablib: ${format;%s,;${filter;${substring;${project.sourceSets.main.runtimeClasspath.files};1;-1};.*.jar$}}
#     __   ______ __________  __  _  ______    _______ _____   _  _______________
#    / /  /  _/ //_/ __/ / / / / |/ / __   / ___/ // / _ | / |/ / ___/ __/ __/
#   / /___/ // ,< / _// /__  / /    / /_/ / / /__/ _  / __ |/    / (_ / _/_ 
#  /____/___/_/|_/___/____//_/ /_/|_/____/  ___/_//_/_/ |_/_/|_/___/___/___/
#
# // probably no changes needed
Bundle-Description: ${project.description}
Bundle-DocURL: ${project.bundleDocURL}
Bundle-Version: ${project.version}
Automatic-Module-Name: ${project.group}.${replace;${bsn};[-_];.}
-snapshot: ${tstamp}-SNAPSHOT
-pedantic: true
-sources: false
-runee: JavaSE-${project.javaManifestVersion}
-pom: true
-fixupmessages: "Classes found in the wrong directory";is:=warning

非战争(非网络)项目

#     ___   ___     ____  ____________  ________ __________
#    / _ | / _ __ / / / / / __/_  __/ /_  __/ // /  _/ __/
#   / __ |/ // / // / /_/ /   / /     / / / _  // /_ 
#  /_/ |_/____/___/____/___/ /_/     /_/ /_//_/___/___/
#
# [ BLUEPRINT ] //overrides Blueprint header if exists
Bundle-Blueprint:
# [ IMPEXP ]
-exportcontents: ${packages;ANNOTATED;org.osgi.annotation.versioning.Version}
Import-Package: *
#     __   ______ __________  __  _  ______    _______ _____   _  _______________
#    / /  /  _/ //_/ __/ / / / / |/ / __   / ___/ // / _ | / |/ / ___/ __/ __/
#   / /___/ // ,< / _// /__  / /    / /_/ / / /__/ _  / __ |/    / (_ / _/_ 
#  /____/___/_/|_/___/____//_/ /_/|_/____/  ___/_//_/_/ |_/_/|_/___/___/___/
#
# // probably no changes needed
Bundle-Description: ${project.description}
Bundle-DocURL: ${project.bundleDocURL}
Bundle-Version: ${project.version}
Automatic-Module-Name: ${project.group}.${replace;${bsn};[-_];.}
-snapshot: ${tstamp}-SNAPSHOT
-pedantic: true
-sources: false
-runee: JavaSE-${project.javaManifestVersion}
-pom: true
-fixupmessages: "Classes found in the wrong directory";is:=warning

此外,从那时起,bnd-tools开始支持多jar项目,因此可以避免fixupmessages,也许应该相应地调整其他一些东西。

相关内容

  • 没有找到相关文章

最新更新