Java Persistence (JPA) 2.0 praktycznie - zestawienie środowiska z EclipseLink i Apache Maven 2
Z Jacek Laskowski - Wiki Projektanta Java EE
Jak to ma zwykle miejsce w przypadku poznawania nowej specyfikacji najlepiej idzie mi w sposób praktyczny. Chciałoby się móc od razu stworzyć w pełni funkcjonalną aplikację w wybranej technologii, ale bez względu na ostateczny rezultat prac i tak zestawienie środowiska będzie pierwszym krokiem. Dobrze jest rozpoczynać kilkoma drobnymi krokami niż od razu porywać się na jeden, wielki skok, więc niewielkie przypadki testowe z udziałem Apache Maven i JUnit świetnie sprawdzą się w swoich rolach. Z pomocą konwencji mavenowych niewiele potrzeba, aby stworzyć kompletne środowisko, a dodanie do projektu nowej specyfikacji Java Persistence (JPA) 2.0 sprowadza się jedynie do określenia zależności projektowych. Jedynym wymaganiem jest właśnie wspomniany Maven, a reszta "dojdzie" w trakcie pracy.
Nie zacznę od IDE, a od linii poleceń. Wybór IDE jest dla mnie drugorzędny i pozostawiam go Waszemu rozsądkowi i upodobaniom. Dla mnie, najważniejszymi zaletami takiego podejścia jest włączenie do zespołu projektowego każdego programisty bez względu na wykorzystywane IDE (aż trudno uwierzyć, ile projektów narzuca wybór IDE jako kluczowy aspekt sukcesu projektu) oraz prostota definiowania zależności projektowych przez deklarację zależności zamiast ich pobierania, a wcześniej wręcz ich poszukiwania i rozwiązywania zależności pośrednich. Zrzucam to na barki Mavena.
Kody źródłowe projektu znajdują się w moim repozytorium Mercuriala na Google Code jako jpa2-przez-przyklady.
Stworzenie struktury projektowej z Apache Maven - mvn archetype:generate
Zaczynam typowo poleceniem mvn archetype:generate z zalecaną opcją -B - utworzenia projektu w trybie wsadowym (nieinteraktywnym).
mvn archetype:generate -B \ -DarchetypeArtifactId=maven-archetype-quickstart \ -DgroupId=pl.jaceklaskowski.jpa2 \ -DartifactId=jpa2-przez-przyklady \ -Dversion=1.0
W ten sposób stworzyłem strukturę projektu jpa2-przez-przyklady.
Podobną operację mógłbym wykonać z poziomu IDE (z założeniem, że wspiera Apache Maven) i nie widzę powodów, dla których nie powinienem tak robić przy kolejnych podejściach do poznawania nowych technologii. Mam wrażenie, jakby przyzwyczajenie brało górę i linia poleceń omamiła mnie swoją prostotą. Podobnie z Mavenem, którego możnaby zamienić czymś bardziej nowoczesnym, np. Gradle.
Konfiguracja projektu z pomocą IDE - NetBeans IDE 6.8
Otwieramy projekt w wybranym IDE. W moim przypadku będzie to NetBeans IDE 6.8. Jego zaletą jest wbudowana obsługa projektów mavenowych, co w przypadku konkurenta - Eclipse IDE - wymaga zainstalowania dodatkowej wtyczki M2Eclipse. Na chwilę obecną szkoda na to czasu.
Otwarcie projektu w NetBeans IDE 6.8 sprowadza się do File | Open Project (alternatywnie Cmd+Shift+O na MacOS).
Następnie należy podnieść konfigurację projektu do wersji Java SE 6, dodać zależność JPA 2.0 z projektu referencyjnego EclipseLink oraz podnieść domyślną wersję JUnit do 4.7 (ostatnia wersja 4.8.1 nie jest jeszcze w repozytorium Mavena - głosuj, aby to zmienić). Ostatecznie, plik konfiguracyjny projektu pom.xml prezentuje się następująco:
<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>pl.jaceklaskowski.jpa2</groupId> <artifactId>jpa2-przez-przyklady</artifactId> <packaging>jar</packaging> <version>1.0</version> <name>jpa2-przez-przyklady</name> <url>http://www.jaceklaskowski.pl/wiki/Java_Persistence_%28JPA%29_2.0_praktycznie_-_zestawienie_%C5%9Brodowiska_z_EclipseLink_i_Apache_Maven_2</url> <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.6</source> <target>1.6</target> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.7</version> <scope>test</scope> </dependency> <dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>eclipselink</artifactId> <version>2.0.0</version> </dependency> <dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>javax.persistence</artifactId> <version>2.0.0</version> </dependency> </dependencies> <repositories> <repository> <id>EclipseLink Repo</id> <url>http://www.eclipse.org/downloads/download.php?r=1&nf=1&file=/rt/eclipselink/maven.repo</url> </repository> </repositories> </project>
Sprawdzenie poprawności konfiguracji projektu - pl.jaceklaskowski.jpa2.PersistenceUtilTest
Stwórzmy klasę testową pl.jaceklaskowski.jpa2.PersistenceUtilTest wykorzystującą funkcjonalność JPA 2.0 w katalogu src/test/java jak niżej:
package pl.jaceklaskowski.jpa2; import javax.persistence.Persistence; import javax.persistence.PersistenceUtil; import org.junit.Test; public class PersistenceUtilTest { @Test public void shouldExistGetPersistenceUtil() { PersistenceUtil persistenceUtil = Persistence.getPersistenceUtil(); assert persistenceUtil != null; // dowiedzmy się z jakim dostawcą mamy do czynienia System.out.println(persistenceUtil.getClass()); } }
Uruchomienie w NetBeans IDE sprowadza się do wybrania menu Test File pod prawym przyciskiem myszki na klasie w widoku Projects (można również Cmd+F6 na MacOS). Zielono, czyli działa! Środowisko mamy gotowe do dalszej nauki.
Dla wytrwałych: uruchomienie testowania pojedynczej klasy testowej w Maven sprowadza się do polecenia mvn -Dtest=PersistenceUtilTest test.
devmac:jpa2-przez-przyklady jacek$ mvn -Dtest=PersistenceUtilTest test [INFO] Scanning for projects... [INFO] ------------------------------------------------------------------------ [INFO] Building jpa2-przez-przyklady [INFO] task-segment: [test] [INFO] ------------------------------------------------------------------------ ... ------------------------------------------------------- T E S T S ------------------------------------------------------- Running pl.jaceklaskowski.jpa2.PersistenceUtilTest class javax.persistence.Persistence$PersistenceUtilImpl Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.038 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESSFUL [INFO] ------------------------------------------------------------------------
