2009-08-03 14 views
57

Chciałbym zmodyfikować plik wewnątrz mojego słoika. Czy da się to zrobić bez wydobywania i powtarzania, z mojej aplikacji?Modyfikowanie pliku wewnątrz słoika

Plik, który chcę zmodyfikować, to pliki konfiguracyjne, głównie oparte na XML.

Powodem Jestem zainteresowany nie un wstrząsów jest to, że aplikacja jest opatrywana launch4j gdybym unjar go nie mogę ponownie utworzyć plik .exe.

+0

Dlaczego chcesz to zrobić? –

+0

Chciałbym zachować pliki dodatkowe w aplikacji bez tworzenia plików tymczasowych w systemie plików. –

+0

Wypróbuj to rozwiązanie http://stackoverflow.com/a/4837522/1853864 Użyłem i moje problemy zostały rozwiązane. –

Odpowiedz

61

Można użyć opcji u dla jar

od samouczków Java:

jar uf jar-file input-file(s) 

„już żadnych plików w archiwum o tej samej ścieżki jako plik dodawanych zostaną nadpisane.”

Zobacz Updating a JAR File.

Znacznie lepiej niż cały słoik na nowo. Wywołanie tego z poziomu twojego programu również jest możliwe. Wypróbuj Running Command Line in Java

+0

Awesome! Ale dodali ścieżki zabawne. IE Bitbucket.foo.bar zamiast com.etc.etc, a istniejące ma już – StarWind0

0

Dopóki ten plik nie jest .class, tzn. Plik zasobów lub plik manifestu - można.

+0

i jak, bez wyodrębniania i ponownego drżenia? –

9

pliki jar Java są takie same jak pliki w formacie zip - więc jeśli masz narzędzia do pliku zip, które pozwoli Ci zmodyfikować archiwum, masz nogę w drzwiach. Drugi problem polega na tym, że jeśli chcesz przekompilować klasę lub coś takiego, prawdopodobnie będziesz musiał ponownie zbudować słoik; ale plik tekstowy lub coś (na przykład xml) powinno być z łatwością modyfikowane.

1

Aby rozwinąć to, co powiedział dfa, powodem jest to, że plik jar jest skonfigurowany jak 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 tylko w ten sposób mogłem to zrobić.

EDIT

pamiętać, że jest za pomocą wewnętrznego Java edytory plików jar, które są strumienie plików. Jestem pewien, że jest sposób, aby to zrobić, możesz przeczytać cały słoik w pamięci, zmodyfikować wszystko, a następnie napisać z powrotem do strumienia plików. Tak właśnie wierzę w narzędzia takie jak 7-Zip i inne, ponieważ uważam, że ToC nagłówka zip musi być zdefiniowane w czasie zapisu. Jednak mogę się mylić.

2

To może być więcej pracy niż szukasz do czynienia w krótkim okresie, ale podejrzewam, że na dłuższą metę byłoby to bardzo korzystne, aby zajrzeć do korzystania Ant (lub Maven lub nawet Bazel) zamiast ręcznego budowania słoika. W ten sposób możesz po prostu kliknąć plik ant (jeśli używasz Eclipse) i odbudować słoik.

Alternatywnie możesz nie chcieć w ogóle mieć tych plików konfiguracyjnych w słoiku - jeśli spodziewasz się, że będziesz musiał regularnie je wymieniać lub jeśli ma być dystrybuowany do wielu stron, plik konfiguracyjny powinien być w ogóle nie być częścią słoika.

+2

Uzgodnione. Możesz jednak umieścić w pliku JAR "domyślny" plik konfiguracyjny, więc jeśli coś się stanie z plikiem zewnętrznym (uszkodzony, usunięty itp.), Możesz przywrócić domyślną konfigurację. –

+0

Prawda - chociaż nie wiem, ile aplikacji będzie nadal działać bez plików konfiguracyjnych ... – dimo414

7

Jak już powiedzieliśmy, nie można zmienić pliku w pliku JAR bez przeszukiwania pliku JAR. Gorzej z Launch4J, musisz odbudować EXE po zmianie JAR. Więc nie idź tą drogą.

Zwykle źle jest umieścić pliki konfiguracyjne w pliku JAR. Oto moja sugestia. Wyszukaj plik konfiguracyjny w niektórych ustalonych lokalizacjach (np. Katalog domowy, \ Program Files \ itd). Jeśli znajdziesz plik konfiguracyjny, użyj go. W przeciwnym razie użyj tego w JAR jako zastępczego. 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 nadpisywane po uaktualnieniu oprogramowania.

1

Tak można, przy użyciu SQLite można odczytać ani zapisać do bazy danych z pliku jar, dzięki czemu nie będzie musiał rozpakować, a następnie ponownie słoik to, wykonaj mój post http://shoaibinamdar.in/blog/?p=313

pomocą Składnia "jdbc: sqlite :: resource:" można odczytać i zapisać w bazie danych z poziomu pliku JAR

+1

Witam, witam w stackoverflow. Usunąłem skróty ze swojego wpisu. Ogólny skrót tekstu w stylu wiadomości nie jest tutaj odpowiedni. Myślę, że ta odpowiedź byłaby dobrą odpowiedzią na pytanie, czy zamieściłeś więcej szczegółów ze swojego bloga, w samej odpowiedzi, aby ktoś czytający twoją odpowiedź uczył się czegoś, nawet jeśli nie przeczyta bloga lub zostanie przeniesiony do innego adresu URL w przyszłości. – Flexo

1

Zapoznaj się z TrueZip.

Robi dokładnie to, co chcesz (aby edytować pliki wewnątrz pliku jar) za pośrednictwem interfejsu API systemu plików wirtualnych. Obsługuje także zagnieżdżone archiwa (jar wewnątrz słoika).

1

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

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

tu jest poradnik wideo, jeśli chcesz: https://www.youtube.com/watch?v=ByLUeem7680

+0

, odpowiedź brzmi "Użyj CAVAJ". Link jest tylko dodatkiem, jeśli potrzebne jest dodatkowe wyjaśnienie. – Tomasz

7

Można użyć vim:

vim my.jar

Vim jest w stanie edytować skompresowanych plików tekstowych, ponieważ masz unzip w danym środowisku.

+2

To jest świetne. Przejdź do pliku, którego szukasz, i naciśnij Enter. Edytuj plik, a następnie wpisz: wq, aby zapisać! –

+0

Daje mi niesformatowany plik –

0

Najprostszym sposobem znalazłem to zrobić w Windows jest z WinRAR:

  1. prawym przyciskiem myszy na pliku i wybierz „Otwórz za pomocą WinRAR” z menu kontekstowego.
  2. Przejdź do edytowanego pliku i kliknij go dwukrotnie, aby otworzyć go w domyślnym edytorze.
  3. Po wprowadzeniu zmian zapisz i wyjdź z edytora.
  4. Pojawi się dialog z pytaniem, czy chcesz zaktualizować plik w archiwum - wybierz "Tak", a JAR zostanie zaktualizowany.
Powiązane problemy