Uvod u Maven 2

Maven je popularan alat za izgradnju otvorenog koda za poslovne Java projekte, dizajniran da izbaci velik dio teškog rada iz procesa gradnje. Maven koristi deklarativni pristup, gdje su opisani struktura i sadržaj projekta, a ne pristup zasnovan na zadacima koji se koristi u Antu ili u tradicionalnim datotekama izrade, na primjer. To pomaže u provođenju razvojnih standarda u cijeloj tvrtki i smanjuje vrijeme potrebno za pisanje i održavanje skripti za izgradnju.

Deklarativni pristup zasnovan na životnom ciklusu koji koristi Maven 1 za mnoge je radikalan odmak od tradicionalnijih tehnika izrade, a Maven 2 u tom pogledu ide još dalje. U ovom članku prolazim kroz neke od glavnih principa iza Mavena 2, a zatim prolazim kroz radni primjer. Počnimo s pregledom osnova Mavena 2.

Objektni model projekta

Srce Maven 2 projekta je objektni model projekta (ili skraćeno POM). Sadrži detaljan opis vašeg projekta, uključujući informacije o upravljanju verzijama i upravljanjem konfiguracijom, ovisnostima, resursima za primjenu i testiranje, članovima tima i strukturi, i još mnogo toga. POM ima oblik XML datoteke ( pom.xml ) koja se nalazi u početnom direktoriju vašeg projekta. Ovdje je prikazana jednostavna datoteka pom.xml:

 4.0.0 com.javaworld.hotels HotelDatabase war 1.0-SNAPSHOT Maven Quick Start Archetype //maven.apache.org   junit junit 3.8.1 test   

Struktura direktorija Maven 2

Mnogo Mavenove moći dolazi iz standardnih praksi koje potiče. Programer koji je prethodno radio na projektu Maven odmah će se osjećati upoznat sa strukturom i organizacijom novog. Ne treba gubiti vrijeme na pronalaženje struktura direktorija, konvencija i prilagođenih skripti za izgradnju Ant za svaki projekt. Iako možete nadjačati bilo koje određeno mjesto direktorija za svoje ciljeve, zaista biste trebali poštovati standardnu ​​strukturu direktorija Maven 2 što je više moguće iz nekoliko razloga:

  • To čini vašu POM datoteku manjom i jednostavnijom
  • To olakšava razumijevanje projekta i olakšava život siromahu koji mora održavati projekt kad odete
  • Olakšava integraciju dodataka

Standardna struktura direktorija Maven 2 prikazana je na slici 1. U početni direktorij projekta ide POM (pom.xml) i dva poddirektorijuma: src za sav izvorni kod i cilj za generirane artefakte.

Direktorij src ima brojne poddirektorijume, od kojih svaki ima jasno definiranu svrhu:

  • src / main / java: Vaš Java izvorni kod ide ovamo (začudo!)
  • src / main / resources: ostali resursi koji su potrebni vašoj aplikaciji
  • src / main / filters: filtri resursa, u obliku datoteka svojstava, koje se mogu koristiti za definiranje varijabli poznatih samo u vrijeme izvođenja
  • src / main / config: konfiguracijske datoteke
  • src / main / webapp: Direktorij web aplikacija za WAR projekt
  • src / test / java: Jedinstveni testovi
  • src / test / resources: Resursi koji će se koristiti za jedinične testove, ali neće biti raspoređeni
  • src / test / filters: filtri resursa koji će se koristiti za jedinstvene testove, ali neće biti postavljeni
  • src / site: Datoteke korištene za generiranje web stranice projekta Maven

Životni ciklus projekta

Životni ciklus projekta je presudan za Maven 2. Većina programera upoznata je s pojmom faza izrade poput sastavljanja, testiranja i implementacije. Mrav ima mete s imenima poput ovih. U Mavenu 1 odgovarajući se dodaci pozivaju izravno. Na primjer, za kompajliranje Java izvornog koda koristi se javadodatak:

$maven java:compile

U Mavenu 2 ovaj je pojam standardiziran u skup dobro poznatih i dobro definiranih faza životnog ciklusa (vidi sliku 2). Umjesto prizivanja dodatke je maven 2 programer priziva fazu životnog ciklusa: $mvn compile.

Neke od korisnijih faza životnog ciklusa Maven 2 su sljedeće:

  • generate-sources: Generira bilo koji dodatni izvorni kod potreban za aplikaciju, što se obično postiže pomoću odgovarajućih dodataka
  • compile: Priprema izvorni kod projekta
  • test-compile: Sastavlja projektne jedinice testova
  • test: Pokreće jedinične testove (obično pomoću JUnit) u direktoriju src / test
  • package: Pakira prevedeni kôd u njegov format za distribuciju (JAR, WAR, itd.)
  • integration-test: Po potrebi obrađuje i raspoređuje paket u okruženje u kojem se mogu izvoditi testovi integracije
  • install: Instalira paket u lokalno spremište za upotrebu kao ovisnost u drugim projektima na vašem lokalnom računalu
  • deploy: Izvršeno u integracijskom ili izdavačkom okruženju, kopira konačni paket u udaljeno spremište za dijeljenje s drugim programerima i projektima

Dostupne su mnoge druge faze životnog ciklusa. Za više detalja pogledajte Resursi.

Ove faze ilustriraju blagodati preporučenih postupaka koje potiče Maven 2: kad se programer upozna s glavnim fazama životnog ciklusa Mavena 2, trebao bi se osjećati lagodno s fazama životnog ciklusa bilo kojeg Mavenova projekta.

Faza životnog ciklusa poziva dodatke potrebne za obavljanje posla. Pozivanje na fazu životnog ciklusa automatski poziva i sve prethodne faze životnog ciklusa. Budući da su faze životnog ciklusa ograničene, lako razumljive i dobro organizirane, upoznavanje sa životnim ciklusom novog projekta Maven 2 je jednostavno.

Prijelazne ovisnosti

Jedan od vrhunaca Mavena 2 je upravljanje tranzicijskom ovisnošću. Ako ste ikada koristili alat poput urpmi na Linuxu, znat ćete što su prijelazne ovisnosti. S Mavenom 1 morate prijaviti svaki JAR koji će biti potreban, izravno ili neizravno, vašoj prijavi. Na primjer, možete li navesti JAR-ove potrebne Hibernate aplikaciji? S Mavenom 2 ne morate. Samo recite Mavenu koje vam knjižnice trebaju, a Maven će se pobrinuti za knjižnice koje su potrebne vašim knjižnicama (i tako dalje).

Pretpostavimo da želite koristiti Hibernate u svom projektu. Jednostavno biste dodali novu ovisnost dependenciesodjeljku u pom.xml, kako slijedi:

  hibernate hibernate 3.0.3 compile 

I to je to! Ne morate loviti okolo da biste znali u kojim drugim JAR-ovima (i u kojim verzijama) trebate pokrenuti Hibernate 3.0.3; Maven će to učiniti za vas!

XML struktura za ovisnosti u Mavenu 2 slična je onoj koja se koristi u Mavenu 1. Glavna razlika je scopeoznaka, koja je objašnjena u sljedećem odjeljku.

Opsezi ovisnosti

U stvarnom poslovnom programu možda nećete trebati uključiti sve ovisnosti u postavljenu aplikaciju. Neki JAR-ovi potrebni su samo za jedinstveno testiranje, dok će druge poslužitelj aplikacija pružiti tijekom izvođenja. Koristeći tehniku ​​koja se naziva opseg ovisnosti , Maven 2 omogućuje vam korištenje određenih JAR-ova samo kada su vam zaista potrebni, a isključuje ih iz staze kada to ne čine.

Maven nudi četiri opsega ovisnosti:

  • compile: Ovisnost o opsegu kompajliranja dostupna je u svim fazama. To je zadana vrijednost.
  • provided: Navedena ovisnost koristi se za sastavljanje aplikacije, ali se neće primijeniti. Ovaj opseg koristili biste kada očekujete da JDK ili poslužitelj aplikacija pruža JAR. API-i za servlet su dobar primjer.
  • runtime: Ovisnosti o opsegu izvođenja nisu potrebne za kompilaciju, već samo za izvršavanje, poput JDBC (Java Database Connectivity) upravljačkih programa.
  • test: Ovisnosti o opsegu ispitivanja potrebne su samo za sastavljanje i pokretanje testova (na primjer, JUnit).

Projektna komunikacija

Važan dio svakog projekta je interna komunikacija. Iako to nije srebrni metak, web mjesto centraliziranog tehničkog projekta može uvelike poboljšati vidljivost unutar tima. Uz minimalan napor možete uspostaviti i pokrenuti web stranicu profesionalne kvalitete za vrlo malo vremena.

To poprima potpuno novu dimenziju kada je generacija web mjesta Maven integrirana u proces izrade pomoću kontinuirane integracije ili čak automatskih noćnih izrada. Tipično web mjesto Maven može svakodnevno objavljivati:

  • Opće informacije o projektu kao što su izvorna spremišta, praćenje kvara, članovi tima itd.
  • Izvješća o jediničnom ispitivanju i pokrivenosti ispitivanjem
  • Automatski pregledi kodova i uz Checkstyle i PMD
  • Informacije o konfiguraciji i verzijama
  • Ovisnosti
  • Javadoc
  • Izvorni kod u indeksiranom i unakrsnom HTML formatu
  • Popis članova tima
  • I mnogo više

Još jednom, svaki Maven pametni programer odmah će znati gdje treba potražiti kako bi se upoznao s novim Maven 2 projektom.

Praktični primjer

Now that we have seen a few of the basic notions used in Maven 2, let's see how it works in the real world. The rest of this tutorial examines how we would use Maven 2 on a simple Java Enterprise Edition project. The demo application involves an imaginary (and simplified) hotel database system. To demonstrate how Maven handles dependencies between projects and components, this application will be built using two components (see Figure 3):

  • A business logic component: HotelDatabase.jar
  • A Web application component: HotelWebApp.war

You can download the source code to follow along with the tutorial in Resources.

Set up your project environment

We start by configuring your work environment. In real-world projects, you will often need to define and configure environment or user-specific parameters that should not be distributed to all users. If you are behind a firewall with a proxy, for example, you need to configure the proxy settings so that Maven can download JARs from repositories on the Web. For Maven 1 users, the build.properties and project.properties files do this job. In Maven 2, they have been replaced by a settings.xml file, which goes in the $HOME/.m2 directory. Here is an example:

     http scott tiger 8080 my.proxy.url    

Create a new project with the archetype plug-in

The next step is to create a new Maven 2 project template for the business logic component. Maven 2 provides the archetype plug-in, which builds an empty Maven 2-compatible project directory structure. This plug-in proves convenient for getting a basic project environment up and running quickly. The default archetype model will produce a JAR library project. Several other artifact types are available for other specific project types, including Web applications, Maven plug-ins, and others.

Run the following command to set up your HotelDatabase.jar project:

mvn archetype:create -DgroupId=com.javaworld.hotels - DartifactId=HotelDatabase -Dpackagename=com.javaworld.hotels

Now you have a brand new Maven 2 project directory structure. Switch to the HotelDatabase directory to continue the tutorial.

Implementing the business logic

Sada implementiramo poslovnu logiku. HotelKlasa je jednostavna JavaBean. Na HotelModelklasa implementira dvije usluge: findAvailableCities()metoda, koja liste dostupnih gradova, a findHotelsByCity()metoda koja popisi svih hotela u određenom gradu. Ovdje je predstavljena jednostavna implementacija HotelModelklase koja se temelji na memoriji :

package com.javaworld.hotels.model;

import java.util.ArrayList; import java.util.List;

import com.javaworld.hotels.businessobjects.Hotel;

public class HotelModel {

/** * The list of all known cities in the database. */ private static String[] cities = { "Paris", "London", }; /** * The list of all hotels in the database. */ private static Hotel[] hotels = { new Hotel("Hotel Latin","Quartier latin","Paris",3), new Hotel("Hotel Etoile","Place de l'Etoile","Paris",4), new Hotel("Hotel Vendome","Place Vendome","Paris",5), new Hotel("Hotel Hilton","Trafalgar Square","London",4), new Hotel("Hotel Ibis","The City","London",3), }; /** * Returns the hotels in a given city. * @param city the name of the city * @return a list of Hotel objects */ public List findHotelsByCity(String city){ List hotelsFound = new ArrayList(); for(Hotel hotel : hotels) { if (hotel.getCity().equalsIgnoreCase(city)) { hotelsFound.add(hotel); } } return hotelsFound; } /** * Returns the list of cities in the database which have a hotel. * @return a list of city names */ public String[] findAvailableCities() { return cities; } }