如何替换BndTools默认启动器并更改导出文件结构

时间:2016-02-23 21:48:10

标签: java osgi osgi-bundle bnd bndtools

我正在使用BndTools(http://bndtools.org/)来开发OSGI应用程序。一切都很好,但我想在导出我的应用程序时想要改变一些东西。

我正在努力实现两件事(我认为它们可能是相关的):

1:将默认BndTools启动器(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文件来启动应用程序。

这可能吗?

2:自定义导出的文件结构

默认情况下,BndTools在导出应用程序时会创建此文件结构:

jar/ - >这是OSGI jar包文件夹

aQute/ - >默认的BndTools Launcher(内部的Launcher.class)

META-INF/ - >为什么这里有META-INF文件夹?这不是JAR

launcher.properties - >启动器属性

start.sh - >从此批处理文件中启动Launcher.class。

start.bat /与JAR相比,这有什么好处?

基本上我想删除aQuteMETA-INFstart.*文件,并为二进制文件添加bin文件夹。

这应该可以用“Ant”,“Maven”或“Gridle”脚本来实现。但我可以创建一个没有BndTools支持的“BndTools项目”或“Gradle项目”。我安装了“BndTools Gradle插件”,但我找不到任何有关此主题的有用文档。

希望有人可以帮助我,或者指出我正确的方向。 问候。

1 个答案:

答案 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,您可以在任何系统上安装它。

因此,如果你想要别的东西,你将不得不创建自己的出口商......