2011-06-21 14 views
9

Załóżmy, że mam projekt java myProject i używam zewnętrznego słoja biblioteki (someJar.jar), który ma klasę com.somepackage.Class1.class.jak uniknąć "duplikowania klasy" w Javie

Teraz znajduję zaktualizowaną wersję Class1.java, która naprawia błąd w oryginalnym słoiku.

I obejmują nową Class1.java w moim kodu źródłowego pod pakietu com.somepackage

Kiedy budować projektu (na przykład przy użyciu Netbeans), istnieje dist\myProject.jar który zawiera klasę com.somepackage.Class1.class i dist\lib\someJar.jar który zawiera również klasę to samo imię.

Po uruchomieniu pliku (np. Przy użyciu java -jar dist\myProject.jar) używana jest nowa wersja Class1.class (zgodnie z własnym życzeniem).

  1. W jaki sposób Java decyduje, który plik klasy należy uruchomić w przypadku takich duplikatów? Czy istnieje sposób, aby określić pierwszeństwo?

  2. Czy istnieje "właściwy" sposób uniknięcia takich konfliktów?

  3. W programie Proguard, gdy próbuję skompresować mój kod, pojawia się błąd duplicate class. Jak mogę to wyeliminować?

Odpowiedz

4
  1. Java decyduje, którego użyć w oparciu o kolejność ścieżki klas. Wpisz swój pierwszy, a wszystko będzie dobrze.

  2. "Właściwym" sposobem byłoby naprawienie źródła sygnału, ale czasami nie zawsze jest to możliwe.

  3. Nie korzystałem z ProGuarda, ale zmieniłem zawartość bibliotek, zanim zduplikowano klasy. Rozwiązaniem w moim przypadku było powiedzenie Antowi, aby zignorował duplikaty klas. Zakładam, że ProGuard również będzie miał takie wsparcie.

6

Nie można utworzyć zaktualizowanego pliku JAR zawierającego poprawkę? Sprawi to, że rzeczy będą znacznie prostsze, jeśli nie będziesz mieć dwóch wersji tej samej, w pełni kwalifikowanej klasy.

+0

Mogę to zrobić. Jeśli jednak w przyszłości ktoś zastąpi ten słoik ulepszoną wersją (bez poprawek), zmiany zostaną utracone. Wolę zachować kod źródłowy java w projekcie, aby upewnić się, że poprawka nie została utracona. Czy można to zrobić w narzędziu do kompilacji? Uwaga: poprawka błędu nie jest częścią oficjalnej wersji biblioteki i może nie być częścią następnej. – Jus12

+0

@ Jus12: Z pewnością można utworzyć zaktualizowany plik JAR w ramach procedury budowania, tworząc kopię pliku jar, a następnie aktualizując tylko tę klasę.Jednakże, powiedziałbym, że nadal masz problemy - klasa mogła * również * zostać zaktualizowana w nowej wersji pliku JAR, więc użycie samodzielnego pliku klasy błędów poprawi problemy. Czy istnieje jakiś powód, dla którego poprawka błędu * nie byłaby * częścią nowej wersji słoika? –

+0

Mówię o bibliotece 'smack' xmpp, a poprawka błędu jest dodaną obsługą' BOSH'. W tej chwili smack nie obsługuje BOSH, a ten hack jest niezbędny, aby go uruchomić. Nie wiem, dlaczego jeszcze tego nie obsługują. – Jus12

1

1) Zaktualizowany Jar jest lepszym rozwiązaniem.

2) Użyj innej nazwy klasy. Czy istnieje powód, dla którego chcesz użyć tej samej nazwy klasy i tego samego opakowania? Nie sądzę, że jest jakiś powód.

3) utworzyć otoki/klasy proxy, które otoczyć wszystkie połączenia do słoika i można zdecydować, aby nazwać tę nową klasę, która rozwiązuje ten problem (pod warunkiem, że ma inną nazwę i opakowania)

+3

Jeśli klasa (z błędem w niej zawartym) jest utworzona przez kod innej firmy, możesz Po prostu podaj nową, odrębną klasę –

+0

Tak, dlatego musiałem zachować to samo imię. – Jus12

Powiązane problemy