Modyfikowanie pliku wewnątrz jar

87

Chciałbym zmodyfikować plik w moim słoiku. Czy można to zrobić bez wyodrębniania i ponownego usuwania plików z poziomu mojej aplikacji?

Pliki, które chcę zmodyfikować, to pliki konfiguracyjne, głównie w formacie XML.

Powodem, dla którego interesuje mnie, aby nie usuwać zakłóceń, jest to, że aplikacja jest opakowana w launch4j, jeśli ją rozpakuję, nie mogę ponownie utworzyć pliku .exe.

Hamza Yerlikaya
źródło
1
Chciałbym zachować dodatkowe pliki w aplikacji bez tworzenia plików tymczasowych w systemie plików.
Hamza Yerlikaya
Wypróbuj to rozwiązanie stackoverflow.com/a/4837522/1853864, którego użyłem i moje problemy zostały rozwiązane.
A. Magalhães
Czy mógłbyś cofnąć zaakceptowaną odpowiedź? Ma negatywny wynik i absolutnie nie jest pomocny
Dici

Odpowiedzi:

83

Możesz użyć uopcji dlajar

Z samouczków Java:

jar uf jar-file input-file(s)

„Wszystkie pliki znajdujące się już w archiwum i mające taką samą ścieżkę jak dodawany plik zostaną nadpisane”.

Zobacz Aktualizowanie pliku JAR .

O wiele lepsze niż ponowne zrobienie całego słoika. Wywołanie tego z poziomu programu również wydaje się możliwe. Spróbuj uruchomić wiersz poleceń w Javie

trzepaczka
źródło
Niesamowite! Ale dodali, że ścieżki są zabawne. IE Bitbucket.foo.bar zamiast com.etc.etc ma istniejący
StarWind0
26

Możesz użyć Vima:

vim my.jar

Vim jest w stanie edytować skompresowane pliki tekstowe, pod warunkiem, że masz je unzipw swoim środowisku.

Jose Alban
źródło
3
To jest świetne. Przejdź do szukanego pliku i naciśnij Enter. Edytuj plik, a następnie wpisz: wq, aby zapisać!
Michael Butler
Potrzebujesz również zipw swoim środowisku, aby móc zapisać zmiany. Dziękuję za odpowiedź!
troig
11

Pliki jar Java mają ten sam format, co pliki zip - więc jeśli masz narzędzie do plików zip, które pozwala modyfikować archiwum, masz nogę w drzwiach. Drugi problem polega na tym, że jeśli chcesz ponownie skompilować klasę lub coś w tym stylu, prawdopodobnie będziesz musiał po prostu ponownie zbudować jar; ale plik tekstowy czy coś (na przykład xml) powinno być łatwo modyfikowane.

JustJeff
źródło
8

Jak wiele osób powiedziało, nie można zmienić pliku w JAR bez ponownego jego przeanalizowania. Jeszcze gorzej jest z Launch4J, musisz odbudować EXE po zmianie JAR. Więc nie idź tą drogą.

Generalnie złym pomysłem jest umieszczanie plików konfiguracyjnych w JAR. Oto moja sugestia. Wyszukaj plik konfiguracyjny w niektórych z góry określonych lokalizacjach (takich jak katalog domowy, \ Program Files \ itp.). Jeśli znajdziesz plik konfiguracyjny, użyj go. W przeciwnym razie użyj tego w pliku JAR jako rezerwy. Jeśli to zrobisz, wystarczy zapisać plik konfiguracyjny we wcześniej ustalonej lokalizacji, a program go pobierze.

Inną zaletą tego podejścia jest to, że zmodyfikowany plik konfiguracyjny nie zostanie nadpisany po uaktualnieniu oprogramowania.

ZZ Coder
źródło
2

Może to wymagać więcej pracy, niż zamierzasz zajmować się w krótkim okresie, ale podejrzewam, że w dłuższej perspektywie byłoby bardzo korzystne, gdybyś przyjrzał się użyciu Ant (lub Maven , a nawet Bazela ) zamiast ręcznie budować słoiki . W ten sposób możesz po prostu kliknąć plik mrówka (jeśli używasz Eclipse) i odbudować jar.

Alternatywnie, możesz chcieć w ogóle nie mieć tych plików konfiguracyjnych w pliku jar - jeśli spodziewasz się konieczności regularnej wymiany tych plików lub jeśli ma być dystrybuowany do wielu stron, plik konfiguracyjny nie powinien być częścią słoik w ogóle.

dimo414
źródło
2
Zgoda. Możesz jednak chcieć umieścić „domyślny” plik konfiguracyjny w pliku JAR, więc jeśli coś stanie się z plikiem zewnętrznym (uszkodzony, usunięty itp.), Możesz przywrócić domyślną konfigurację.
Thomas Owens
To prawda - chociaż nie wiem, ile aplikacji działałoby dalej bez ich plików konfiguracyjnych ...
dimo414
1

Aby rozwinąć to, co powiedział dfa, powodem jest to, że plik jar jest skonfigurowany jako plik zip. Jeśli chcesz zmodyfikować plik, musisz odczytać wszystkie wpisy, zmodyfikować ten, który chcesz zmienić, a następnie zapisać wpisy z powrotem do pliku jar. Musiałem to zrobić wcześniej i to był jedyny sposób, w jaki mogłem to zrobić.

EDYTOWAĆ

Zwróć uwagę, że jest to użycie wewnętrznych edytorów plików jar Java, które są strumieniami plików. Jestem pewien, że jest na to sposób, możesz wczytać cały słoik do pamięci, zmodyfikować wszystko, a następnie zapisać z powrotem do strumienia plików. Uważam, że to właśnie robią narzędzia takie jak 7-Zip i inne, ponieważ uważam, że ToC nagłówka zip musi być zdefiniowane w czasie pisania. Jednak mogę się mylić.

aperkins
źródło
1

Tak, możesz, używając SQLite możesz czytać lub zapisywać w bazie danych z pliku jar, więc nie będziesz musiał go rozpakowywać, a następnie ponownie jarać, śledź mój post http://shoaibinamdar.in/blog/? p = 313

używając składni "jdbc: sqlite :: resource:" możesz czytać i zapisywać w bazie danych z poziomu pliku jar

shoaib
źródło
1
Cześć, witamy w stackoverflow. Usunąłem skróty z Twojego postu. Ogólnie rzecz biorąc, skrót stylów wiadomości tekstowych nie jest tutaj odpowiedni. Myślę, że ta odpowiedź byłaby dobrą odpowiedzią na pytanie, gdybyś zawarł więcej szczegółów ze swojego bloga w samej odpowiedzi, aby ktoś czytający Twoją odpowiedź nauczył się czegoś, nawet jeśli nie czytał bloga lub został przeniesiony pod inny adres URL w przyszłości.
Flexo
1

Sprawdź TrueZip .

Robi dokładnie to, co chcesz (edytuje pliki bezpośrednio w pliku jar) za pośrednictwem interfejsu API wirtualnego systemu plików. Obsługuje również zagnieżdżone archiwa (jar wewnątrz słoika).

Zielony gigant
źródło
1

Wyodrębnij plik jar dla ex. z winrar i użyj CAVAJ:

Cavaj Java Decompiler to graficzne darmowe narzędzie, które rekonstruuje kod źródłowy Java z plików CLASS.

tutaj jest samouczek wideo, jeśli potrzebujesz: https://www.youtube.com/watch?v=ByLUeem7680

Tomasz Mularczyk
źródło
cóż, odpowiedzią jest tutaj oprogramowanie „Użyj CAVAJ”. Link jest tylko dodatkiem, jeśli potrzebne jest dodatkowe wyjaśnienie.
Tomasz Mularczyk
0

Dopóki ten plik nie jest .class, tj. Plikiem zasobów lub plikiem manifestu - możesz.

Sorantis
źródło
i jak bez wyciągania i ponownego uderzania?
user85421,
0

Najprostszym sposobem, w jaki udało mi się to zrobić w systemie Windows, jest WinRAR :

  1. Kliknij plik prawym przyciskiem myszy i wybierz „Otwórz za pomocą WinRAR” z menu kontekstowego.
  2. Przejdź do pliku, który chcesz edytować i kliknij go dwukrotnie, aby otworzyć go w domyślnym edytorze.
  3. Po wprowadzeniu zmian zapisz i wyjdź z edytora.
  4. Pojawi się wówczas okno dialogowe z pytaniem, czy chcesz zaktualizować plik w archiwum - wybierz „Tak”, a JAR zostanie zaktualizowany.
Steve Chambers
źródło
0

większość powyższych odpowiedzi mówi, że nie możesz tego zrobić dla pliku klasy.

Nawet jeśli chcesz zaktualizować plik klasy, możesz to również zrobić. Wszystko, co musisz zrobić, to przeciągnąć i upuścić plik klasy z obszaru roboczego do słoika.

Jeśli chcesz zweryfikować zmiany w pliku klasy, możesz to zrobić za pomocą dekompilatora, takiego jak jd-gui.

Subham Sood
źródło