使用 bnd 时,有一种非常简单的方法可以编写命令行应用程序。bnd 具有使用 package 命令创建可执行 jar 的功能:
$ bnd run xyz.bnd
.... whatever your app does
$ bnd package xyz.bnd
$ ls
xyz.jar xyz.bnd .....
$ java -jar xyz.jar ...
.... whatever your app does
请注意,这个 jar 是完整的,它包含所有包、框架、启动器和运行它的属性。没有外部依赖。
诀窍是获取主线程(调用静态 main 的地方)。您唯一需要做的就是使用属性注册 Runnable 服务main.thread=true
。然后,启动器将在该服务上调用 run() 并退出(您可以根据需要一直保持运行状态)。
要获取命令行参数,您可以使用launcher.arguments
属性获取对象服务。此属性将包含您的命令参数。或者使用 DS 组件执行此操作:
@Component(immediate=true, property="main.thread=true")
public class Main implements Runnable {
String[] args;
public void run(){ ... }
@Reference(target="(launcher.arguments=*)")
void setArgs(Object service, Map<String,Object> props) {
this.args = (String[]) props.get("launcher.arguments");
}
}
最好的方法是使用 bndtools,因为它使测试/调试代码变得容易。然后你可能想使用 bndrun 文件。
PS 在最新的 bnd 中,您可以使用 Callable<Integer> 而不是 Runnable。然后返回值是进程的退出代码。但是,这可能还没有出现在 bndtools 中。