Teraz zajmiemy się warstwą DAO. Na początek w znany nam już sposób dołączymy do projektu generyczne dao: LINK. Dzięki temu metody dla warstwy DAO utworzymy zupełnie generycznie. Ale żeby to zrobić musimy mieć dostęp do naszych encji. Potrzebna jest więc zależność modułu dao od modułu entities. Jak ją dodać? Tak samo jak zależność zewnętrzną!
1 2 3 4 5 6 7 8 9 10 11 12 |
<dependencies> <dependency> <groupId>pl.ekaczynski.kino</groupId> <artifactId>kino-entities</artifactId> <version>1.0.0</version> </dependency> <dependency> <groupId>com.googlecode.genericdao</groupId> <artifactId>dao-hibernate</artifactId> <version>1.2.0</version> </dependency> </dependencies> |
I już… Po odświeżeniu projektu (eclipse:eclipse) będziemy mogli w module dao korzystać z generycznego dao oraz wszystkich encji z modułu encji. Dla przykładu SeansDAOImpl:
1 2 3 4 5 6 7 8 9 |
package pl.ekaczynski.kino.dao; import pl.ekaczynski.kino.entities.Seans; import com.googlecode.genericdao.dao.hibernate.GenericDAO; public interface SeansDAO extends GenericDAO<Seans, Long> { } |
1 2 3 4 5 6 7 8 9 |
package pl.ekaczynski.kino.dao; import pl.ekaczynski.kino.entities.Seans; import com.googlecode.genericdao.dao.hibernate.GenericDAOImpl; public class SeansDAOImpl extends GenericDAOImpl<Seans, Long> implements SeansDAO { } |
Dodajmy zatem pozostałe zależności wewnętrzne zgodnie ze schematem:
Może się nasunąć pytanie: czy skoro moduł dao jest zależny do modułu entities, a moduł services od dao, to w module services też powinniśmy dodawać zależność do entities? Odpowiedź brzmi: tak! A to dlatego, że do pliku .jar modułu dao nie są załączane klasy z modułu entities a jedynie sama zależność od nich. Wyjaśni się to w dalszej części tego rozdziału.
by Yuppy:
Do modułu services w takim przypadku nie trzeba dodawać zależności z modułem entities. Tak jak piszesz, zależności są przechodnie, więc plik jar z encjami jak najbardziej w takim przypadku wyląduje w wynikowym archiwum war. Byłoby tak jak piszesz, jeśli zależność z modułem entities w module dao byłaby określona jako scope=provided.
Zależności dla modułu services:
1 2 3 4 5 6 7 8 9 10 11 12 |
<dependencies> <dependency> <groupId>pl.ekaczynski.kino</groupId> <artifactId>kino-entities</artifactId> <version>1.0.0</version> </dependency> <dependency> <groupId>pl.ekaczynski.kino</groupId> <artifactId>kino-dao</artifactId> <version>1.0.0</version> </dependency> </dependencies> |
oraz dla modułów client oraz worker:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<dependencies> <dependency> <groupId>pl.ekaczynski.kino</groupId> <artifactId>kino-entities</artifactId> <version>1.0.0</version> </dependency> <dependency> <groupId>pl.ekaczynski.kino</groupId> <artifactId>kino-services</artifactId> <version>1.0.0</version> </dependency> <dependency> <groupId>javax</groupId> <artifactId>javaee-web-api</artifactId> <version>6.0</version> <scope>provided</scope> </dependency> </dependencies> |
Zbudujmy teraz cały projekt i zobaczmy co trafi do wynikowych plików .war aplikacji client oraz worker. Interesuje nas folder z załączanymi bibliotekami, a więc WEB-INF\lib.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
kino-worker-1.0.0\WEB-INF\lib\antlr-2.7.6.jar kino-worker-1.0.0\WEB-INF\lib\commons-collections-3.1.jar kino-worker-1.0.0\WEB-INF\lib\dao-1.2.0.jar kino-worker-1.0.0\WEB-INF\lib\dao-hibernate-1.2.0.jar kino-worker-1.0.0\WEB-INF\lib\dom4j-1.6.1.jar kino-worker-1.0.0\WEB-INF\lib\hibernate-annotations-3.5.0-Final.jar kino-worker-1.0.0\WEB-INF\lib\hibernate-commons-annotations-3.2.0.Final.jar kino-worker-1.0.0\WEB-INF\lib\hibernate-core-3.5.0-Final.jar kino-worker-1.0.0\WEB-INF\lib\hibernate-jpa-2.0-api-1.0.0.Final.jar kino-worker-1.0.0\WEB-INF\lib\jta-1.1.jar kino-worker-1.0.0\WEB-INF\lib\kino-dao-1.0.0.jar kino-worker-1.0.0\WEB-INF\lib\kino-entities-1.0.0.jar kino-worker-1.0.0\WEB-INF\lib\kino-services-1.0.0.jar kino-worker-1.0.0\WEB-INF\lib\search-1.2.0.jar kino-worker-1.0.0\WEB-INF\lib\search-hibernate-1.2.0.jar kino-worker-1.0.0\WEB-INF\lib\slf4j-api-1.5.8.jar kino-worker-1.0.0\WEB-INF\lib\xml-apis-1.0.b2.jar |
Skąd tego aż tyle? Przecież kino-worker ma jedynie trzy zależności… I nie ma zależności do kino-dao, który też został załączony! To prawda ale maven nas nie oszukuje i nie załącza niczego przypadkiem. Kino-service wymaga do poprawnego działania kino-dao, dlatego ma do niego zależność. Budując aplikację maven buduje sobie tzn. drzewo zależności, które zawiera zależności modułów wraz z ich zależnościami rekurencyjnie wgłąb. Drzewo to można podejrzeć wpisując komendę:
1 |
mvn dependency:tree |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
[INFO] Scanning for projects... [INFO] ------------------------------------------------------------------------ [INFO] Reactor Build Order: [INFO] [INFO] kino-entities [INFO] kino-dao [INFO] kino-services [INFO] kino-client [INFO] kino-worker [INFO] kino-parent [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building kino-entities 1.0.0 [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- maven-dependency-plugin:2.1:tree (default-cli) @ kino-entities --- [INFO] pl.ekaczynski.kino:kino-entities:jar:1.0.0 [INFO] \- org.hibernate:hibernate-annotations:jar:3.5.0-Final:compile [INFO] +- org.hibernate:hibernate-core:jar:3.5.0-Final:compile [INFO] | +- antlr:antlr:jar:2.7.6:compile [INFO] | +- commons-collections:commons-collections:jar:3.1:compile [INFO] | +- dom4j:dom4j:jar:1.6.1:compile [INFO] | | \- xml-apis:xml-apis:jar:1.0.b2:compile [INFO] | \- javax.transaction:jta:jar:1.1:compile [INFO] +- org.hibernate:hibernate-commons-annotations:jar:3.2.0.Final:compile [INFO] +- org.hibernate.javax.persistence:hibernate-jpa-2.0-api:jar:1.0.0.Final:compile [INFO] \- org.slf4j:slf4j-api:jar:1.5.8:compile [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building kino-dao 1.0.0 [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- maven-dependency-plugin:2.1:tree (default-cli) @ kino-dao --- [INFO] pl.ekaczynski.kino:kino-dao:jar:1.0.0 [INFO] +- pl.ekaczynski.kino:kino-entities:jar:1.0.0:compile [INFO] | \- org.hibernate:hibernate-annotations:jar:3.5.0-Final:compile [INFO] | +- org.hibernate:hibernate-core:jar:3.5.0-Final:compile [INFO] | | +- antlr:antlr:jar:2.7.6:compile [INFO] | | +- commons-collections:commons-collections:jar:3.1:compile [INFO] | | +- dom4j:dom4j:jar:1.6.1:compile [INFO] | | | \- xml-apis:xml-apis:jar:1.0.b2:compile [INFO] | | \- javax.transaction:jta:jar:1.1:compile [INFO] | +- org.hibernate:hibernate-commons-annotations:jar:3.2.0.Final:compile [INFO] | +- org.hibernate.javax.persistence:hibernate-jpa-2.0-api:jar:1.0.0.Final:compile [INFO] | \- org.slf4j:slf4j-api:jar:1.5.8:compile [INFO] \- com.googlecode.genericdao:dao-hibernate:jar:1.2.0:compile [INFO] +- com.googlecode.genericdao:dao:jar:1.2.0:compile [INFO] | \- com.googlecode.genericdao:search:jar:1.2.0:compile [INFO] \- com.googlecode.genericdao:search-hibernate:jar:1.2.0:compile [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building kino-services 1.0.0 [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- maven-dependency-plugin:2.1:tree (default-cli) @ kino-services --- [INFO] pl.ekaczynski.kino:kino-services:jar:1.0.0 [INFO] +- pl.ekaczynski.kino:kino-entities:jar:1.0.0:compile [INFO] | \- org.hibernate:hibernate-annotations:jar:3.5.0-Final:compile [INFO] | +- org.hibernate:hibernate-core:jar:3.5.0-Final:compile [INFO] | | +- antlr:antlr:jar:2.7.6:compile [INFO] | | +- commons-collections:commons-collections:jar:3.1:compile [INFO] | | +- dom4j:dom4j:jar:1.6.1:compile [INFO] | | | \- xml-apis:xml-apis:jar:1.0.b2:compile [INFO] | | \- javax.transaction:jta:jar:1.1:compile [INFO] | +- org.hibernate:hibernate-commons-annotations:jar:3.2.0.Final:compile [INFO] | +- org.hibernate.javax.persistence:hibernate-jpa-2.0-api:jar:1.0.0.Final:compile [INFO] | \- org.slf4j:slf4j-api:jar:1.5.8:compile [INFO] \- pl.ekaczynski.kino:kino-dao:jar:1.0.0:compile [INFO] \- com.googlecode.genericdao:dao-hibernate:jar:1.2.0:compile [INFO] +- com.googlecode.genericdao:dao:jar:1.2.0:compile [INFO] | \- com.googlecode.genericdao:search:jar:1.2.0:compile [INFO] \- com.googlecode.genericdao:search-hibernate:jar:1.2.0:compile [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building kino-client 1.0.0 [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- maven-dependency-plugin:2.1:tree (default-cli) @ kino-client --- [INFO] pl.ekaczynski.kino:kino-client:war:1.0.0 [INFO] +- pl.ekaczynski.kino:kino-entities:jar:1.0.0:compile [INFO] | \- org.hibernate:hibernate-annotations:jar:3.5.0-Final:compile [INFO] | +- org.hibernate:hibernate-core:jar:3.5.0-Final:compile [INFO] | | +- antlr:antlr:jar:2.7.6:compile [INFO] | | +- commons-collections:commons-collections:jar:3.1:compile [INFO] | | +- dom4j:dom4j:jar:1.6.1:compile [INFO] | | | \- xml-apis:xml-apis:jar:1.0.b2:compile [INFO] | | \- javax.transaction:jta:jar:1.1:compile [INFO] | +- org.hibernate:hibernate-commons-annotations:jar:3.2.0.Final:compile [INFO] | +- org.hibernate.javax.persistence:hibernate-jpa-2.0-api:jar:1.0.0.Final:compile [INFO] | \- org.slf4j:slf4j-api:jar:1.5.8:compile [INFO] +- pl.ekaczynski.kino:kino-services:jar:1.0.0:compile [INFO] | \- pl.ekaczynski.kino:kino-dao:jar:1.0.0:compile [INFO] | \- com.googlecode.genericdao:dao-hibernate:jar:1.2.0:compile [INFO] | +- com.googlecode.genericdao:dao:jar:1.2.0:compile [INFO] | | \- com.googlecode.genericdao:search:jar:1.2.0:compile [INFO] | \- com.googlecode.genericdao:search-hibernate:jar:1.2.0:compile [INFO] \- javax:javaee-web-api:jar:6.0:provided [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building kino-worker 1.0.0 [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- maven-dependency-plugin:2.1:tree (default-cli) @ kino-worker --- [INFO] pl.ekaczynski.kino:kino-worker:war:1.0.0 [INFO] +- pl.ekaczynski.kino:kino-entities:jar:1.0.0:compile [INFO] | \- org.hibernate:hibernate-annotations:jar:3.5.0-Final:compile [INFO] | +- org.hibernate:hibernate-core:jar:3.5.0-Final:compile [INFO] | | +- antlr:antlr:jar:2.7.6:compile [INFO] | | +- commons-collections:commons-collections:jar:3.1:compile [INFO] | | +- dom4j:dom4j:jar:1.6.1:compile [INFO] | | | \- xml-apis:xml-apis:jar:1.0.b2:compile [INFO] | | \- javax.transaction:jta:jar:1.1:compile [INFO] | +- org.hibernate:hibernate-commons-annotations:jar:3.2.0.Final:compile [INFO] | +- org.hibernate.javax.persistence:hibernate-jpa-2.0-api:jar:1.0.0.Final:compile [INFO] | \- org.slf4j:slf4j-api:jar:1.5.8:compile [INFO] +- pl.ekaczynski.kino:kino-services:jar:1.0.0:compile [INFO] | \- pl.ekaczynski.kino:kino-dao:jar:1.0.0:compile [INFO] | \- com.googlecode.genericdao:dao-hibernate:jar:1.2.0:compile [INFO] | +- com.googlecode.genericdao:dao:jar:1.2.0:compile [INFO] | | \- com.googlecode.genericdao:search:jar:1.2.0:compile [INFO] | \- com.googlecode.genericdao:search-hibernate:jar:1.2.0:compile [INFO] \- javax:javaee-web-api:jar:6.0:provided [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building kino-parent 1.0.0 [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- maven-dependency-plugin:2.1:tree (default-cli) @ kino-parent --- [INFO] pl.ekaczynski.kino:kino-parent:pom:1.0.0 [INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary: [INFO] [INFO] kino-entities ..................................... SUCCESS [0.710s] [INFO] kino-dao .......................................... SUCCESS [0.128s] [INFO] kino-services ..................................... SUCCESS [0.092s] [INFO] kino-client ....................................... SUCCESS [0.060s] [INFO] kino-worker ....................................... SUCCESS [0.040s] [INFO] kino-parent ....................................... SUCCESS [0.009s] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.466s [INFO] Finished at: Thu Feb 13 20:07:43 CET 2014 [INFO] Final Memory: 6M/15M [INFO] ------------------------------------------------------------------------ |
Teraz już wszystko jasne. Nie ma potrzeby złączania zależnych modułów w jeden plik .jar. Wystarczy, że zależne pliki zostaną dołączone wraz z wynikową aplikacją, a dzięki drzewu zależności jest to możliwe. Pozostała jedynie mała zagadka: co się stało z jarem javax:javaee-web-api:jar:6.0 ? Jest zależność, a pliku .jar nie widać… Stało się tak dlatego, ponieważ został określony atrybut scope=provided właśnie po to, aby nie załączać tego jara do aplikacji, ponieważ będzie on dostępny na każdym serwerze aplikacyjnym i mógłby wywołać konflikt.
Kurs Maven’a [cz.01] – wstęp
Kurs Maven’a [cz.02] – od czego zacząć
Kurs Maven’a [cz.03] – do czego ten maven
Kurs Maven’a [cz.04] – zależności
Kurs Maven’a [cz.05] – instalacja
Kurs Maven’a [cz.06] – tworzenie modułu, archetyp
Kurs Maven’a [cz.07] – tworzenie modułu, kopiowanie
Kurs Maven’a [cz.08] – tworzenie modułu ręcznie
Kurs Maven’a [cz.09] – parent pom
Kurs Maven’a [cz.10] – import do Eclipsa
Kurs Maven’a [cz.11] – zależności zewnętrzne
> Kurs Maven’a [cz.12] – zależności wewnętrzne
Kurs Maven’a [cz.13] – scope, exclusion
Kurs Maven’a [cz.14] – parametry (properties)
Kurs Maven’a [cz.15] – profile
Kurs Maven’a [cz.16] – cykl życia
Kurs Maven’a [cz.17] – pluginy
Kurs Maven’a [cz.18] – repozytoria zdalne
Kurs Maven’a [cz.19] – podsumowanie