我需要打包一个具有常见war
(wab
)存档结构的jar
(或war
,格式无关紧要,请进一步阅读)。这意味着我需要WEB-INF/classes/lib
文件夹,里面装满了 dep-cyjar
(不是扁平/阴影)和所有常见的东西,如资源等。
因此,与非常常见的 NON-osgiwar
的主要区别在于正确编写的清单。问题是BND
进程Jar
Gradle
,然后战争插件搞砸了一切。
现在我已经找到了解决方案,但我对此不满意。总的来说,我觉得应该有更好的方法。主要有两种策略:
- 不使用
war
插件并依赖BND
丰富的功能。 - 使用
war
插入,但不知何故重新排列构建,所以它做了它的事情,但让BND
在war
之后也做它的事情。(所以,首先是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-ClassPath
和Include-Resources
如何使用war
gradle
插件轻松创建WAR
WAB
而不是扁平/阴影?
代码段(已更新)
我设法避免显式构造 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
,也许应该相应地调整其他一些东西。