System pluginów w aplikacji

0

Cześć,
Myślę nad rozwiązaniem zadania - jak rozwiązać możliwość dodawania własnych pluginów w aplikacji Javowej.

Chcę zrobić podobnie jak w Jenkinsie, ale nie chce mi się szukać w kodzie - zrobię to dopiero, jak nie znajdę rozwiązania w ten weekend :)

Jak chciałem to zrobić?

  1. Wpisujemy do JSONa konfiguracyjnego nazwę pluginu i jego wersję z rejestru, który jest dostępny analogicznie jak Docker registry, albo Maven Repository.
  2. Następnie mój zapięty listener na ten plik wykrywa zmianę -> waliduje -> jeśli wersja istnieje to ją sobie dociąga z mojego FTPa.
  3. No i tutaj zaczyna się problem. Mam pobrany pakiet nieskompilowanych plików .java ewentualnie .groovy albo .kt .
    W moich klasach pluginu, chcę np. rozszerzyć interfejs SecurityProvider.
  4. Moja aplikacja pobrała sobie zatem paczkę plików i muszę ją jakoś zmusić, żeby się sama w miejscu przekompilowała i wciągnęła w jara nowe pliki.

Jakieś pomysły? Intellij też to ma fajnie rozwiązane, wystarczy dodać kilka linijek xmla i klasę javowoą.

1

Możesz użyć modułów z Javy 9 + SPI, robić oddzielny Layer dla każdego modułu (czyli classloader de facto) - może być dużo roboty.
Możesz tez użyć OSGI, ale jest dość ciężkie w obyciu :)

0

Znalazłem i wypróbowałem takie podejście: https://stackoverflow.com/questions/21544446/how-do-you-dynamically-compile-and-load-external-java-classes
Ale niestety coś mi kompilator nie widzi tego mojego interfejsu, który chcę rozszerzać.

0

OSGi to framework wspierający bundle i ich podmianę w trakcie runtime'u aplikacji, ale jesli w Twoim przypadku korzystasz np. ze Spring Framework, to będą kłopoty. Tak słyszałem. Na własnej skórze nie było dane mi to przetestować.

1

Kompletnie nie rozumiem dlaczego ma to zaciągac "nieskompilowane" pliki - przecież to dużo dodatkowej pracy i problemów. Na jvm standardem są pluginy jako jar/skompilowane class.

0

@jarekr000000: bo nie wiem jak osiągnąć taki rezultat:
Skompilowany jar byłby jak najbardziej w porządku. Ale jak ma skompilować swój plugin jakiś inny niż ja deweloper?
Tzn:

  1. Aplikacja w celu zapewnienia mechanizmu autentykacji i autoryzacji używa interfejsu SecurityProvider.
    Mam w aplikacji 'wbudowane' podstawowe implementacje tego interfejsu jak:
  • BasicAuthSecurityProvider
  • OAuthSecurityProvider
  1. Jakiś deweloper się zirytował, że nie może podpiąć LDAPa do mojej aplikacji. Zdecydował się napisać plugin.
    I jak ma to zrobić?
    Bo ja to rozumiem tak, że musi sobie jako zależność jakoś dodać mój interfejs SecurityProvider, napisać jego implementację, a następnie skompilować kod do jara i wrzucić na moje repo.

Byłbym wdzięczny za jakieś ogólne, koncepcyjne wyjaśnienie.

Znalazłem taką bibliotekę https://github.com/pf4j/pf4j
przetestuję ją, aczkolwiek chętnie nauczył bym się coś głębiej o classloaderze, kompilatorze etc.

5

Musisz wydzielić te klasy, które sa potrzebne przy budowaniu pluginów (kompilacji) do osobnego jara (plugins.jar,api.jar lub coś w tym stylu).
Potem pluginy powinny byc kompilowane z tym jarem.
Reszta twojego kodu również. (z tym, że na koniec, podczas uruchomienia poiwnienec miec juz tylko jedną instancję jar (razem z twoim kodem).

0

@jarekr000000: a widzisz, to na sens, nie wpadłem na to. Dziękuję za pomoc.
Wczoraj próbowałem konfigurować build.gradle żeby możliwe było circle dependency, ale nic z tego :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1