Pewnie trzeba połączenia z jakimś serwerem. Ale jak to wygląda?
Desktopowe programy w Javie to rzadkość. Jednak jeśli chcesz dystrybuować Javowe programy, które się automatycznie aktualizują to jedną z opcji jest standard Java Web Start i pliki JNLP: https://docs.oracle.com/javase/tutorial/deployment/webstart/index.html
Z tego co wiem java umożliwia rzutowanie i wykonywanie swojego bajtkodu, a nawet kompilowanie w locie, czyli możesz go sobie odebrać z serwera, nadpisać odpowiednie binarki lub od razu rzutować na obiekt i odpalić.
JavaCompiler takie coś umożliwia, ale jak chcesz uaktualiać wcześniej inny plik, to w main musisz zbudować funkcję, która odpala main2 jakby.
Ale wcześniej weryfikuje czy main2 jest aktualny jak nie jest, to ściąga go, napisuje, kompiluje ewentualnie i odpala jakby to było normalnie.
My korzystamy np. z mavena / aethera do auto-update. Przy starcie za pomocą aethera sprawdzamy w repo mavena czy są dostępne nowsze wersje komponentów i jeśli user chce to ściągamy je z naszego nexusa.
Najlepiej wykorzystać chyba do tego narzedzia, które do tego służą - czyli do pobierania zależności i budowania aplikacji -> Maven albo Gradle.
pojawia się nowa wersja jakis git pull i gradle build. Można to oskryptować soibe po prostu i tyle. W Linux taki problem odchodzi i nie trzeba pisać mechanizmu automatycznych aktualizacji ,bo takie narzędzie leży w kwestii systemu operacyjnego a nie każda aplikacja sama sobie bez żadnej unifikacji.
w GNU Linux jest prosto i wystarczy wrzucić pakiet do repo / AUR / whatever i ludzie se wezmą nową wersję.