2010-03-17 13 views
8

Witajcie przepełnieni znajomi. Mam prosty problem, który obawiam się, że nie ma prostego rozwiązania i potrzebuję porady, jak postępować. Zajmuję się tworzeniem aplikacji java pakowanej jako plik wykonywalny JAR, ale wymaga ona modyfikacji niektórych jej zawartości pliku JAR podczas wykonywania. Na tym etapie mam problem, ponieważ niektóre systemy operacyjne blokują plik zapobiegający zapisywaniu.Zmodyfikuj wykonywanie pliku JAR

Ważne jest, aby użytkownik zobaczył zaktualizowaną wersję pliku JAR, zanim aplikacja wyjdzie, chociaż mogę być dość elastyczny, jeśli chodzi o sposób jego osiągnięcia. Oczywiste jest, że czyste i efektywne rozwiązanie jest preferowane, ale przenośność jest jedynym trudnym wymaganiem.

Poniżej przedstawiono trzy podejścia, które mogę rozwiązać, aby je skomentować lub zaproponować innym.

  1. Powiedz Java, aby odblokować plik JAR na piśmie (to robi wydaje się możliwe, ale byłoby easyest rozwiązanie)
  2. skopiować pliki wykonywalne klasy do pliku tempory na starcie aplikacji, należy użyć programu ładującego klasy do załadowania te pliki i wyładowują te z początkowego pliku JAR. (Nie miał zbyt dużego doświadczenia z programami ładującymi klasy, ale mam nadzieję, że JVM byłaby wtedy wystarczająco inteligentna, by zdać sobie sprawę, że oryginalny JAR jest nieużywany i tak go odblokować)
  3. Po drugie plik wykonywalny JAR wewnątrz pierwszej, przy uruchomieniu wyodrębnij wewnętrzny plik jar do pliku tymczasowego, wywołaj nowy proces Java za pomocą skopiowanego wewnętrznego pliku JAR i przekaż mu lokalizację zewnętrznego pliku JAR, pierwszy proces wyjścia, drugi proces modifys Outer słoik unincumbered. (To będzie działać, ale nie jestem pewien, że jest to sposób platforma niezależna od jedna aplikacja Java powołując inny)

Wiem, że to dziwne pytanie, ale każda pomoc będzie mile widziane .

+3

Czy można podać jakiekolwiek wskazówki, dlaczego należy modyfikować plik jar podczas wykonywania? – Poindexter

+0

@pinkynobrain masz na myśli sposób antycznej mrówki, proponuję przeczytać maven przykładowy darmowy ebook, zobaczysz, że to, co sugerujesz, nie ma sensu .. Nie próbuję cię urazić, tylko próbuję ci pomóc .. czy nie wszyscy już tam byliśmy – ant

+0

Co próbujesz osiągnąć - aplikacja samoaktualizująca się? –

Odpowiedz

2

Jedną z opcji:

Czy program napisać zmodyfikowaną kopię pliku JAR.

Dołącz do pliku JAR drugi plik JAR z narzędziem, które po uruchomieniu usuwa oryginalny plik JAR i zmienia nazwę zmodyfikowanej kopii, aby odpowiadała oryginałowi.

Po wyjściu z programu (i wprowadzeniu zmian) wyodrębnij to narzędzie i uruchom je we własnym JVM (przy użyciu Runtime.getRuntime().exec()). Narzędzie czekało, aż zamek wyleci z oryginalnego, niezmodyfikowanego JAR-a, a następnie wykona swoją pracę i zakończy działanie.

Dla użytkownika plik JAR wydaje się aktualizować przy wyjściu (lub wystarczająco blisko!).

+0

Hej, thx za twoją odpowiedź, to zdecydowanie inne rozwiązanie, mimo że wciąż ma problem z tą samą opcją co moja opcja 3. Przypuszczam, że użycie exec ("java") jest sprawiedliwe Przenośny, miałem nadzieję, że istnieje jakiś prawdziwie niezależny od platformy sposób tworzenia jednej aplikacji Java od innej – PinkyNoBrain

+0

Chociaż Java jest znacznie bardziej niezależna od platformy niż wiele innych języków, jest niedoskonała na wiele sposobów i nie jest to tak duża umowa mieć coś takiego, jak wykonać plik jar, zrobić w przełączniku opartym na platformie (jeśli nawet musi być inny - myślę, że "java " działa na systemie UNIX i Windows, nie jestem pewien co do osx.) – Chris

+0

uzyskanie wszystkich informacji potrzebnych do wykonania 'Runtime.getRuntime(). exec()' w sposób niezależny od platformy przed faktycznym wywołaniem.Myślę, że metoda 'System.getProperties()' ma pewne przydatne informacje acji. –

1

Szczerze uważam, że twoje podejście jest błędne. To po prostu nie pasuje do domyślnego sposobu wdrażania java. Zmodyfikowane pliki będą musiały pozostać gdzieś w pliku db lub xml - to jest TYLKO rozsądne podejście.

Wszystko jest po prostu "walką z wiatrem" - możesz z pewnym wysiłkiem zmusić go do działania, ale ostatecznie ugryzie ciebie lub klienta.

+0

Przykro mi, że nie podoba ci się ta odpowiedź. Co ze zmianą nazwy, blokowaniem itp., Właśnie wyrażałem swoją opinię, że próbujesz wymusić rozwiązanie, które nie pasuje do problemu. – MJB

+1

To byłby komentarz, a nie odpowiedź –

Powiązane problemy