Mavenizacji ciąg dalszy – dlaczego tym razem wyszło

Dziś znów na tapecie Maven. Nie tak dawno pisałem jak poszły moje pierwsze boje z tym narzędziem. W skrócie – nie poszły.

Zakończyłem jednakże prace z szkieletem projektu i po chwili namysłu (plus fakt, że poszedłem spać przed 3) stwierdziłem, że może to i dobrze. Jak wspominałem w poprzednim wpisie w dokumentacji Springa jest opisane tworzenie projektu krok po kroku, wraz z dodawaniem katalogów i takich tam. Stwierdziłem zatem, że jeśli już poznawać nowe narzędzie to od samych podstaw, a do takowych na pewno będzie należało klepanie wszystkiego z palca. Przypomina to trochę poznawanie linuxa od instalowania Gentoo, ale co tam. Utworzony projekt wygląda na razie bardzo skromnie:

Nie ma tego wiele. Podpięte mamy tylko API do serwletów oraz JUnit i to jeszcze nie w wersji 4. Widok w IDE rzecz jasna nie odzwierciedla sytuacji na dysku – tak projekt wygląda od strony plików i katalogów:

Tutaj wiemy już coś więcej. W katalogu src będzie trzymany kod – zarówno ten “podstawowy”, jak i pliki związane z prezentacją w sieci jak np. CSS czy obrazki. Znajdziemy też wstępnie katalog do trzymania testów, a także przygotowany katalog dla plików wygenerowanych i gotowych do wdrożenia na serwerze. Sugeruję zajrzeć do pliku POM.xml, który jest podstawowym plikiem dla Mavena. Na razie jest on dość prosty i krótki:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>com.wordpress.chlebik</groupId>
 <artifactId>scjpsym</artifactId>
 <packaging>war</packaging>
 <version>1.0-SNAPSHOT</version>
 <name>scjpsym</name>
 <url>http://maven.apache.org</url>

 <dependencies>

 <dependency>
 <groupId>javax.servlet</groupId>
 <artifactId>servlet-api</artifactId>
 <version>2.5</version>
 <scope>provided</scope>
 </dependency>

 <dependency>
 <groupId>javax.servlet.jsp</groupId>
 <artifactId>jsp-api</artifactId>
 <version>2.1</version>
 <scope>provided</scope>
 </dependency>

 <dependency>
 <groupId>junit</groupId>
 <artifactId>junit</artifactId>
 <version>3.8.1</version>
 <scope>test</scope>
 </dependency>

 </dependencies>
 <build>
 <plugins>
 <plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-compiler-plugin</artifactId>
 <version>2.0.2</version>
 <configuration>
 <source>1.5</source>
 <target>1.5</target>
 </configuration>
 </plugin>
 </plugins>
 <finalName>scjpsym</finalName>
 </build>
 <properties>
 <netbeans.hint.deploy.server>Tomcat60</netbeans.hint.deploy.server>
 </properties>
</project>

Dość istotna jest ostatnia część pliku, a mianowicie plugin maven-compiler-plugin. Domyśłnie Maven kompiluje kod zgodny z Javą w wersji bodajże 1.3, co jest zasadniczo prehistorią. Dlatego też określenie docelowej wersji na 1.5. Powiedzmy, że na razie taki plik nam starcza. Jednakże aplikacja ma za zadanie działać ze Springiem, Hibernate i Spring MVC. Tutaj dochodzimy do sedna sprawy – zależności. W powyższym przykładzie element dependencies zawiera w sobie opisy pojedynczych bibliotek wraz z ich wersjami. Co więcej – dodanie bibliotek spowoduje przy budowaniu projektu próbę zainstalowania (w sensie dodania do projektu) bibliotek potrzebnych by pracowały te wskazane przez nas. Są to tzw. zależności przechodnie i każdy kto swego czasu pracował z linuxami opartymi na pakietach RPM doceni jak miłą rzeczą jest brak konieczności martwienia się o zależności.

Mała uwaga! Standardowo aplikacje tworzę w środowisku Windows. Zakładam rzecz jasna, że czytelnicy mojego bloga wiedzą, że kiedy napiszę dla przykładu, iż należy wywołać komendę mvn install to albo zrobią to z poziomu konsoli, albo np. Cygwina. O konieczności dopisania lokalizacji plików wykonywalnych Mavena do zmiennych systemowych chyba nie muszę wspominać.

Na początek powiedzmy, że chcemy poprawić naszą wersję JUnita. Trochę nie bardzo wygląda wersja 3.8.1, kiedy kilka tygodni temu wyszła wersja o 1 oczko “wyższa”. Edytujemy zatem plik POM.xml i zmieniamy numerek wersji na 4.8.1. Teraz wystarczy dać PPM na zakładce Test Libraries i wybrać opcję Download missing dependencies. Mamy nowego JUnita.

Zajmiemy się teraz Springiem. Postanowiłem używać wersji 2.5.6, gdyż najnowsza (trzecia) została wydana raptem w lutym bodajże, dlatego też nie jest dla mnie na tyle “wiarygodna” by pisać w niej edukacyjną aplikację (w sensie pierwszej styczności z frameworkiem). Do tego dorzucimy rzecz jasna Spring MVC. Takie zależności dopisujemy do odpowiedniego miejsca w POM.xml.

 <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring</artifactId>
    <version>2.5.6</version>
    <type>jar</type>
    <scope>compile</scope>
 </dependency>

 <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>2.5.6</version>
    <type>jar</type>
    <scope>compile</scope>
 </dependency>

Próba zbudowania projektu w tej chwili po prostu się nie powiedzie. Dlatego choćby, że nasze biblioteki nie zostały bynajmniej ściągnięte. Prawy przycisk myszy na zakładce Libraries i bodajże wybieramy Download source (nie jestem w stanie powtórzyć sytuacji, kiedy nie mam źródeł na kompie, nawet przy nowym projekcie). Jednakże zasadniczo przy dodawaniu zależności należy obserwować widok naszego projektu, gdyż NetBeans wszystko startuje od razu. Grzebiąc dalej trzeba by dodać Hibernate i tutaj zrobimy inaczej. Prawy przycisk myszy na zakładce libraries i wybieramy AddDependency. Pola na górze przeznaczone dla id artefaktu i grupy są podpięte pod autocompleter – zatem spokojnie można wpisać tam org.hi i na liście powinniśmy zostać już tylko z Hibernate. Ostatecznie po dodaniu wpis w pliku konfiguracyjnym wygląda tak:

  <dependency>
          <groupId>org.hibernate</groupId>
          <artifactId>hibernate</artifactId>
          <version>3.2.6.ga</version>
      </dependency>

Jeśli potencjalnie chcemy używać adnotacji do kontrolowania Hibernate, wówczas trzeba dodać jeszcze taką oto zależność:

 <dependency>
    	<groupId>org.hibernate</groupId>
    	<artifactId>hibernate-annotations</artifactId>
    	<version>3.4.0.GA</version>
    </dependency>

Poprzez dodanie tych dwóch zależności do listy używanych bibliotek zostanie przy okazji dołączony szereg innych. Teraz dla odmiany z konsoli uruchomimy Mavena by pociągnął wszystkie świeże zależności. Polecenie jest proste:

mvn compile

Niestety okazało się, że nie udało się dociągnąć zależności JTA – zrobimy to ręcznie – wchodząc na podaną przez Mavena stronę i ściągając plik JAR na nasz komputer. Potem w konsoli:

mvn install:install-file -DgroupId=javax.transaction -DartifactId=jta -Dversion=1.0.1B -Dpackaging=jar -Dfile=sciezka\do\pliku\jar\wraz\z\nim\samym

No i udało się – plik zainstalowany. Jednakże samo Hibernate to także plik konfiguracyjny. No i tutaj trzeba utworzyć ten plik, a także wskazać go aplikacji. W tym celu w katalogu projektu (konkretnie ścieżka to src/main/resources) tworzymy katalog hibernate i tam wrzucimy nasz plik hibernate.cfg.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>

    <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
    <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
    <property name="hibernate.connection.url">jdbc:postgresql://88.198.31.169/chlebik</property>
    <property name="hibernate.connection.username">moj_tajny_login</property>
    <property name="hibernate.connection.password">moje_tajne_haslo</property>


  </session-factory>
</hibernate-configuration>

I teraz w pliku POM.xml w elemencie build dodajemy taki wpis:

 <resources>
      <resource>
        <directory>src/main/resources/hibernate</directory>
      </resource>
 </resources>

Na sam koniec zaś musimy ściągnąć nasz connector do PostgreSQL. I znów kolejna zależność.

   <dependency>
       <groupId>postgresql</groupId>
       <artifactId>postgresql</artifactId>
       <version>8.3-603.jdbc4</version>
   </dependency>

Ufff, już teraz wiem co to znaczy konfiguracja XMLem. Pozostaje mieć nadzieję, że to wszystko jakoś działa, lub też będzie działać. Nie chciałbym wychodzić za bardzo do przodu i implementować tutaj DAO by sprawdzić czy w ogóle to połączenie działa (mam cichą nadzieję, że tak). Na razie zatem temat zostawiam – kiedy dojdziemy do implementowania logiki biznesowej aplikacji wówczas z całą pewnością zmienię treść wpisu gdyby cosik nie działało jak powinno.

Na sam koniec jeszcze dodatek do konfiguracji Mavena. Otóż podczas budowania projektów dostawałem wciąż komunikat o tym, iż kodowanie projektu to CP-1250 i w związku z tym aplikacja nie będzie przenośna (też nowość). Próby zmiany tego stanu rzeczy w właściwościach projektu nie dawały efektu, dlatego też trzeba było znów odwiedzić plik POM.xml. W sekcji build dorzucamy takie coś:

 <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.4.2</version>
        <configuration>
          <encoding>UTF-8</encoding>
        </configuration>
 </plugin>

I w ten oto sposób po zbudowaniu projektu (no i rzecz jasna ściągnięciu plugina) nasz output radośnie będzie generowany w UTF-8. Jak to w cywilizowanych krajach się dzieje 🙂 To tyle na dziś – w następnym wpisie spróbujemy coś zrobić z widokiem i postawić jakieś bardziej rozbudowane “Hello World”.

Advertisements

4 thoughts on “Mavenizacji ciąg dalszy – dlaczego tym razem wyszło

  1. Dabek

    Nie rozumiem po co skonfigurowałeś katalog src/main/resources/hibernate jako źródło zasobów, skoro dałeś go w domyślnie do tego przeznaczonym katalogu src/main/resources. Zrozumiałbym jeśli byś chciał dodać taki katalog src/main/hibernate.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s