Pengantar Maven 2

Maven adalah alat build open source yang populer untuk project Java perusahaan, yang dirancang untuk menghilangkan banyak kerja keras dalam proses build. Maven menggunakan pendekatan deklaratif, di mana struktur dan konten proyek dijelaskan, daripada pendekatan berbasis tugas yang digunakan di Ant atau file make tradisional, misalnya. Ini membantu menegakkan standar pengembangan di seluruh perusahaan dan mengurangi waktu yang dibutuhkan untuk menulis dan memelihara skrip build.

Deklaratif, pendekatan berbasis siklus hidup yang digunakan oleh Maven 1, bagi banyak orang, merupakan penyimpangan radikal dari teknik build yang lebih tradisional, dan Maven 2 melangkah lebih jauh dalam hal ini. Pada artikel ini, saya membahas beberapa prinsip dasar di balik Maven 2 dan kemudian melangkah melalui contoh yang berfungsi. Mari kita mulai dengan meninjau dasar-dasar Maven 2.

Model objek proyek

Inti dari proyek Maven 2 adalah model objek proyek (atau POM singkatnya). Ini berisi deskripsi rinci proyek Anda, termasuk informasi tentang versi dan manajemen konfigurasi, dependensi, aplikasi dan sumber daya pengujian, anggota tim dan struktur, dan banyak lagi. POM mengambil bentuk file XML ( pom.xml ), yang ditempatkan di direktori home project Anda. File pom.xml sederhana ditampilkan 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

Sebagian besar kekuatan Maven berasal dari praktik standar yang didorongnya. Seorang pengembang yang sebelumnya pernah mengerjakan proyek Maven akan segera merasa terbiasa dengan struktur dan organisasi yang baru. Tidak perlu membuang waktu untuk menciptakan kembali struktur direktori, konvensi, dan skrip build Ant yang disesuaikan untuk setiap project. Meskipun Anda dapat mengganti lokasi direktori tertentu untuk tujuan spesifik Anda sendiri, Anda benar-benar harus menghormati struktur direktori standar Maven 2 sebanyak mungkin, karena beberapa alasan:

  • Itu membuat file POM Anda lebih kecil dan lebih sederhana
  • Itu membuat proyek lebih mudah untuk dipahami dan membuat hidup lebih mudah bagi orang miskin yang harus memelihara proyek ketika Anda pergi
  • Ini membuatnya lebih mudah untuk mengintegrasikan plugin

Struktur direktori standar Maven 2 diilustrasikan pada Gambar 1. Dalam direktori home proyek terdapat POM (pom.xml) dan dua subdirektori: src untuk semua kode sumber dan target untuk artefak yang dihasilkan.

Direktori src memiliki sejumlah subdirektori, yang masing-masing memiliki tujuan yang jelas:

  • src / main / java: Kode sumber Java Anda ada di sini (cukup aneh!)
  • src / main / resources: Resource lain yang dibutuhkan aplikasi Anda
  • src / main / filter: Filter sumber daya, dalam bentuk file properti, yang dapat digunakan untuk menentukan variabel yang hanya diketahui pada waktu proses
  • src / main / config: File konfigurasi
  • src / main / webapp: Direktori aplikasi Web untuk proyek WAR
  • src / test / java: Pengujian unit
  • src / test / resources: Resource yang akan digunakan untuk pengujian unit, tetapi tidak akan diterapkan
  • src / test / filter: Filter resource yang akan digunakan untuk pengujian unit, tetapi tidak akan diterapkan
  • src / situs: File yang digunakan untuk membuat Website proyek Maven

Siklus hidup proyek

Daur hidup proyek sangat penting bagi Maven 2. Sebagian besar pengembang terbiasa dengan gagasan fase build seperti kompilasi, pengujian, dan penerapan. Semut punya target dengan nama seperti itu. Di Maven 1, plugin yang sesuai dipanggil secara langsung. Untuk mengkompilasi kode sumber Java, misalnya, javaplug-in digunakan:

$maven java:compile

Di Maven 2, gagasan ini distandarisasi menjadi satu set fase siklus hidup yang terkenal dan terdefinisi dengan baik (lihat Gambar 2). Alih-alih memanggil plug-in, Maven 2 pengembang memanggil fase siklus hidup: $mvn compile.

Beberapa fase siklus hidup Maven 2 yang lebih berguna adalah sebagai berikut:

  • generate-sources: Menghasilkan kode sumber tambahan apa pun yang diperlukan untuk aplikasi, yang umumnya dilakukan dengan menggunakan plugin yang sesuai
  • compile: Mengompilasi kode sumber proyek
  • test-compile: Menyusun pengujian unit proyek
  • test: Menjalankan pengujian unit (biasanya menggunakan JUnit) di direktori src / test
  • package: Paket kode yang dikompilasi dalam format yang dapat didistribusikan (JAR, WAR, dll.)
  • integration-test: Memproses dan menerapkan paket jika perlu ke dalam lingkungan tempat pengujian integrasi dapat dijalankan
  • install: Menginstal paket ke dalam repositori lokal untuk digunakan sebagai dependensi dalam project lain di komputer lokal Anda
  • deploy: Selesai dalam lingkungan integrasi atau rilis, salin paket akhir ke repositori jarak jauh untuk dibagikan dengan pengembang dan proyek lain

Tersedia banyak fase siklus hidup lainnya. Lihat Sumberdaya untuk lebih jelasnya.

Fase ini menggambarkan manfaat dari praktik yang direkomendasikan yang didorong oleh Maven 2: setelah pengembang terbiasa dengan fase siklus hidup utama Maven 2, dia akan merasa nyaman dengan fase siklus hidup proyek Maven mana pun.

Fase siklus hidup memanggil plugin yang diperlukan untuk melakukan pekerjaan itu. Memanggil fase siklus hidup secara otomatis memanggil fase siklus hidup sebelumnya juga. Karena fase siklus hidup terbatas jumlahnya, mudah dipahami, dan terorganisir dengan baik, menjadi mudah untuk memahami siklus hidup proyek Maven 2 yang baru.

Dependensi transitif

Salah satu yang menarik dari Maven 2 adalah manajemen ketergantungan transitif. Jika Anda pernah menggunakan alat seperti urpmi di komputer Linux, Anda akan tahu apa itu dependensi transitif. Dengan Maven 1, Anda harus mendeklarasikan setiap JAR yang akan dibutuhkan, secara langsung atau tidak langsung, oleh aplikasi Anda. Misalnya, dapatkah Anda membuat daftar JAR yang dibutuhkan oleh aplikasi Hibernate? Dengan Maven 2, Anda tidak perlu melakukannya. Anda cukup memberi tahu Maven perpustakaan mana yang Anda butuhkan, dan Maven akan mengurus perpustakaan yang dibutuhkan perpustakaan Anda (dan seterusnya).

Misalkan Anda ingin menggunakan Hibernate dalam proyek Anda. Anda cukup menambahkan dependensi baru ke dependenciesbagian di pom.xml, sebagai berikut:

  hibernate hibernate 3.0.3 compile 

Dan itu dia! Anda tidak perlu mencari tahu di mana JAR lain (dan di versi mana) yang Anda perlukan untuk menjalankan Hibernate 3.0.3; Maven akan melakukannya untuk Anda!

Struktur XML untuk dependensi di Maven 2 mirip dengan yang digunakan di Maven 1. Perbedaan utamanya adalah scopetag, yang dijelaskan di bagian berikut.

Lingkup ketergantungan

Dalam aplikasi perusahaan dunia nyata, Anda mungkin tidak perlu menyertakan semua dependensi dalam aplikasi yang diterapkan. Beberapa JAR hanya diperlukan untuk pengujian unit, sementara yang lain akan disediakan saat runtime oleh server aplikasi. Dengan menggunakan teknik yang disebut pelingkupan ketergantungan , Maven 2 memungkinkan Anda menggunakan JAR tertentu hanya saat Anda benar-benar membutuhkannya dan mengecualikannya dari classpath saat Anda tidak membutuhkannya.

Maven menyediakan empat cakupan dependensi:

  • compile: Dependensi cakupan-kompilasi tersedia di semua fase. Ini adalah nilai default.
  • provided: Ketergantungan yang diberikan digunakan untuk mengompilasi aplikasi, tetapi tidak akan diterapkan. Anda akan menggunakan cakupan ini jika Anda mengharapkan JDK atau server aplikasi menyediakan JAR. API servlet adalah contoh yang bagus.
  • runtime: Dependensi Runtime-scope tidak diperlukan untuk kompilasi, hanya untuk eksekusi, seperti driver JDBC (Java Database Connectivity).
  • test: Dependensi cakupan pengujian hanya diperlukan untuk mengompilasi dan menjalankan pengujian (JUnit, misalnya).

Komunikasi proyek

Bagian penting dari proyek apa pun adalah komunikasi internal. Meskipun ini bukan peluru perak, Situs Web proyek teknis terpusat dapat membantu meningkatkan visibilitas dalam tim. Dengan sedikit usaha, Anda dapat memiliki situs web proyek berkualitas profesional dan berjalan dalam waktu yang sangat singkat.

Ini mengambil dimensi yang benar-benar baru ketika pembuatan situs Maven diintegrasikan ke dalam proses pembuatan menggunakan integrasi berkelanjutan atau bahkan pembangunan malam otomatis. Situs Maven biasa dapat mempublikasikan, setiap hari:

  • Informasi proyek umum seperti repositori sumber, pelacakan kerusakan, anggota tim, dll.
  • Tes unit dan laporan cakupan tes
  • Ulasan kode otomatis dan dengan Checkstyle dan PMD
  • Konfigurasi dan informasi pembuatan versi
  • Dependensi
  • Javadoc
  • Kode sumber dalam format HTML yang diindeks dan direferensikan silang
  • Daftar anggota tim
  • Dan banyak lagi

Sekali lagi, setiap pengembang yang paham Maven akan segera mengetahui ke mana harus mencari agar terbiasa dengan proyek Maven 2 yang baru.

Contoh praktis

Sekarang kita telah melihat beberapa pengertian dasar yang digunakan di Maven 2, mari kita lihat cara kerjanya di dunia nyata. Sisa dari tutorial ini membahas bagaimana kita akan menggunakan Maven 2 pada proyek Java Enterprise Edition sederhana. Aplikasi demo melibatkan sistem database hotel imajiner (dan disederhanakan). Untuk mendemonstrasikan bagaimana Maven menangani dependensi antara proyek dan komponen, aplikasi ini akan dibangun menggunakan dua komponen (lihat Gambar 3):

  • Komponen logika bisnis: HotelDatabase.jar
  • Komponen aplikasi Web: HotelWebApp.war

Anda dapat mengunduh kode sumber untuk mengikuti tutorial di Sumber.

Siapkan lingkungan proyek Anda

Kami mulai dengan mengkonfigurasi lingkungan kerja Anda. Dalam proyek dunia nyata, Anda akan sering kali perlu menentukan dan mengonfigurasi lingkungan atau parameter khusus pengguna yang tidak boleh didistribusikan ke semua pengguna. Jika Anda berada di belakang firewall dengan proxy, misalnya, Anda perlu mengkonfigurasi pengaturan proxy agar Maven dapat mengunduh JAR dari repositori di Web. Untuk pengguna Maven 1, file build.properties dan project.properties melakukan tugas ini. Di Maven 2, mereka telah diganti dengan file settings.xml, yang berada di direktori $ HOME / .m2. Berikut ini contohnya:

     http scott tiger 8080 my.proxy.url    

Buat proyek baru dengan plug-in arketipe

Langkah selanjutnya adalah membuat template proyek Maven 2 baru untuk komponen logika bisnis. Maven 2 menyediakan archetypeplugin, yang membuat struktur direktori project kosong yang kompatibel dengan Maven 2. Plug-in ini terbukti nyaman untuk mengaktifkan dan menjalankan lingkungan proyek dasar dengan cepat. Model arketipe default akan menghasilkan proyek perpustakaan JAR. Beberapa jenis artefak lainnya tersedia untuk jenis proyek tertentu lainnya, termasuk aplikasi Web, plug-in Maven, dan lainnya.

Jalankan perintah berikut untuk menyiapkan proyek HotelDatabase.jar Anda:

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

Sekarang Anda memiliki struktur direktori proyek Maven 2 yang baru. Beralih ke HotelDatabasedirektori untuk melanjutkan tutorial.

Menerapkan logika bisnis

Sekarang kami menerapkan logika bisnis. The Hotelkelas adalah JavaBean sederhana. The HotelModelkelas mengimplementasikan dua layanan: findAvailableCities()metode, yang daftar kota yang tersedia, dan findHotelsByCity()metode, yang daftar semua hotel di kota tertentu. Implementasi HotelModelkelas berbasis memori yang sederhana disajikan 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; } }