Vaadin 7 i Scala w jednym stali pomie

Wpis będzie o rzeczach podstawowych.

Vaadin 7

Wyszło już pewien czas temu. Zmian w stosunku do poprzedniej „dużej” wersji jest dużo. Dla nas na chwilę obecną ważne jest, że nie dziedziczymy po klasie Application, a po klasie UI. Zresztą ta pierwsza klasa nadal jest obecna w API ponieważ twórcy chcą utrzymać zgodność wsteczną.

Pierwszym krokiem jest wygenerowanie sobie aplikacji w mavenie, czyli piszemy mvn archetype:generate i przeklikujemy się przez odpowiednie pola. W efekcie otrzymujemy prostą aplikację Vaadin z przyciskiem, który pokazuje labelkę.

Scala

Jak mamy już gotowy projekt Vaadin czas na dorzucenie elementu Scali. W tym celu w pom.xml dopisujemy:

Listing 1. zawartość pom.xml

    
        
            org.scala-lang
            scala-library
            2.10.1
        
    
    
           
                org.scala-tools
                maven-scala-plugin
                
                    
                        
                            compile
                            testCompile
                        
                    
                
                
                    src/main/java
                    
                        -Xms64m
                        -Xmx1024m
                    
                
            
    

Starczy. Po uruchomieniu jettego: mvn package jetty:run otrzymamy działającą aplikację.

Czas trochę pogrzebać w kodzie. Najpierw wywalamy javową klasę MyVaadinUI i zastępujemy ją klasą scalową. By nie było zbyt łatwo nasz projekt będzie to prosty kalkulator tzn. będziemy podawać w polu tekstowym kolejne liczby, które na koniec zsumujemy na scalową modłę.

Listing 2. zawartość MyVaadinUI.scala

class MyVaadinUI extends UI {

  var liczby: List[Int] = List(0)

  override def init(request: VaadinRequest) {
    val layout = new VerticalLayout()
    layout.setMargin(true)
    setContent(layout)
    val liczbyLabel = new Label("0")
    val input: TextField = new TextField("Podaj liczbę")
    val kolejnaBtn: Button = new Button("Kolejna")

    kolejnaBtn.addClickListener(new Button.ClickListener {
      def buttonClick(event: Button.ClickEvent) {
        liczby ::= input.getValue.toInt
        liczbyLabel.setValue(liczbyLabel.getValue + "+" + input.getValue)
        input.setValue("")
      }
    })
    val sumaBtn = new Button("Suma")
    sumaBtn.addClickListener(new Button.ClickListener {
      def buttonClick(event: Button.ClickEvent) {
        // sumowanie liczb
        val wynik: Label = new Label(liczby.foldLeft(0) {
          (a, b) => a + b
        }.toString)
        layout.addComponent(wynik)
        liczby = List(0)
        liczbyLabel.setValue("0")
      }
    })

    layout.addComponent(input)
    layout.addComponent(kolejnaBtn)
    layout.addComponent(liczbyLabel)
    layout.addComponent(sumaBtn)

  }
}

Tu nie ma żadnej magii.

Na koniec mała niespodzianka

Jeżeli pracujecie sobie w domu i na własny użytek to zapewne szybko zauważycie, że najbardziej bolesną zmianą w stosunku do wcześniejszej wersji pluginu Vaadin do mavena jest domyślne włączenie zadania update-widgetset w fazie package co powoduje odpalenie kompilatora GWT i tym samym znacząco wydłuża czas potrzebny na uruchomienie serwera Jetty. By pozbyć się tego problemu wystarczy przystąpić do programu myJRebel i wykupienie licencji Social za całe 0 USD. W czym tkwi haczyk? Pozwalamy ZeroTurnaround na publikowanie na naszym Twitterze albo Facebooku. IMO cena jest niewielka, a korzyści ogromne.
Tu uwaga, by JRebel prawidłowo działał z mavenem i jettym trzeba pamiętać o przekompilowaniu klas w IDE (ja używam Idei i Eclipse i nie ma problemów z konfiguracją) oraz podpięciu JRebel jako agenta JVM na poziomie zmiennych systemowych JAVA_OPTS i MAVEN_OPTS. Co ciekawe maven nie korzysta z JAVA_OPTS 🙂

I to chyba na tyle 🙂

5 myśli na temat “Vaadin 7 i Scala w jednym stali pomie

  1. Mam dwa pytanka:
    1. Czy Vaadin wymaga wykonania package żeby aplikacja działała dobrze? Pytam się, bo sam jetty:run jest zbindowane do test-compile, więc „mvn jetty:run” powinno wystarczyć.
    2. Jakiej wersji Eclipse, Scali i Scali IDE używasz? Pytam się, bo ostatnio miewam duże problemy przy Scali 2.10 w Eclipse Juno i projektach Maven’owych, co chwila plugin Scala’owy narzeka na StackOverflow…

  2. 1. Tak, to jest związane z jakimiś zabawami z kopiowaniem zasobów. Nie wnikałem.
    2. Używam Idei m.in. ze względu na lepsze wsparcie dla Scali, ale z mojego doświadczenia z Eclipse podpowiem, że warto zainteresować się plikiem eclipse.ini i wstawić tam parametry -Xmx i -Xms

  3. Ad 1. Dzięki, dobrze wiedzieć. Ad 2. Aha. Pytanie zadałem bo wspomniałeś zarówno o Idei jak i o Eclipse. Co do ustawień, podpisuję się obiema rękoma! Tyle że np. -XX:MaxPermSize=1024m -Xms1536m -Xmx4096m powinno załatwić sprawę, ale niestety nie pomaga… no nic, czas chyba znowu przeszukać net pod tym kątem, miałem nadzieje że to zniknie przy Scala IDE 3.0.0 – no such luck. Generalnie wygląda to na nieskończoną rekurencję, jakbym był zwolennikiem teorii spiskowych to postulowałbym, że chcą ludzi zindoktrynować w kierunku sbt ;).

  4. @Miki, jak nie zrobisz package to dostaniesz dokładnie:

    Failed to load the widgetset: ./VAADIN/widgetsets/pl.koziolekweb.vaadin7.AppWidgetSet/pl.koziolekweb.vaadin7.AppWidgetSet.nocache.js?1367948523284

    w alercie

    Co zaś tyczy się pamięci… scala ide pod eclipse „ssie”. Warto zainwestować kilka złotych i załapać się na promocję Idei.

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