2009-01-19 18 views
5

Klient wymaga podglądu nowej funkcji naszego produktu. Poprosili o przesłanie im tej funkcji w pliku jar (jak łatka). Nie ma problemu z dołączeniem nowych klas do wspomnianego pliku jar. Jednak istniejąca klasa została zmodyfikowana, co jest potrzebne do zintegrowania nowej funkcji. Chcą po prostu dodać ten nowy plik jar bez konieczności aktualizacji klas podstawowych naszego produktu. Pytanie brzmi: czy można zastąpić już istniejącą klasę przy użyciu osobnego słoika? Jeśli tak to jak?Jak mogę przesłonić klasę przy użyciu oddzielnego słoika?

Z góry dziękuję.

Odpowiedz

11

Istnieje szansa będzie działać, jeśli umieścisz nowy jar wcześniej w ścieżce klas niż oryginalny słoik. Warto spróbować, chociaż wciąż brzmi jak przepis na katastrofę - lub przynajmniej bardzo trudny do debugowania, jeśli w jakiś sposób załadowane są obie klasy.

EDIT: Ja zaplanowałem napisać trochę wcześniej, ale został przerwany pod koniec podróży pociągiem ...

chciałbym wrócić do klienta i wyjaśnić, że choć co pytasz jest możliwe może to spowodować nieoczekiwane problemy. Aktualizacja pliku JAR jest znacznie bezpieczniejszą poprawką, przy znacznie mniejszym ryzyku. Wyrażenia "nieoczekiwane problemy" i "ryzyko" prawdopodobnie zadzwonią dzwonkiem alarmowym do klienta, więc mam nadzieję, że pozwolą ci zrobić to, co trzeba.

+1

Z mojego doświadczenia wynika, że ​​klasy wcześniej w ścieżce klas są niezawodnie ładowane, podczas gdy nowsze wersje nie są. – Cogsy

+0

Tak, to powinno działać, ale nadal jest dość głupkowaty sposób na aktualizację niektórych klas. –

+1

A zależności od zmienionych interfejsów mogą cię jeszcze spalić.Ponadto złożona struktura modułu ładującego klasy może spowodować niepowodzenie ładowania klas, jeśli nie zostaną zaktualizowane wszystkie powiązane ścieżki klas. – Darron

1

Tak, może być to możliwe, umieszczając go wcześniej w ścieżce klas niż w oryginalnym słoiku. Jednak poleganie na zamówieniu swojej klasy nie zawsze prowadzi do szczęścia. Nie jestem pewien, czy jest to nawet udokumentowane w Specyfikacji Języka Java; jeśli nie, to będzie się łamać dla różnych JVM, a nawet różnych wersji tej samej JVM.

Zamiast tego należy rozważyć realistyczne ramy czasowe, aby zintegrować nową funkcję z bieżącą bazą kodów. Być może nie jest to odpowiedź, której szukasz.

3

Tak i nie, zależy to od środowiska.

Jeśli używasz na przykład OSGi i masz pod kontrolą swoje wersje, to tylko kwestia instalacji nowego pakietu z wyeksportowanym pakietem w wyższej wersji (zakładając, że twoje zakresy wersji są wystarczająco łagodne).

Jeśli używasz zwykłej starej Javy i nie masz ochoty ładować niestandardowych klas, powinieneś być dobry, aby umieścić ją wcześniej na ścieżce klasowej (jak już wspomnieli inni).

Jeśli masz niestandardowe ładowanie klasy, musisz się upewnić, że wszystkie klasy, których potrzebuje "poprawiona" klasa, a także cały przechodni obiekt zależności, są widoczne w programie ładującym klasy, który ładuje poprawione wersja, co może oznaczać, że musisz wysłać całą aplikację, najgorszy przypadek.

2

Wszystkie odpowiedzi, które przewidują wprowadzenie zaktualizowanych zajęcia przed tymi, które zastępują w ścieżce klasy są poprawne, tylko pod warunkiem oryginalny JAR nie jest uszczelniony lub podpisane.

+1

Nie działa, jeśli słoik jest podpisany. – studgeek

0

Prawdopodobnie więcej niż potrzebujesz w tym konkretnym przypadku, ale ogólnie, jeśli chcesz tylko ulepszyć lub rozszerzyć istniejącą klasę, możesz także użyć AspectJ z load-time weaving.