Istnieje bardzo prosty sposób pisania aplikacji wiersza poleceń podczas korzystania z bnd. BND posiada funkcję tworzenia wykonywalny słoik z poleceniem pakiet:
$ 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
pamiętać, że ten słój jest kompletny, zawiera wszystkie pakiety, ramy, wyrzutni i właściwości, aby go uruchomić. Nie ma żadnych zewnętrznych zależności.
Sztuką jest uzyskanie głównego wątku (w którym wywoływana jest główna statyczna). Jedyne, co musisz zrobić, to zarejestrować usługę Runnable z właściwością main.thread=true
. Program uruchamiający wywoła funkcję run() w tej usłudze, a następnie zakończy działanie (możesz pozostać w biegu tak długo, jak chcesz).
Aby uzyskać argumenty wiersza poleceń, można uzyskać usługę Object za pomocą właściwości launcher.arguments
. Ta właściwość będzie zawierała twoje argumenty polecenia. Albo to zrobić ze składnikiem 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");
}
}
Najlepszym sposobem na to jest z bndtools ponieważ ułatwia przetestować/debugowania kodu. Najprawdopodobniej będziesz wtedy używał plików bndrun.
P.S. W najnowszym bnd możesz użyć parametru Callable <Integer> zamiast Runnable. Wartość zwracana jest następnie kodem zakończenia procesu. To może jednak nie być jeszcze obecne w bndtools.
To interesujący problem, jeszcze trudniejszy, jeśli chcesz pozwolić pakietom na korzystanie z opcji wiersza polecenia _discoverable_ (co było naszym przypadkiem użycia).Niestety, nasze ostateczne rozwiązanie było raczej ciężkie, a ja nie miałem czasu, aby go wypuścić do czegoś, co jeszcze inni mogliby wykorzystać ... –