2013-07-31 18 views
5

Biorąc pod uwagę, że opracowuję program użytkownika końcowego (jako uberjar), zastanawiam się, jakie mam opcje, aby umożliwić użytkownikowi pobranie wtyczki i załadowanie jej podczas uruchamiania .Architektura wtyczek do załadowania w środowisku wykonawczym

Wtyczki powinny być skompilowane i bez kodu źródłowego, więc coś. podobnie jak load nie jest opcją. Jakie istniejące biblioteki (lub sposoby Java ...?) Istnieją, aby to zbudować?

EDYCJA: Jeśli nie jesteś pewien, czy byłbym również zadowolony ze sposobu, który kosztuje ponowne uruchomienie/-start programu głównego. Ważne jest jednak to, że kod źródłowy nie będzie zawarty w żadnym pliku JAR (ani głównej aplikacji, ani wtyczek-jarów, patrz: omit-source of Leiningen documentation).

Odpowiedz

1

Nie próbowałem tego sam, ale teoretycznie powinieneś uzyskać OSGi do pracy z Clojure.

Jest/integracja OSGi biblioteka Clojure tutaj:

+0

Wygląda na to, że OSGi to metoda Java. Giteub repo jest naprawdę słabo udokumentowane i wydaje się być wysoce hackowe ze spojrzenia na kod źródłowy. Jeśli nie ma nic porównywalnego, prawdopodobnie sam napiszę wrapper dla OSGi. –

1

Gdybym miał próbować rola moje własne rozwiązanie, chciałbym spróbować użyć tools.namespace do wkładania i wyjmowania wtyczek. Nie jestem do końca pewien, czy to zadziała, ale na pewno jest we właściwym kierunku. Myślę, że kluczowym elementem jest to, że słoje wtyczek będą musiały zostać "zainstalowane" w miejscu, które jest już w ścieżce klas.

Ponownie, jest to tylko początek jednego możliwego rozwiązania. Nie próbowałem tego robić.

+0

Czy jesteś pewien, czy tool.namespace.find działa, gdy kodu źródłowego nie ma w plikach JAR? –

+0

Nie próbowałem, ale README stwierdza, że ​​tools.namespace.find zawiera "narzędzia do wyszukiwania przestrzeni nazw Clojure w systemie plików, w katalogach lub plikach JAR. W połączeniu z java.classpath może wyszukiwać obszary nazw w ścieżce klas Java." – Jeremy

+0

Niestety nie można znaleźć żadnych przestrzeni nazw w plikach JAR bez źródła :( –

4

Aby dodać słoik w czasie wykonywania, należy użyć pomegranate, który umożliwia dodanie pliku .jar do ścieżki klasy. Wtyczki z oprogramowaniem powinny być regularne Clojure libs, które następują pewne konwencje, które są potrzebne do ustalenia:

  1. Dodać do nich dostarczyć (na przykład w sposób edn) symbol do obiektu wdrożenie mechanizmu konstruktor/destructor takich jak Lifecycle protokół w bibliotece Stuart Sierras component. W środowisku wykonawczym: require i resolve ten symbol, start powstały obiekt i przekazuj go, aby spocząć na swoich programach.

  2. Udostępnić publiczny interfejs API w swoim programie, który umożliwia wtyczkom współdziałanie z nim w sposób koordynowany asynchronicznie. sol. z clojure.core.async (nie pozwól jednej wtyczce zablokować całego programu).

  3. Upewnij się, że wtyczki mają skoordynowany sposób, aby ujawnić swoją funkcjonalność tylko wtedy, gdy chcą, aby umożliwić wysoki poziom modułowości wtyczek. Upewnij się, że twój program ładujący wtyczki jest w stanie wykryć zależności między wtyczkami i może je ładować i rozładowywać w odpowiedniej kolejności.

Powiązane problemy