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).
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?
Czy istnieje "właściwy" sposób uniknięcia takich konfliktów?
W programie Proguard, gdy próbuję skompresować mój kod, pojawia się błąd
duplicate class
. Jak mogę to wyeliminować?
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
@ 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? –
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