Kickstart w Javie prawie jak w Ruby

Za co wszyscy cenią Ruby? Za zajebisty framework jakim jest Ruby on Rails. Gdy dość dawno temu Wiktor Gworek na spotkani WJUGa pokazał jak pisać w RoR byłem oczarowany. Przy springowych, kilometrowych XMLach, przy EJB3 i jego opasłości lekkość Railsów była do pozazdroszczenia.
Później zetknąłem się z Symphony, czyli railsami dla PHP, a w zeszłym roku Jacek Laskowski męczył nas Groovym i Grailsami.Ja też tak chciałem, ale chciałem też by to była Java.
Mam duże opory przed nauką nowych języków, a wynika to niestety z braku możliwości ich stosowania w praktyce. Zarówno w fabryczce jak i prywatnie tworzę przede wszystkim w Javie. Nowy język wymagał by ode mnie zaangażowania środków w nowe nieznane środowisko, a co za tym idzie musiałbym kilka rzeczy w organizacji pracy zmienić. Taki już jest ten Kozioł.

Przeglądałem jeszcze przed świętami plan zajęć WJUGa i rzucił mi się na oczy jeden punkt. Wojciech Erbetowski – Play Framework. Zagooglowałem trochę za tym frameworkiem i po obejrzeniu filmiku z prezentacją byłem pod wrażeniem.
Rozpocząłem więc własną przygodę z tym frameworkiem.

Co jest w nim fajne

Przede wszystkim lekkość. Cały proces tworzenia aplikacji jest nastawiony na maksymalizację szybkości. Jest bardzo dużo CoC i pewnych dobrze znanych zasad. Na przykład używamy plików yml do definiowania danych testowych. Bardzo silnie odseparowane są elementy MVC. Jest to co w railsach fajne, czyli metody CRUD w klasach modelu. Jest w końcu ludzkie wsparcie dla testów.
Przyjrzyjmy się jednak procesowi tworzenia aplikacji.

Let’s play the game

Po ściągnięciu ostatnich binariów wersji 1.0 (w 1.1 jest wsparcie dla Scali, ale całość jest unstable) z serwera, rozpakowujemy, ustawiamy zmienną $PATH i $PLAY_PATH i już możemy działać.
W konsoli przechodzimy do katalogu z wokrspacem Eclipse i piszemy

Listing 1. Tworzenie nowej aplikacji play

koziolek@koziolek-desktop:~/workspace$ play new test
~        _            _ 
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/   
~
~ play! 1.0-r779, http://www.playframework.org
~
~ The new application will be created in /home/koziolek/workspace/test
~ What is the application name? Test
~
~ OK, the application is created.
~ Start it with : play run test
~ Have fun!
~
koziolek@koziolek-desktop:~/workspace$ 

Następnie Eclipsujemy aplikację i importujemy ją do IDE:

Listing 2. Eclipsowanie aplikacji

koziolek@koziolek-desktop:~/workspace/test$ play eclipsify
~        _            _ 
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/   
~
~ play! 1.0-r779, http://www.playframework.org
~
~ OK, the application is ready for eclipse
~ Use File/Import/General/Existing project to import /home/koziolek/workspace/test into eclipse
~
~ Use eclipsify again when you want to update eclipse configuration files.
~ However, it's often better to delete and re-import the project into your workspace since eclipse keeps dirty caches...
~
koziolek@koziolek-desktop:~/workspace/test$ 

Gościa który wymyślił takie polecenie powinni powiesić. eclipsify jest złe, powinno być eclipse. Przy okazji spis komend:

Listing 3. Polecenia konsoli play

koziolek@koziolek-desktop:~/workspace/test$ play help
~        _            _ 
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/   
~
~ play! 1.0-r779, http://www.playframework.org
~
~ For all commands, if the application is not specified, the current directory is used
~ Use 'play help cmd' to get more help on a specific command
~
~ Available commands are: 
~ ~~~~~~~~~~~~~~~~~~~~~~~
~ auto-test      Automatically run all application tests
~ classpath      Display the computed classpath
~ clean          Delete temporary files (including the bytecode cache)
~ eclipsify      Create all eclipse configuration files
~ help           Display help on a specific command
~ id             Define the framework ID
~ idealize       Create all IntelliJ Idea configuration files
~ modules        Display the computed modules list
~ netbeansify    Create all netbeans configuration files
~ new            Create a new application
~ out            Follow logs/system.out file
~ pid            Show the pid of a running application
~ precompile     Precompile all Java sources and templates to speed up application start
~ run            Run the application in the current shell
~ restart        Restart the running application
~ secret         Generate a new secret key
~ status         Display the status of the running application
~ start          Start the application in background
~ stop           Stop the running application
~ test           Run the application in test mode in the current shell
~ war            Export the application as a standalone WAR archive
~ 
~ Also refer to documentation at http://www.playframework.org/documentation
~ 
koziolek@koziolek-desktop:~/workspace/test$

Nasza aplikacja ma następującą strukturę:

Listing 4. Struktura aplikacji

.
|-- app
|   |-- controllers
|   |   `-- Application.java
|   |-- models
|   `-- views
|       |-- Application
|       |   `-- index.html
|       |-- errors
|       |   |-- 404.html
|       |   `-- 500.html
|       `-- main.html
|-- conf
|   |-- application.conf
|   |-- messages
|   `-- routes
|-- eclipse
|   |-- Connect JPDA to Test.launch
|   |-- Test Test.launch
|   `-- Test.launch
|-- lib
|-- logs
|-- public
|   |-- images
|   |   `-- favicon.png
|   |-- javascripts
|   |   `-- jquery-1.3.2.min.js
|   `-- stylesheets
|       `-- main.css
`-- test
    |-- Application.test.html
    |-- ApplicationTest.java
    |-- BasicTest.java
    `-- data.yml

Jak na razie było prosto. Później też jest prosto, a jak idzie się przez tutorial to naprawdę prosto.

Play wady

Wadą frameworku jest praktycznie całkowity brak możliwości rekonfiguracji nazw pakietów (albo jeszcze tego nie odkryłem). Powoduje to, że aplikacje tworzone w play muszą być proste. Nic bardziej złożonego niestety 🙁
Kolejną poważną wadą jest narzucenie złych praktyk. Akcje w kontrolerach muszą być metodami statycznymi (sic!). Wiadomo, że static w odniesieniu do metody to zło wcielone w Javie. Niestety wyżej nerek nie podskoczymy.
Ostatnią wadą jest brak znanych z RoR poleceń do generowania kontrolerów i widoków.
Na koniec należy dodać jeszcze wykorzystanie bibliotek majstrujących w bytecodzie po kompilacji. Powoduje to, że nieintuicyjnie działa mechanizm dziedziczenia np. jeżeli chcemy zrobić własną metodę delete to nie można nadpisać tej dziedziczonej z klasy Model ponieważ jest ona podmieniana w naszej klasie na poziomie bytecodu. Powoduje to walenie błędami w trakcie uruchamiania aplikacji.
Oczywiście brakuje też dokumentacji.

Podsumowując, twórcy play mają jeszcze wiele rzeczy do zrobienia, ale już osiągnięte efekty są dobre.

11 myśli na temat “Kickstart w Javie prawie jak w Ruby

  1. Tak pobocznie-prowokacyjnie: obejrzałbyś kiedyś lifta (framework webowy do scali). Mi się na razie nie chce a chętnie bym się dowiedział, czy się to do czegoś nadaje….

  2. Fajnie by sie ten blog czytalo, gdyby nie to wplatanie knajackiego jezyka…

  3. @majson, sorry Winnetou, taki już mój urok. Tak i tak czyta się to lepiej, bo sprawdzam orty. Poprawnie z języków wszystkich to ja tylko w Javie piszę.

    @usagiaddict, jest dobrze co by nie mówił zdrowy rozsądek. Pliki yml to standard języka YAML. Fajna rzecz, tylko wymaga trochę wprawy no i nie ma dobrego edytora do tego w Eclipse.

    ps. @majson, jako programista z definicji jestem na marginesie społecznym. Kto by chciał się zadawać z brodatym facetem we flanelowej koszuli, ktory cos bełkocze i mówi niezrozumiałymi skrótami?

  4. hej, ja proboje cos podbnego osiagnac tylko dla konfiguracji wicket+spring+jpa w momim malym projekcie wicketcool. obecnie jestem w trackie przepiania na spring3 i jpa2. sam wicketcool tez jeszcze wiele nie umie, ale umie juz cos. np encje ci potowrzy, daosy. ale to jeszcze troche, narazie na blogu za wiele o nim nie chce pisac, dopoki cos sensownieszego nie bedzie dostpne

  5. Najfajniejsze właśnie jest to, że to Java 🙂
    Może jeszcze nie porównuje się do Grails, ale już człowiek ma dużo frajdy tworząc proste aplikacje.

    Pozdrawiam

  6. Struktura wygenerowanego projektu to prawie Ctrl-C Ctrl-V z ZF, ktorego uzywam w PHP. Czyzby javowe frameworki zaczely podpatrywac sprawdzone rozwiazania u skryptowych kuzynow?

  7. @Chlebik, raczej w drugą stronę 😉 Ale tak na prawdę chodzi o coś innego. Podział w Play, ZF czy Railsach jest bardzo naturalny. Takie samo coś tworzy się jako domyślny projekt eclipse. Jednakże w przypadku playa problem jest tej natury, że ściągnięcie struktury aplikacji z ZF spowodowało, że w praktyce nie mamy dostępu do funkcjonalności pakietów.
    Rozczajam to aktualnie i może uda mi się przekonfigurować framework w ten sposób, że będę mógł trzymać kontrolery we własnych pakietach.

  8. Jaką zmienną path trzeba ustawić aby móc cieszyć się możliwościami PF?

Napisz odpowiedź

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax