tag Archives: Java

Spring… i na wiosnę, i na lato – Część 1

Postaram się w dzisiejszym wpisie ogarnąć nieco temat framework’a Spring. Zacznijmy więc może od tego, czym on jest. Omnipotentna Wikipedia podpowiada nam, iż Spring jest narzędziem do tworzenia aplikacji (ang. application framework) w języku Java, zarówno dla platformy web, jak i stand-alone. Zatem spróbujemy dzisiaj stworzyć pierwszą aplikację webową w oparciu o Spring’a.

Portecle Installer

Idąc za ciosem, postanowiłem zmajstrować kilka bajerów do projektu Portecle, gdyż jak się okazało, podobnie do KeyTool GUI brakuje mu pewnych drobiazgów. Zatem, do plików projektu dodałem pliki wykonywalne .exe i .sh oraz zapakowałem całość w instalator od IzPack, i tak oto powstał nowy projekt: Portecle Installer.

Łamigłówki i dekompilatory

Podczas rozwiązywania łamigłówki, jaką zafundowali wszystkim zainteresowanym złośliwcy z ZeroTurnaround odkryłem, iż zachwalany przeze mnie nieco wcześniej Java Decompiler mimo, iż jest bardziej na czasie niż JAD, to z błędami bytecode’u radzi sobie nieco gorzej. Być może ta sugestia pozwoli zaoszczędzić Wam kilka ładnych minut podczas pokonywania kolejnych etapów.

JRebel za darmo na 4 miesiące

JRebel, onegdaj JavaRebel, to narzędzie którego większości doświadczonych programistów Javy zapewne przedstawiać nie trzeba. Jeśli zaś jesteś osobą, która nigdy o nim nie słyszała, a chciałbyś/chciałabyś poznać owe magiczne narzędzie, pozwalające programiście zaoszczędzić dziesiątki roboczogodzin i całą masę frustracji spowodowanej oczekiwaniem na zakończenie długotrwałego procesu deploy’owania lub budowania aplikacji, to zapraszam na stronę producenta, aby dowiedzieć się nieco więcej o tym wynalazku: http://www.zeroturnaround.com/jrebel

Kodowanie UTF-8 w klasach generowanych z xsd i wsdl

Jeśli zdarzyło się Wam zabrać za WebService‘y w Javie zapewne natknęliście się na kilka ciekawych problemów, których rozwiązanie nastręczyło Wam nieraz wielu kłopotów. Ja sam miałem takowy przypadek podczas generowania klas ze schem i wsdl’i pod Winzgrozą.

Armagjiedon, czyli rzecz o średniku i nawiasach klamrowych

Dzisiaj, po raz kolejny miałem przyjemność zobaczyć, jak początkujący programista może na własne życzenie uprzykrzyć życie sobie i kolegom z pracy. Poniżej załączam przykładowy kawałek kodu, który sprawił niektórym z nich niemiłą niespodziankę 🙂

Problemy z JavaDoc pod NetBeans'em

Natknąłem się dzisiaj na ciekawy problem. Otóż, chciałem do JavaDoc‘a opisywanej przeze mnie klasy dodać obrazek. Niby nic niezwykłego, bo podobno wystarczy dodać katalog doc-files w pakiecie z klasą, wrzucić tam obrazek, a w JavaDoc‘u wpisać coś a’la:

1
2
3
4
5
 /*
  * ...
  * <img src="/doc-files/grafika.png" alt="Opis obrazka...">
  * ...
  */

Naprawianie starych błędów, czyli wątek o Swingu

Jeśli nie wiesz, czym dokładnie jest Event Dispatch Thread polecam artykuł Threads and Swing. Daje on niejakie pojęcie o tym co, gdzie, jak i dlaczego działa w Swing‘u tak, a nie inaczej.

Jeśli wiesz już o co chodzi z EDT i rozumiesz, jakie problemy może powodować zmienianie GUI z poziomu wątku innego niż EDT, możesz chcieć zapoznać się z opisem projektu swinghelper opublikowanego na łamach serwisu java.net, a w szczególności z działem Debugging and testing.

Numerowanie wersji oprogramowania

Nadawanie numerów wersji kolejnym wydaniom bibliotek, czy też aplikacji z oczywistych względów wydaje się być co najmniej wskazanym. Pozostaje jednak pytanie, jak to robić?

SwingWorker nie działa!

Odpalając niedawno jedną z napisanych przeze mnie niegdyś aplikacji na nowej wersji Javy (JRE 1.6.0_20) zauważyłem, iż nie działa ona prawidłowo. Otóż, niektóre operacje trwały dłużej niż powinny. Po krótkim śledztwie z wykorzystaniem jvisualvm i inspekcją kodu na czele, okazało się, że to używane przeze mnie SwingWorker’y z nieznanych mi przyczyn prawdopodobnie wchodzą sobie w drogę.

Portecle Installer

Idąc za ciosem, postanowiłem zmajstrować kilka bajerów do projektu Portecle, gdyż jak się okazało, podobnie do KeyTool GUI, z którego do tej pory korzystałem, brakuje pewnych drobiazgów. Zatem, do plików projektu dodałem pliki wykonywalny .exe oraz zapakowałem całość w instalator od NSIS i tak oto powstał nowy projekt: Portecle Installer.

KeyTool GUI: Reactivation

Okazuje się, co jest dla mnie miłym zaskoczeniem, że KeyTool GUI wcale nie umarł. Ukrył się tylko pod innym imieniem 🙂

Portecle, bo tak się nazywa kontynuacja projektu (?), podobnie jak onegdaj KeyTool GUI, jest narzędziem do tworzenia i edycji plikowych magazynów certyfikatów i kluczy. Uogólniając, jest to jakoby nakładka na Javowe keytool.exe.

Mechanizm rozwiązywania nazw sieciowych do adresów IP

Miałem okazję przeczytać dzisiaj małe opracowanie, traktujące o sposobie w jaki Java przechowuje i rozwiązuje nazwy adresów sieciowych do numerów IP, z którymi próbuje się połączyć. Nie jest to może szalenie istotne zagadnienie, jednak dobrze jest mieć chociaż z grubsza świadomość, jak ów mechanizm funkcjonuje.

Jak zamknąć JFrame z potwierdzeniem?

Przeglądając wyniki wujka Google związane z Javą, natknąłem się kilka razy na mniej lub bardziej udane przykłady kodu wyświetlającego okno, które w momencie zamykania wyświetla dialog z zapytaniem, czy użytkownik jest pewien, że chce je zamknąć. Postanowiłem samemu przygotować podobny przykład, który przy okazji uzasadni moje podejście do mechanizmu zamykania okien przedstawione we wpisie Zamykanie okien poprzez wciśnięcie przycisku Escape.

Zdradliwe komentarze – ku przestrodze

Przeglądając zasoby serwisu Roflcopter znalazłem fragment kodu, który mnie… urzekł. Pomijam już roztrząsanie kwestii, czy ma sens rozwijanie pętli w Javie. Chodzi o to, że autor poniższego kawałka kodu, zabił mnie wygenerowanym przez siebie, jednym z trudniejszych do wykrycia przez tą samą osobę, błędów programisty.

Logowanie wybranych pakietów w log4j z poziomu aplikacji

Gdy piszemy aplikację, która korzysta ze sprawdzonych bibliotek, które do logowania wykorzystują log4j’a, możemy chcieć odpuścić sobie logowanie informacji z klas znajdujących się w wybranych pakietach tychże bibliotek. Poniższy kod przedstawia klasę filtru, który pozwala włączyć lub wyłączyć logowanie informacji z wybranego pakietu i całej jego podrzędnej struktury.

Konfiguracja log4j z poziomu aplikacji

Poniżej zamieszczam kod konfigurujący bibliotekę log4j, który po zamieszczeniu w naszej aplikacji spowoduje, że nie będziemy już potrzebowali pliku konfiguracyjnego log4j.configuration, czy też log4j.xml. Dodatkową korzyścią jest fakt, że po niewielkich zmianach będziemy mogli z poziomu naszej aplikacji dostosowywać na bieżąco mechanizm logowania do aktualnych potrzeb, np: rozszerzając lub zawężając zakres logowanych informacji, czy też dodając nowe lub usuwając aktualnie niepotrzebne appender’y.

Dekompilacja plików .class

Dobry dekompilator, to narzędzie, które docenia zapewne każdy programista, nie tylko Javy. Ważnym tu jednak jest nacisk na słowo kluczowe „dobry”.

Mechanizm obsługi wtyczek w aplikacjach pisanych w Javie

Services (ang. usługi) jest to mechanizm wbudowany w środowisko Java, umożliwiający tworzenie aplikacji rozszerzalnych o dodatkowe funkcje dostarczane za pomocą plug-in’ów, zwanych też wtyczkami.

Zanim przejdę do przykładowej implementacji, pozwolę sobie odnieść się do oryginalnego dokumentu, w którym omawiany jest mechanizm działania services, a który możemy znaleźć na stronach Sun’a.

Wczytywanie zawartości pliku MANIFEST.MF z poziomu Ant'a

Zdarza się czasem, że przydałoby się wyciągnąć z jar’a jakiejś biblioteki informacje na przykład o numerze jej wersji lub jej dostawcy. O ile dostanie się do pliku manifestu (/META-INF/MANIFEST.MF) z poziomu Javy nie powinno stanowić problemu, to wyciągnięcie jakichkolwiek informacji z poziomu Ant’a nie wydaje się już takie oczywiste.

PMD, czyli Programming Mistake Detector…

Programming Mistake Detector jest jednym z wielu proponowanych rozwinięć skrótu PMD, ale według mnie właśnie to rozwinięcie najdokładniej opisuje przeznaczenie opisywanej biblioteki.

PMD jest narzędziem, którego zadaniem jest znajdowanie w kodzie źródłowym potencjalnych błędów, takich jak puste bloki try/catch/finally, niewykorzystywane fragmenty kodu, nieoptymalne wykorzystanie klas String i StringBuffer, niepotrzebne użycie bloków if w pętlach, które można zamienić na pętle while oraz wykrywanie duplikatów bloków kodu.

Konfiguracja log4j

Poniżej załączam przykłady konfiguracji log4j’a, które wykorzystuje w kilku projektach.

Obfuskacja kodu, czyli jak utrudnić życie cracker'om

Obfuskacja, jak możemy przeczytać na Wikipedii, to “technika przekształcania programów, która zachowuje ich semantykę, ale znacząco utrudnia zrozumienie.”. Polega ona na takim przetworzeniu kodu lub binariów aplikacji, aby uzyskany po dekompilacji kod był jak najbardziej nieczytelny dla osoby przeprowadzającej analizę działania programu z wykorzystaniem tak zwanej Inżynierii wstecznej.

Prawidłowe zamykanie okien w Swing'u

Bawiąc się Swingiem od samego początku wydawało mi się, że aby prawidłowo zamknąć okno, wystarczy w akcji przycisku Zamknij wywołać:

1
2
3
private void closelButtonActionPerformed(java.awt.event.ActionEvent evt) {
    this.dispose();
}

Okazuje się jednak, że niekoniecznie jest to prawidłowe podejście, ponieważ jeśli wywołamy bezpośrednio dispose(), to nie zostaną poinformowane listenery okna oczekujące na zdarzenie zamykania okna. Co za tym idzie, zachowanie aplikacji będzie inne, niż w przypadku wciśnięcia przycisku X zamykającego okno. Zazwyczaj jednak chcemy zachować spójność działania aplikacji i obsługi zdarzeń.

Jak wykonywać długotrwałe zadania w Swing'u

Odkąd zacząłem pisać w Javie bardziej złożone aplikacje, które musiały na przykład komunikować się z jakimiś webowymi usługami lub wykonywać dłuższe obliczenia, miewałem problemy z zamarzającym GUI. Próbowałem problem ten rozwiązać na wiele sposobów, jednak zawsze znalazło się coś, co nie działało tak jak powinno - jak chociażby labele lub pola tekstowe, które powinny wyświetlać informacje o postępie zadania, a przez cały czas aż do zakończenia zadania pozostawały niezmienione.