2009-10-19 22 views
5

W aplikacji jest składnik, który korzysta z com.sun.java.swing.SwingUtilities2 Teraz rozumiem, że tej klasy nie należy używać, ale jest ona elementem systemu, który jej używa.Java 6 i SwingUtilities2

Dlatego, ponieważ nie jest już dostępna w Javie 6, otrzymuję NoClassDefFoundError. Jak mogę obejść ten problem bez konieczności aktualizacji komponentu, ponieważ nie wiem jeszcze, czy jest to opcja.

+0

Czy zamierzasz wymienić i podać nazwę dostawcy komponentu? –

+0

Czy to jest poprawka punktowa? czy jest możliwe, aby sprzedawca wykonał przebudowę na 6? – reccles

+0

@ Tom: Od tego czasu naprawiliśmy, po prostu nie chcemy wchłonąć czasu i pieniędzy. Na przykład poprawili swoje API, ale nie potrzebujemy żadnych ulepszeń (poza tą poprawką). Jak również nie wiemy, czy nasz kod będzie wymagał ulepszenia, aby dopasować nowy interfejs API (więcej czasu kosztuje). I oczywiście koszt "aktualizacji" komponentu. –

Odpowiedz

5

Jeśli nie masz absolutnie żadnego innego wyboru, to powinieneś dokładnie określić, czego ta klasa używa w SwingUtilities2, a następnie tworzyć proxy dla tej funkcji w SwingUtilities2. Następnie możesz umieścić go we własnym pakiecie com.sun.java.swing, który będzie nakładał się z oryginalnym, a jeśli ten sam moduł ładujący klasy, który ładuje twój komponent, jest również świadomy SwingUtilities2, wtedy ten zobaczy drugi i twój aplikacja będzie działać.

W zależności od tego, który komponent jest i jaki został użyty w SwingUtilities2, może to być znacznie trudniejsze niż uaktualnienie lub nawet przepisanie.

+0

Zgadzam się. Czy masz pojęcie, czy źródło jest dostępne w dowolnym miejscu. Rozumiem, że to nie jest open source, ale ktoś musiał stworzyć jakąś klasę, która go zastąpi ... –

+0

Oprócz dekompilacji. –

+0

http://www.google.com/search?q=SwingUtilities2.java –

1

Da-dum! Właśnie dlatego powinieneś zwrócić uwagę na te brzydkie ostrzeżenia napominające Cię, abyś nie polegał na wewnętrznych urządzeniach JVM!

+0

Ale czy masz rozwiązanie? –

+3

@Przypuszczasz, że @Stephane stworzył problem, który musi obsługiwać. Jak rozwiązać problem, jeśli musiałeś rozwiązać problem? – reccles

+2

W rzeczywistości jest to składnik, który został zakupiony w celu włączenia do oprogramowania. Komponent, ponieważ jest zastrzeżony, jest zaciemniany. Nie miałem też pojęcia (ani jak mogłeś) wiedzieć, że używasz tej klasy. –

1

Po prostu nie wiem, czy to zadziała.

Spróbuj wyciągnąć klasę SwingUtilities2 i włóż ją do słoja z łatami, umieść ten słoik w ścieżce klas. Mam nadzieję, że działa to dopóki nie zmienisz źródła.

+0

Niestety to nie działa poprawnie. Istnieje linia ((Boolean) c .getClientProperty (AA_TEXT_PROPERTY_KEY)), która zawsze zwraca wartość null i dlatego generuje punkt zerowy wyjątku –

+0

Edycja odwołań wewnątrz kopiowanej klasy, aby odwołać się lokalnie.Myślę, że NP jest ponieważ używa rzeczywistych 6 zmiennych les. Chociaż najlepiej byłoby, gdyby sprzedawca zregenerował 6. Niektóre firmy robią to dla szybkich napraw – reccles

1

Jedynym prawidłowym sposobem (z hackowania) jest poproszenie dostawcy o naprawienie i przebudowanie tego komponentu na Javę 6. Możliwym sposobem działania jest skopiowanie pliku sun.swing.SU2 do com.sun ... SU2 i umieszczenie go w oddzielny jar (np. java6fix.jar) i spróbuj uruchomić swoją aplikację. Będzie dobrze, jeśli dodasz ten plik z poprawkami do jvm bootclasspath. Najlepszą poprawką powinno być stworzenie własnego com.sun..SU2 i delegowanie wszystkich połączeń do sun.swing.SU2. I spójrz na inną wersję komponentu, który obsługuje Javę6 może również od innego dostawcy. Również, jeśli problem występuje tylko we wspomnianej linii ((Boolean)c.getClientProperty(AA_TEXT_PROPERTY_KEY));, możesz umieścić własną właściwość klienta dla tego komponentu, aby zapobiec NPE. Kiedy weźmiesz tę ścieżkę, możesz po prostu utworzyć własne com.sun ... SU2.AA_TEXT_PROPERTY_KEY i wywołać c.setClientProperty (AA_TEXT_PROPERTY_KEY, true) na tym komponencie. Spróbuj również wyłączyć kontrolę antyaliasingu na komponencie, jeśli to możliwe.

+0

Chociaż miło jest powiedzieć, obawiam się, że jest to droga droga. Komponent został zbudowany w błędzie JDK 5, więc nie mogę ich zarzucić za nieobsługiwanie JDK 6. –

+0

Jeśli nie, weź inną ścieżkę z moich sugestii. –

Powiązane problemy