Jaki jest najlepszy sposób dystrybucji aplikacji Java? [Zamknięte]

115

Java jest jednym z moich ulubionych języków programowania. Jednak zawsze napotykam problem z dystrybucją mojej aplikacji do użytkowników końcowych.

Udostępnienie użytkownikowi pliku JAR nie zawsze jest tak przyjazne dla użytkownika, jak bym chciał, a korzystanie z Java WebStart wymaga utrzymania serwera WWW.

Jaki jest najlepszy sposób dystrybucji aplikacji Java? Co się stanie, jeśli aplikacja Java musi zainstalować artefakty na komputerze użytkownika? Czy są dostępne dobre systemy instalacji / pakowania Java?

Laplie Anderson
źródło
Java WebStart może być używana z dowolnego adresu URL, takiego jak system plików, taki jak dysk CD lub dysk sieciowy. Przyznaję, że to nie daje ci tyle. Uwaga: eclipse nie używa instalatora, wystarczy go rozpakować i uruchomić. Być może nie potrzebujesz instalatora.
Peter Lawrey
1
W dzisiejszych czasach wdrożenie takiej aplikacji Java WebStart jest bardzo proste np. W Google Application Engine.
Thorbjørn Ravn Andersen
6
Szkoda, że ​​to pytanie jest zamknięte. Nie zgadzam się z uzasadnieniem określonym jako „głównie oparte na opinii”. Udzielone odpowiedzi nie są oparte na opinii, ale na doświadczeniu. Zawsze czekam na dobre odpowiedzi oparte na doświadczeniu. Ci, którzy nie mogą się czegoś nauczyć z historii, skazani są na jej powtórzenie.
bouvierr
Możesz użyć jlink (wprowadzonego z JDK 9) do dystrybucji aplikacji Java. Pochodzi z JDK. Stworzy dla Ciebie dedykowane środowisko JRE. Nie musisz mieć zainstalowanego oprogramowania Java na komputerach klienckich.
blueray

Odpowiedzi:

89

Istnieje wiele rozwiązań w zależności od wymagań dotyczących dystrybucji.

  1. Po prostu użyj słoika. Zakłada się, że użytkownik ma zainstalowaną poprawną wersję Java, w przeciwnym razie użytkownik otrzyma wyjątki „wersja formatu pliku klasy”. Jest to dobre w przypadku dystrybucji wewnętrznej w firmie.

  2. Użyj launch4j i instalatora, takiego jak NSIS. Daje to dużo większą kontrolę, chociaż użytkownik nadal może robić głupie rzeczy, takie jak odinstalowanie środowiska wykonawczego java. Jest to prawdopodobnie najpopularniejsze podejście i obecnie używam.

  3. Użyj Webstart. Zakłada się również, że użytkownik ma zainstalowaną poprawną wersję Java, ale znacznie łatwiej jest zacząć. Z mojego doświadczenia wynika, że ​​jest to dobre w ściśle kontrolowanych środowiskach intranetowych, ale staje się uciążliwe przy większych wdrożeniach, ponieważ ma wiele dziwnych awarii. Może być lepiej dzięki nowej technologii wtyczek w Javie 1.7.

  4. Użyj kompilatora kodu natywnego, takiego jak Excelsior JET i rozpowszechnij jako plik wykonywalny lub zapakuj go w instalator. Drogie i generalnie wiąże cię z nieco starszą wersją javy, a dynamiczne ładowanie klas jest trochę uciążliwe, ale jest bardzo skuteczne w przypadku wdrażania na dużą skalę, gdzie musisz zminimalizować problemy z obsługą.

Noel Grandin
źródło
4
Tylko uwaga na Webstart: jeśli użytkownik ma zainstalowaną wersję Javy, która nie pochodzi z epoki kamienia (np. 1.2), webstart może otrzymać polecenie pobrania i zainstalowania nowszej wersji Javy, której potrzebujesz dla swojego programu. jeszcze. Spójrz na składnię pliku .jnlp. Oczywiście nadal dość wyraźnie pokazuje, że używasz Javy, co może być nieodpowiednie w zależności od klientów, z którymi masz do czynienia. W takich przypadkach rzeczywiście powinieneś mieć jakiś „natywny” format instalatora / pliku i ukryć szczegóły implementacji tak bardzo, jak to możliwe.
Daniel Schneller
10
Nie lubię Webstart. Ma za dużo marki Java / Sun. Trudno sprawić, by działało dobrze. Konfiguracja podpisywania kodu jest bardziej kłopotliwa niż jest warta, a użytkownik i tak nie rozumie korzyści związanych z bezpieczeństwem i komunikatów. Jeśli chcesz zrobić cokolwiek w systemie użytkowników, będziesz musiał zapłacić za swój certyfikat do podpisywania kodu, aby pozbyć się przerażających ostrzeżeń. Wykonuje wiele skomplikowanych pamięci podręcznych, które mogą powodować problemy. Być może OSGi lub nadchodzące moduły Java zapewnią podobne korzyści z automatycznej aktualizacji. Używam wariantu # 2 i tworzę DMG / Packager dla mac, wszystko z Ant.
Cal
Użyłem NSIS, jak sugerowałeś. Przyjrzałem się także launch4j. Dlaczego zalecamy używanie obu?
jacknad
1
@JackN NSIS to generator instalatora. Launch4j ma na celu ułatwienie uruchamiania / uruchamiania programów Java. Ich funkcjonalność w pewnym stopniu się pokrywa, ale są one ukierunkowane na różne części problemu.
Noel Grandin
+1 świetna odpowiedź. Czy masz jakieś doświadczenie z Excelsior JET? Czy obsługuje tylko architekturę x86 i nie może załadować biblioteki jar w czasie rzeczywistym?
KJW
6

zaawansowany instalator ułatwia pakowanie aplikacji Java jako plików wykonywalnych systemu Windows i jest dość elastyczny w sposobie konfiguracji. Odkryłem, że jest to najłatwiejsza droga do dystrybucji aplikacji Java do klientów Windows.

rustyshelf
źródło
5

JSmooth to prosty program, który pobiera plik jar i pakuje go w standardowy plik wykonywalny systemu Windows. Jest dostarczany z prostym GUI, który pozwala skonfigurować wymaganą maszynę JVM, dołączyć ją do aplikacji lub udostępnić opcję jej pobrania, jeśli nie jest jeszcze zainstalowana. Możesz wysłać plik exe bez zmian lub spakować go z możliwymi zależnościami (lub pozwolić programowi pobrać dodatkowe zależności z sieci podczas uruchamiania). Jest również darmowy, jak w przypadku piwa i mowy, co może (ale nie musi) być dobrą rzeczą.

stian
źródło
4

To zależy od tego, jak wyrafinowani są Twoi docelowi użytkownicy. W większości przypadków chcesz je odizolować od faktu, że używasz aplikacji opartej na języku Java. Daj im natywny instalator, który robi właściwe rzeczy (tworzy pozycje menu startowego, programy uruchamiające, rejestruje się za pomocą dodawania / usuwania programów itp.) I już zawiera pakiet środowiska wykonawczego Java (więc użytkownik nie musi o tym wiedzieć ani o to dbać). Chciałbym zasugerować nasze wieloplatformowe narzędzie do instalacji, BitRock InstallBuilder. Chociaż nie jest oparty na języku Java, jest powszechnie używany do pakowania aplikacji Java. Można go łatwo zintegrować z Ant i możesz budować instalatory Windows z Unix / Linux / Mac i odwrotnie. Ponieważ generowane instalatory są natywne, nie wymagają kroku samorozpakowania ani obecności środowiska JRE w systemie docelowym, co oznacza mniejsze instalatory i pozwala zaoszczędzić trochę bólu głowy. Chciałbym również wspomnieć, że mamy wolne licencje na projekty open source

Daniel Lopez
źródło
3

Jeśli jest to aplikacja użytkownika końcowego z prawdziwym GUI, należy zignorować język, w którym napisałeś program (Java) i użyć natywnego instalatora dla każdej wybranej platformy. Użytkownicy komputerów Mac chcą mieć plik .dmg, a w systemie Windows instalator .msi lub .exe to najlepsza droga. W systemie Windows wolę NSIS od NullSoft tylko dlatego, że jest mniej kontrowersyjny niż InstallShield lub InstallAnywhere. Na OSX możesz liczyć na to, że JVM już tam jest. W systemie Windows musisz to sprawdzić i zainstalować, jeśli to konieczne. Użytkownicy Linuksa nie będą uruchamiać aplikacji Java GUI, a nieliczni, którzy będą wiedzieli, co zrobić z wykonywalnym plikiem .jar.

Ry4an Brase
źródło
3
naprawdę? ludzie z Linuksa nie będą uruchamiać aplikacji GUI? to chyba jego program jest dla nich bezużyteczny, przez co cała dyskusja jest dyskusyjna.
Matt,
@Matt, dlaczego zakładasz, że oryginalna aplikacja była aplikacją GUI? Zainstalowałem wiele aplikacji java wiersza poleceń w systemie Linux, a te, które pojawiają się jako .deb lub .rpms, są szczególnie cenione.
Ry4an Brase
1
Oryginalny tytuł mówił GUI. Ponadto, jeśli pojawił się webstart, to dobrze jest założyć, że jest to aplikacja z interfejsem GUI. Wreszcie stwierdzenie, że użytkownicy Linuksa nie używają aplikacji GUI, jest całkowicie nieprawdziwe.
Matt,
Nie powiedziałem, że ludzie Linuksa nie uruchamiają aplikacji GUI. Powiedziałem, że nie będą uruchamiać aplikacji „Java GUI”, a poza NetBeans i Eclipse (które omówiłem w części „kilka osób, które będą wiedzieć, co zrobić z wykonywalnym plikiem jar”) nie przychodzi mi do głowy ani jeden szeroko stosowany Aplikacje Java w systemie Linux (Open Office itp. Są w C ++ i używają Javy tylko dla wtyczek).
Ry4an Brase
słyszałeś kiedyś o SQLDeveloper? Lub którekolwiek z narzędzi do zarządzania Oracle? Wszystko zakodowane w Javie (chociaż sqldeveloper jest dołączane jako .exe, ale to Java)
Matt
3

Chociaż sam nie korzystałem z NSIS (Nullsoft Scriptable Installer System), istnieją skrypty instalacyjne, które sprawdzą, czy wymagane środowisko JRE jest zainstalowane w systemie docelowym.

Wiele przykładowych skryptów jest dostępnych na stronach z przykładami kodu i instalatorami w świecie rzeczywistym , takich jak:

(Pamiętaj, że w rzeczywistości nie użyłem żadnego ze skryptów, więc nie traktuj tego jako zachęty).

coobird
źródło
2

Potrzebowałem sposobu na spakowanie mojego projektu i jego zależności w jednym pliku jar.

Znalazłem to, czego potrzebowałem, używając wtyczki Maven2 Assembly : wtyczka Maven2 Assembly

Wydaje się, że powiela to funkcjonalność jednego słoika , ale nie wymaga dodatkowej konfiguracji, aby go uruchomić.

David Carlson
źródło
1

W przypadku prostych aplikacji Java lubię używać Jar's. Dystrybucja jednego pliku, który użytkownik może po prostu kliknąć (Windows) lub

java -jar jarname.jar

IMHO, słoik to najlepszy wybór, gdy prostota jest głównym wymaganiem.

jjnguy
źródło
Wypróbuj to na początkujących, a przekonasz się, że nie będzie to działać dobrze.
rhody
1

Tworzę aplikacje eclipse RCP. Zwykle do uruchomienia aplikacji zaćmienia jest dołączony wykonywalny program uruchamiający. Umieszczam maszynę wirtualną java w folderze aplikacji w podkatalogu / jre, aby upewnić się, że zostanie użyta odpowiednia wersja Java.

Następnie pakujemy z Inno Setup do instalacji na komputerze użytkownika.

Mario Ortegón
źródło
1

Jaki jest najlepszy sposób dystrybucji aplikacji Java? Co się stanie, jeśli aplikacja Java musi zainstalować artefakty na komputerze użytkownika? Czy są dostępne dobre systemy instalacji / pakowania Java?

Z mojego doświadczenia (z oceny wielu opcji ) wynika , że install4j jest dobrym rozwiązaniem. Tworzy natywne instalatory dla dowolnej platformy i jest specjalnie przystosowany do instalowania aplikacji Java. Aby uzyskać szczegółowe informacje, zobacz „ Funkcje ” w jej witrynie internetowej.

Jednak install4j jest narzędziem komercyjnym. Zwłaszcza jeśli Twoje potrzeby są stosunkowo proste (wystarczy rozprowadzić aplikację i zainstalować jakieś artefakty), istnieje wiele innych dobrych opcji, w tym darmowe (jak izPack lub wspomniany już Lauch4j ). Ale prosiłeś o najlepsze sposób i, o ile wiem, install4j jest tym, szczególnie do dystrybucji większych lub bardziej skomplikowanych aplikacji Java (EE).

Jonik
źródło
Czy wiesz, jak zmusić go do uruchomienia JVM 5.0 w systemie Mac OS? W systemie Windows po prostu pakujesz środowisko JRE, ale na komputerze Mac jest możliwe, że mają skonfigurowaną inną domyślną maszynę JVM. Więc nie jestem pewien, jak wyraźnie zmusić go do używania konkretnej wersji JVM, którą chcesz ...
Stephane Grenier,
@Stephane, właściwie nie stworzyłem instalatorów OS X przy użyciu install4j, ale myślę, że nie powinno to stanowić problemu, biorąc pod uwagę elastyczne opcje łączenia / wykrywania JRE, które ma. Aby uzyskać więcej informacji na ich temat, sprawdź linki w tej odpowiedzi: stackoverflow.com/questions/995881/…
Jonik,
Ponieważ Mac obsługuje tworzenie pakietów aplikacji Java, możesz po prostu określić JRE w info.plist w ten sposób ... <key> JVMVersion </key> <string> 1.5+ </string> Możesz usunąć plus, aby wymagać określonej wersji . Tak to robię, ale nie używam install4j. W sieci jest kilka stron wyjaśniających tworzenie paczek aplikacji dla komputerów Mac. Polecam również przyjrzeć się, jak robią to limewire lub vuze (aplikacje java). Możesz także przyjrzeć się skryptom kompilacji, których używają do tworzenia pakietów aplikacji i plików dmg, ponieważ są one open source!
Cal
0

Najlepsza odpowiedź zależy od platformy. W przypadku wdrażania w systemie Windows osiągnąłem dobre wyniki przy użyciu kombinacji one-jar i launch4j . Prawidłowe skonfigurowanie środowiska kompilacji zajęło trochę czasu (głównie skrypty Ant), ale teraz jest to dość bezbolesne.

Qualidafial
źródło
0

Cóż, z mojego punktu widzenia lepszy mechanizm dystrybucji polega na użyciu czegoś w rodzaju technologii ClickOnce lub WebStart . Po prostu wdrażasz wersję na serwerze i jest ona automatycznie przekazywana klientom po wydaniu wersji. Również platforma Eclipse RCP zawiera UpdateManager, który robi to, co robi WebStart, ale także znacznie więcej.

Ponieważ używam Maven2 do budowania, wdrożenie jest tylko bułką z masłem: skopiuj zbudowany jar do lokalizacji na serwerze, zaktualizuj plik jnlp w razie potrzeby i gotowe.

Petr Macek
źródło
0

installanywhere jest dobry, ale drogi - nie znalazłem (jako) dobrego darmowego

Tomek
źródło
Zobacz to, aby zapoznać się z alternatywami InstallAnywhere, w tym niektórymi bezpłatnymi (a także komercyjnymi, które są znacznie bardziej przystępne cenowo): stackoverflow.com/questions/759855/…
Jonik
-2

Spakowałbym plik jar wraz z innymi zależnymi plikami JAR, plikami konfiguracyjnymi i dokumentacją wraz z plikiem run.bat / run.sh. Użytkownik końcowy powinien mieć możliwość rozpakowania go do dowolnej lokalizacji i edycji pliku run.bat w razie potrzeby (w większości przypadków powinien działać bez edycji). Instalator może być przydatny, jeśli chcesz tworzyć wpisy w menu Start, na pulpicie, w zasobniku systemowym itp.

Jako użytkownik wolę rozpakować i uruchomić rodzaj instalacji (bez wpisów w menu startowym). Jednak osoby spoza branży IT mogą mieć różne preferencje. Więc jeśli aplikacja jest w dużej mierze przeznaczona dla programistów zip-run.bat route i aplikacje dla ogółu społeczeństwa mogą być instalowane za pomocą instalatora.

Rejeev Divakaran
źródło
To nigdy nie zadziała dla początkujących.
rhody