Pengenalan kepada Maven 2

Maven adalah alat binaan sumber terbuka yang popular untuk projek Java perusahaan, yang dirancang untuk mengambil banyak kerja keras dari proses membina. Maven menggunakan pendekatan deklaratif, di mana struktur dan kandungan projek dijelaskan, lebih tepatnya pendekatan berdasarkan tugas yang digunakan di Ant atau dalam fail pembuatan tradisional, misalnya. Ini membantu menegakkan standard pembangunan di seluruh syarikat dan mengurangkan masa yang diperlukan untuk menulis dan mengekalkan skrip binaan.

Pendekatan deklaratif, berdasarkan kitaran hidup yang digunakan oleh Maven 1 adalah, bagi banyak orang, penyimpangan radikal dari teknik binaan yang lebih tradisional, dan Maven 2 melangkah lebih jauh dalam hal ini. Dalam artikel ini, saya membahas beberapa prinsipal asas di belakang Maven 2 dan kemudian mencontohi contoh kerja. Mari mulakan dengan mengkaji asas-asas Maven 2.

Model objek projek

Inti projek Maven 2 adalah model objek projek (atau POM pendek). Ia mengandungi penerangan terperinci mengenai projek anda, termasuk maklumat mengenai pengelolaan versi dan konfigurasi, pergantungan, aplikasi dan sumber ujian, ahli pasukan dan struktur, dan banyak lagi. POM mengambil bentuk fail XML ( pom.xml ), yang ditempatkan di direktori utama projek anda. Fail pom.xml ringkas ditunjukkan di sini:

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

Struktur direktori Maven 2

Sebilangan besar kekuatan Maven berasal dari amalan standard yang digalakkannya. Seorang pemaju yang sebelum ini mengusahakan projek Maven akan segera mengetahui struktur dan organisasi yang baru. Masa tidak perlu disia-siakan untuk mencipta semula struktur direktori, konvensyen, dan skrip membina Semut yang disesuaikan untuk setiap projek. Walaupun anda boleh mengganti lokasi direktori tertentu untuk tujuan khusus anda sendiri, anda harus benar-benar menghormati struktur direktori Maven 2 seberapa banyak yang mungkin, kerana beberapa sebab:

  • Ini menjadikan fail POM anda lebih kecil dan lebih mudah
  • Ini menjadikan projek lebih mudah difahami dan menjadikan hidup lebih mudah bagi lelaki miskin yang mesti mengekalkan projek ketika anda pergi
  • Ini menjadikannya lebih mudah untuk mengintegrasikan pemalam

Struktur direktori Maven 2 standard digambarkan dalam Rajah 1. Dalam direktori rumah projek terdapat POM (pom.xml) dan dua subdirektori: src untuk semua kod sumber dan sasaran untuk artifak yang dihasilkan.

Direktori src mempunyai sebilangan subdirektori, masing-masing mempunyai tujuan yang jelas:

  • src / main / java: Kod sumber Java anda ada di sini (cukup aneh!)
  • src / main / resources: Sumber lain yang diperlukan oleh aplikasi anda
  • src / main / filter: Penapis sumber, dalam bentuk fail sifat, yang dapat digunakan untuk menentukan pemboleh ubah yang hanya diketahui pada waktu berjalan
  • src / main / config: Fail konfigurasi
  • src / main / webapp: Direktori aplikasi Web untuk projek WAR
  • src / test / java: Ujian unit
  • src / test / resources: Sumber yang akan digunakan untuk ujian unit, tetapi tidak akan digunakan
  • src / test / filter: Penapis sumber yang akan digunakan untuk ujian unit, tetapi tidak akan digunakan
  • src / site: Fail yang digunakan untuk menghasilkan Laman web projek Maven

Kitaran hayat projek

Kitaran hayat projek adalah pusat dari Maven 2. Sebilangan besar pemaju mengetahui konsep fasa binaan seperti menyusun, menguji, dan menggunakan. Semut mempunyai sasaran dengan nama seperti itu. Di Maven 1, pemalam yang sesuai dipanggil secara langsung. Untuk menyusun kod sumber Java, misalnya, javaplug-in digunakan:

$maven java:compile

Di Maven 2, pengertian ini diseragamkan menjadi sekumpulan fasa kitaran hidup yang terkenal dan jelas (lihat Gambar 2). Sepatutnya diminta plug-in, pemaju Maven 2 menyembah fasa kitaran hayat: $mvn compile.

Beberapa fasa kitaran hidup Maven 2 yang lebih berguna adalah seperti berikut:

  • generate-sources: Menghasilkan kod sumber tambahan yang diperlukan untuk aplikasi, yang umumnya dapat dilakukan dengan menggunakan pemalam yang sesuai
  • compile: Menyusun kod sumber projek
  • test-compile: Menyusun ujian unit projek
  • test: Menjalankan ujian unit (biasanya menggunakan JUnit) di direktori src / test
  • package: Mengemas kod yang disusun dalam format yang boleh diedarkan (JAR, WAR, dll.)
  • integration-test: Memproses dan menggunakan paket jika perlu ke persekitaran di mana ujian integrasi dapat dijalankan
  • install: Pasang pakej ke repositori tempatan untuk digunakan sebagai ketergantungan dalam projek lain pada mesin tempatan anda
  • deploy: Selesai dalam lingkungan integrasi atau pelepasan, salin pakej terakhir ke repositori jauh untuk dikongsi dengan pemaju dan projek lain

Banyak fasa kitaran hidup lain ada. Lihat Sumber untuk maklumat lebih lanjut.

Fasa-fasa ini menggambarkan manfaat amalan yang disarankan oleh Maven 2: setelah pembangun mengetahui fasa kitaran hidup Maven 2 yang utama, dia harus merasa selesa dengan fasa kitaran hidup mana-mana projek Maven.

Fasa kitaran hidup memerlukan pemalam yang perlu dilakukannya. Memohon fasa kitaran hidup secara automatik memanggil fasa kitaran hayat sebelumnya juga. Oleh kerana fasa kitaran hayat terhad jumlahnya, mudah difahami, dan tersusun dengan baik, menjadi biasa dengan kitaran hayat projek Maven 2 yang baru adalah mudah.

Pergantungan transitif

Salah satu sorotan Maven 2 adalah pengurusan pergantungan transitif. Sekiranya anda pernah menggunakan alat seperti urpmi pada kotak Linux, anda akan mengetahui apa itu pergantungan transitif. Dengan Maven 1, anda mesti menyatakan setiap JAR yang diperlukan, secara langsung atau tidak langsung, oleh aplikasi anda. Sebagai contoh, bolehkah anda menyenaraikan JAR yang diperlukan oleh aplikasi Hibernate? Dengan Maven 2, anda tidak perlu. Anda hanya memberitahu Maven perpustakaan mana yang anda perlukan, dan Maven akan mengurus perpustakaan yang diperlukan oleh perpustakaan anda (dan sebagainya).

Katakan anda mahu menggunakan Hibernate dalam projek anda. Anda hanya akan menambahkan kebergantungan baru pada dependenciesbahagian di pom.xml, seperti berikut:

  hibernate hibernate 3.0.3 compile 

Dan itu sahaja! Anda tidak perlu mencari-cari untuk mengetahui JAR lain (dan versi mana) yang anda perlukan untuk menjalankan Hibernate 3.0.3; Maven akan melakukannya untuk anda!

Struktur XML untuk kebergantungan di Maven 2 serupa dengan yang digunakan di Maven 1. Perbezaan utama adalah scopetag, yang dijelaskan dalam bahagian berikut.

Skop ketergantungan

Dalam aplikasi perusahaan dunia nyata, anda mungkin tidak perlu memasukkan semua kebergantungan dalam aplikasi yang digunakan. Sebilangan JAR diperlukan hanya untuk pengujian unit, sementara yang lain akan disediakan pada waktu berjalan oleh pelayan aplikasi. Dengan menggunakan teknik yang disebut dependency scoping , Maven 2 membolehkan anda menggunakan JAR tertentu hanya apabila anda benar-benar memerlukannya dan mengecualikannya dari jalan kelas apabila anda tidak memerlukannya.

Maven menyediakan empat ruang bergantung:

  • compile: Ketergantungan skop kompilasi tersedia dalam semua fasa. Ini adalah nilai lalai.
  • provided: Ketergantungan yang disediakan digunakan untuk menyusun aplikasi, tetapi tidak akan digunakan. Anda akan menggunakan skop ini apabila anda mengharapkan JDK atau pelayan aplikasi menyediakan JAR. API servlet adalah contoh yang baik.
  • runtime: Ketergantungan ruang waktu tidak diperlukan untuk penyusunan, hanya untuk pelaksanaan, seperti pemacu JDBC (Java Database Connectivity).
  • test: Kebergantungan skop ujian hanya diperlukan untuk menyusun dan menjalankan ujian (misalnya, JUnit).

Komunikasi projek

Bahagian penting dari sebarang projek adalah komunikasi dalaman. Walaupun ia bukan peluru perak, Laman web projek teknikal terpusat dapat membantu meningkatkan penglihatan dalam pasukan. Dengan usaha yang minimum, anda dapat menghidupkan dan menjalankan laman web projek berkualiti profesional dalam waktu yang sangat singkat.

Ini memerlukan dimensi yang sama sekali apabila generasi laman Maven disatukan ke dalam proses pembuatan menggunakan integrasi berterusan atau bahkan pembuatan malam automatik. Laman web khas Maven dapat menerbitkan, setiap hari:

  • Maklumat projek umum seperti repositori sumber, pengesanan kecacatan, ahli pasukan, dll.
  • Laporan liputan ujian dan ujian unit
  • Ulasan kod automatik dan dengan Gaya Pemeriksaan dan PMD
  • Maklumat konfigurasi dan versi
  • Kebergantungan
  • Javadoc
  • Kod sumber dalam format HTML yang diindeks dan dirujuk silang
  • Senarai ahli pasukan
  • Dan banyak lagi

Sekali lagi, mana-mana pemaju Maven yang cerdas akan segera mengetahui di mana harus mencari untuk menjadi biasa dengan projek Maven 2 yang baru.

Contoh praktikal

Sekarang setelah kita melihat beberapa konsep asas yang digunakan dalam Maven 2, mari kita lihat bagaimana ia berfungsi di dunia nyata. Selebihnya dari tutorial ini mengkaji bagaimana kita akan menggunakan Maven 2 pada projek Java Enterprise Edition yang ringkas. Aplikasi demo melibatkan sistem pangkalan data hotel khayalan (dan dipermudah). Untuk menunjukkan bagaimana Maven menangani kebergantungan antara projek dan komponen, aplikasi ini akan dibina menggunakan dua komponen (lihat Gambar 3):

  • Komponen logik perniagaan: HotelDatabase.jar
  • Komponen aplikasi Web: HotelWebApp.war

Anda boleh memuat turun kod sumber untuk diikuti bersama dengan tutorial di Sumber.

Siapkan persekitaran projek anda

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

Sekarang kita menerapkan logik perniagaan. The Hotelkelas adalah JavaBean mudah. Yang HotelModelmelaksanakan kelas dua perkhidmatan: findAvailableCities()kaedah, yang senarai bandar-bandar, dan satu findHotelsByCity()kaedah, yang menyenaraikan semua hotel di bandar yang diberikan. Pelaksanaan HotelModelkelas berdasarkan memori yang ringkas ditunjukkan di sini:

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; } }