Существует очень простой способ написания приложений командной строки при использовании bnd. У bnd есть функция для создания исполняемого jar-файла с помощью команды package:
$ 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-файл завершен, он содержит ВСЕ пакеты, фреймворк, средство запуска и свойства для его запуска. Внешних зависимостей нет.
Хитрость заключается в том, чтобы получить основной поток (где вызывается static main). Единственное, что вам нужно сделать, это зарегистрировать службу Runnable со свойством main.thread=true
. Затем программа запуска вызовет run() для этой службы и затем выйдет (вы можете оставаться в работе столько, сколько хотите).
Чтобы получить аргументы командной строки, вы можете получить службу Object со свойством 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.
P.S. В последнем bnd вы можете использовать Callable‹Integer› вместо Runnable. Возвращаемое значение является кодом выхода процесса. Однако этого может еще не быть в bndtools.
person
Peter Kriens
schedule
19.07.2013