Tworzenie pliku jar

Cześć! Już mam dość tej Javy :confused: No ale o co chodzi. Mam kod swojego programu, który jest rozłożony na 3 klasy i 1 plik txt z którego pobierane są dane (nie ma opcji wyrzucenia pliku txt, jest ponad 40’000 linijek). Kwestia jest taka, by skompilować ten program w ten sposób, by dało się go uruchomić z pliku jar przez osobę nie mająca jre. Ważne, aby dało się ten plik txt w tym zagnieździć. Może ktoś ma jakiś dobry i niezbyt skomplikowany sposób. To co udało mi się zrobić to plik jre nie uwzględniający txt, ale jednak nie da rady go uruchomić dwuklikiem, tak aby uruchamiał konsolę czy coś. Przy tym zrobiłem tyle syfu w folderze z programem, że się złapałem za głowę co to za bałagan… Wróciłem do punktu wyjścia, czyli sam kod i plik txt. Ktoś mógłby podratować? Ps. Korzystam z Intellij IDEA

Nie wiem co robiłeś i nie działa więc zacznij od tego:

https://help.eclipse.org/oxygen/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Ftasks%2Ftasks-37.htm

Ogólnie to osoba u której ma się uruchomić program musi mieć zainstalowane JRE i tego nie da się obejść - taka “zaleta” javy. Dzięki temu jest ona “łatwo” “przenośna” między systemami.

Uzupełnię jeszcze trochę powyższą odpowiedź. Technicznie nie jest możliwym uruchomić Javę (bytecode) bez JRE. Mówimy tu o standardzie tego, jak została zaprojektowana. Nie mniej należy pamiętać, że język programowania, to tylko kontrakt między programistą a twórcą kompilatora. Stąd istnieją projekty nieprzewidziane przez standard, które pozwalają między innymi na kompilację plików z kodem Java do postaci binarnej, np. GCJ (https://pl.wikipedia.org/wiki/GNU_Compiler_for_Java). Tylko w takim przypadku należy się liczyć z utratą przenośności pliku wykonywalnego i koniecznością dostarczenia takiego pliku dla każdej tzw. “Target Triplet” (https://wiki.osdev.org/Target_Triplet). Generalnie jest to raczej PoC z mojego punktu widzenia, bo nigdy nie widziałem, żeby ktoś tego używał.

Druga opcja spotykana to osadzenie JRE w paczce instalacyjnej, a następnie odwoływanie się ze skryptów wrapujących relatywnie do tej lokalnej wersji. Tutaj może pomóc (przynajmniej dla Windows): http://launch4j.sourceforge.net/. Ta technika ma szereg minusów, jak rzadko aktualizowana Java (Security) oraz również potrzeba dołączenia JRE per “Target Triplet”, ponieważ JVM zawiera bardzo dużo kodu natywnego.

Podsumowując pierwszą część, nic dziwnego, że masz już dość Javy, skoro próbujesz cały czas walczyć z systemem. Nie bez powodu nie znajdziesz “użytkowych” (dla przeciętnego Kowalskiego) aplikacji napisanych w Java. Będzie to albo server, gdzie SysOp ogarnia temat, albo aplikacja o szczególnym zastosowaniu typu IDE, gdzie programista ma te kilka szarych komórek. Zakładam, że to będzie paczka na Windows, więc najsensowniej zrobić jakiś installer, który jako krok pobierze Javę przy użyciu wcześniej wspomnianego launch4j + jakieś InnoSetup: https://www.youtube.com/watch?v=XITTQGD8V1s

Jeżeli chodzi o odczytanie pliku z JAR. Pakujesz plik do JAR czymkolwiek, czego tam używasz (Ant, Maven, Gradle, ręcznie) w procesie budowania. Następnie możesz go odczytać odwołując się do classpath: https://stackoverflow.com/a/1464366 Ważne, że można odczytać go wtedy tylko jako strumień (nie plik), bo fizycznie nie jest on na FS, tylko wewnątrz archiwum ZIP.

Przepraszam, wprowadziłem was w błąd! Chyba ta godzina wtedy na mnie źle działała. Chodzi mi o jde, a nie jre. Chociaż jak teraz nad tym myślę… Żeby wywołać komendę java z konsoli chyba wystarczyło same jre, o ile dobrze pamiętam. Już patrzę powyższy film, popróbuję i podzielę się spostrzeżeniami.

Edit 7:47
A więc, wkleję to też dla potomnych, gdyby ktoś miał taki sam problem jak ja. Nie da rady bezpośrednio wywołać pliku JAR w konsoli przez dwuklik, możliwość ta istnieje dla plików, które posiadają GUI, wtedy możemy poprawnie uruchamiać aplikację “dwuklikiem”, bez wcześniejszego otwierania wiersza poleceń. Źródło informacji: https://stackoverflow.com/questions/4497579/making-a-jar-file-for-console

Okej, a więc korzystając z następujących źródeł:


Wykorzystałem tę wiedzę w ten sposób, że zmodyfikowałem swój kod, tak abym mógł uzyskać dostęp do pliku txt z pliku jar. Następnie wyżej podanym sposobem (zmieniając ścieżkę pliku MANIFEST) udało mi się wygenerować działający plik jar. Pośredni sukces końcowy, polegający na uruchamianiu pliku poprzez dwuklik osiągnąłem poprzez stworzenie pliku bat z komendą uruchamiającą mój kod. Tak oto wszystkie problemy zostały rozwiązane.