我正在使用BndTools(http://bndtools.org/)来开发OSGI应用程序。一切都很好,但我想在导出我的应用程序时想要改变一些东西。
我正在努力实现两件事(我认为它们可能是相关的):
aQute.launcher
)替换为自定义启动器(或以.JAR
格式)如何摆脱或更改默认的BndTools启动器(aQute.launcher)到自定义启动器?
我在这个主题上唯一能找到的就是:http://goo.gl/jYliih
Launchers没有构建成bnd,实际的启动策略是参数化的。通过在
-runpath
上放置JAR,启动器与bnd或bndrun文件相关联。.JAR
应该有一个Launcher-Plugin标头作为启动器。如果在-runpath
上找不到启动器,则会使用内置biz.aQute.launcher
。
原因是我需要我的应用程序接受命令args而不是干扰aQute启动器(就像所有-run args)。另一方面,我想摆脱启动应用程序的批量.bat/.sh
方法,并使用单个.jar
文件来启动应用程序。
这可能吗?
默认情况下,BndTools在导出应用程序时会创建此文件结构:
jar/
- >这是OSGI jar包文件夹
aQute/
- >默认的BndTools Launcher(内部的Launcher.class)
META-INF/
- >为什么这里有META-INF文件夹?这不是JAR
launcher.properties
- >启动器属性
start.sh
- >从此批处理文件中启动Launcher.class。
start.bat
/与JAR相比,这有什么好处?
基本上我想删除aQute
,META-INF
和start.*
文件,并为二进制文件添加bin
文件夹。
这应该可以用“Ant”,“Maven”或“Gridle”脚本来实现。但我可以创建一个没有BndTools支持的“BndTools项目”或“Gradle项目”。我安装了“BndTools Gradle插件”,但我找不到任何有关此主题的有用文档。
希望有人可以帮助我,或者指出我正确的方向。 问候。
答案 0 :(得分:3)
(这个问题也在bndtools小组名单上提出)
我有点困惑,因为你似乎已经获得了许可。您可以将bndrun文件导出到单个可执行JAR。在bndtools程序中,您可以通过获取Object服务然后获取“launcher.arguments”服务属性来访问命令行参数。这是给予启动器主方法的原始String []。
@Reference(target=“(launcher.arguments=*)”)
void setArgs( Map<String,Object> args ) {
… = (String[]) args.get( “launcher.arguments”;
}
导出的JAR是可执行的JAR。可以通过JPM轻松地将其转换为本地可执行文件。
jpm install -n mycode mycode.jar
您可以从http://jpm4j.org/#!/md/install安装jpm。
<强>罗伯特:强> 谢谢Peter,启动器参数代码片段正是我所需要的。
关于文件夹结构:
我需要我的捆绑包可以更新。如果我将所有捆绑包嵌入.Jar中,则无法更新它们。我只需要在外面捆绑包时启动Launcher。
BndTools有两个导出选项。 1,您可以将整个启动器和所有捆绑包嵌入一个JAR中。或者选项2是将lib包放在lib目录中,并通过shell脚本(start.bat,start.sh)启动它们。 我正在寻找一个没有shell脚本的解决方案。
<强>彼得:强> 即使捆绑包在内部,只要您不清除Framework的存储区域,您仍然可以更新它们。例如,您可以轻松地包含文件安装,并从目录中加载包或使用其他管理代理Apache Ace。
从我的角度来看,当前的JAR导出(我实际上非常不喜欢目录导出,它很混乱)是最好的。它有一个非常好的发布模型,只有一个易于版本和更新的文件。使用JPM,您可以在任何系统上安装它。
因此,如果你想要别的东西,你将不得不创建自己的出口商......