Προγραμματισμός

Εισαγωγή στο Maven 2

Το Maven είναι ένα δημοφιλές εργαλείο δημιουργίας ανοιχτού κώδικα για εταιρικά έργα Java, σχεδιασμένο να αφαιρεί μεγάλο μέρος της σκληρής δουλειάς από τη διαδικασία κατασκευής. Ο Maven χρησιμοποιεί μια δηλωτική προσέγγιση, όπου περιγράφεται η δομή και τα περιεχόμενα του έργου, αντί για παράδειγμα, η προσέγγιση βάσει εργασιών που χρησιμοποιείται στο Ant ή σε παραδοσιακά αρχεία δημιουργίας, για παράδειγμα. Αυτό βοηθά στην επιβολή προτύπων ανάπτυξης σε ολόκληρη την εταιρεία και μειώνει το χρόνο που απαιτείται για τη σύνταξη και τη συντήρηση σεναρίων build.

Η δηλωτική προσέγγιση που βασίζεται στον κύκλο ζωής που χρησιμοποιείται από το Maven 1 είναι, για πολλούς, μια ριζική απομάκρυνση από πιο παραδοσιακές τεχνικές κατασκευής, και το Maven 2 προχωρά ακόμη περισσότερο σε αυτό το θέμα. Σε αυτό το άρθρο, εξετάζω μερικές από τις βασικές αρχές πίσω από το Maven 2 και έπειτα ακολουθώ ένα λειτουργικό παράδειγμα. Ας ξεκινήσουμε εξετάζοντας τις βασικές αρχές του Maven 2.

Το μοντέλο αντικειμένου έργου

Η καρδιά ενός έργου Maven 2 είναι το μοντέλο αντικειμένου του έργου (ή POM για συντομία). Περιέχει μια λεπτομερή περιγραφή του έργου σας, συμπεριλαμβανομένων πληροφοριών σχετικά με τη διαχείριση εκδόσεων και διαμόρφωσης, τις εξαρτήσεις, τους πόρους εφαρμογής και δοκιμών, τα μέλη της ομάδας και τη δομή και πολλά άλλα. Το POM έχει τη μορφή αρχείου XML (pom.xml), που τοποθετείται στον αρχικό κατάλογο του έργου σας. Εδώ εμφανίζεται ένα απλό αρχείο 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 τεστ 

Η δομή καταλόγου Maven 2

Μεγάλο μέρος της δύναμης του Maven προέρχεται από τις συνήθεις πρακτικές που ενθαρρύνει. Ένας προγραμματιστής που έχει προηγουμένως εργαστεί σε ένα έργο Maven θα αισθανθεί αμέσως εξοικειωμένος με τη δομή και την οργάνωση ενός νέου. Δεν χρειάζεται να σπαταλάμε χρόνο επαναπροσδιορίζοντας δομές καταλόγου, συμβάσεις και προσαρμοσμένα σενάρια κατασκευής Ant για κάθε έργο. Αν και μπορείτε να παρακάμψετε οποιαδήποτε συγκεκριμένη τοποθεσία καταλόγου για τους δικούς σας συγκεκριμένους σκοπούς, θα πρέπει πραγματικά να σέβεστε τη βασική δομή καταλόγου Maven 2 όσο το δυνατόν περισσότερο, για διάφορους λόγους:

  • Κάνει το αρχείο POM μικρότερο και απλούστερο
  • Κάνει το έργο πιο κατανοητό και κάνει τη ζωή πιο εύκολη για τον φτωχό άντρα που πρέπει να συντηρήσει το έργο όταν φύγετε
  • Διευκολύνει την ενσωμάτωση προσθηκών

Η τυπική δομή καταλόγου Maven 2 απεικονίζεται στο Σχήμα 1. Στον αρχικό κατάλογο του έργου πηγαίνει το POM (pom.xml) και δύο υποκατάλογοι: src για όλο τον πηγαίο κώδικα και στόχο για παραγόμενα αντικείμενα.

Ο κατάλογος src έχει έναν αριθμό υποκαταλόγων, καθένας από τους οποίους έχει σαφώς καθορισμένο σκοπό:

  • src / main / java: Ο πηγαίος κώδικας Java πηγαίνει εδώ (περίεργα!)
  • src / main / πόροι: Άλλοι πόροι που χρειάζεται η εφαρμογή σας
  • src / main / φίλτρα: Φίλτρα πόρων, με τη μορφή αρχείων ιδιοτήτων, τα οποία μπορούν να χρησιμοποιηθούν για τον καθορισμό μεταβλητών που είναι γνωστές μόνο κατά το χρόνο εκτέλεσης
  • src / main / config: Αρχεία διαμόρφωσης
  • src / main / webapp: Ο κατάλογος εφαρμογών Web για ένα έργο WAR
  • src / test / java: Δοκιμές μονάδας
  • src / test / πόροι: Πόροι που θα χρησιμοποιηθούν για δοκιμές μονάδας, αλλά δεν θα αναπτυχθούν
  • src / test / φίλτρα: Φίλτρα πόρων που θα χρησιμοποιηθούν για δοκιμές μονάδας, αλλά δεν θα αναπτυχθούν
  • src / ιστότοπος: Αρχεία που χρησιμοποιούνται για τη δημιουργία του ιστότοπου του έργου Maven

Κύκλοι ζωής έργου

Οι κύκλοι ζωής του έργου είναι κεντρικοί για το Maven 2. Οι περισσότεροι προγραμματιστές είναι εξοικειωμένοι με την έννοια των φάσεων κατασκευής όπως η μεταγλώττιση, η δοκιμή και η ανάπτυξη. Το μυρμήγκι έχει στόχους με ονόματα όπως αυτά. Στο Maven 1, οι αντίστοιχες προσθήκες καλούνται απευθείας. Για να μεταγλωττίσετε τον πηγαίο κώδικα Java, για παράδειγμα, το Ιάβα Το plug-in χρησιμοποιείται:

$ maven java: μεταγλώττιση

Στο Maven 2, αυτή η έννοια τυποποιείται σε ένα σύνολο γνωστών και καλά καθορισμένων φάσεων κύκλου ζωής (βλ. Σχήμα 2). Αντί να επικαλεστεί προσθήκες, ο προγραμματιστής του Maven 2 επικαλείται μια φάση κύκλου ζωής: Μεταγλώττιση $ mvn.

Μερικές από τις πιο χρήσιμες φάσεις κύκλου ζωής του Maven 2 είναι οι εξής:

  • δημιουργία πηγών: Δημιουργεί οποιονδήποτε επιπλέον πηγαίο κώδικα που απαιτείται για την εφαρμογή, ο οποίος γενικά επιτυγχάνεται χρησιμοποιώντας τις κατάλληλες προσθήκες
  • συντάσσω: Μεταγλωττίζει τον πηγαίο κώδικα του έργου
  • δοκιμή-μεταγλώττιση: Συγκεντρώνει τις δοκιμές μονάδας έργου
  • δοκιμή: Εκτελεί τις δοκιμές μονάδας (συνήθως χρησιμοποιώντας JUnit) στον κατάλογο src / test
  • πακέτο: Συσκευάζει τον μεταγλωττισμένο κώδικα στη διανεμήσιμη μορφή του (JAR, WAR, κ.λπ.)
  • δοκιμή ολοκλήρωσης: Επεξεργάζεται και αναπτύσσει το πακέτο, εάν είναι απαραίτητο, σε περιβάλλον όπου μπορούν να εκτελεστούν δοκιμές ενοποίησης
  • εγκαθιστώ: Εγκαθιστά το πακέτο στο τοπικό αποθετήριο για χρήση ως εξάρτηση σε άλλα έργα στον τοπικό υπολογιστή σας
  • παρατάσσω: Έγινε σε περιβάλλον ολοκλήρωσης ή έκδοσης, αντιγράφει το τελικό πακέτο στο απομακρυσμένο αποθετήριο για κοινή χρήση με άλλους προγραμματιστές και έργα

Υπάρχουν πολλές άλλες φάσεις κύκλου ζωής. Δείτε τους πόρους για περισσότερες λεπτομέρειες.

Αυτές οι φάσεις δείχνουν τα οφέλη των προτεινόμενων πρακτικών που ενθαρρύνονται από το Maven 2: όταν ένας προγραμματιστής εξοικειωθεί με τις κύριες φάσεις κύκλου ζωής του Maven 2, θα πρέπει να αισθάνεται άνετα με τις φάσεις κύκλου ζωής οποιουδήποτε έργου Maven.

Η φάση κύκλου ζωής επικαλείται τις προσθήκες που χρειάζεται για να κάνει τη δουλειά. Η επίκληση μιας φάσης κύκλου ζωής καλεί αυτόματα και τυχόν προηγούμενες φάσεις κύκλου ζωής. Δεδομένου ότι οι φάσεις του κύκλου ζωής είναι περιορισμένες σε αριθμό, είναι εύκολο να γίνει κατανοητό και καλά οργανωμένο, είναι εύκολο να εξοικειωθείτε με τον κύκλο ζωής ενός νέου έργου Maven 2.

Μεταβατικές εξαρτήσεις

Ένα από τα σημαντικότερα σημεία του Maven 2 είναι η διαχείριση της μεταβατικής εξάρτησης. Εάν έχετε χρησιμοποιήσει ποτέ ένα εργαλείο όπως urpmi σε ένα πλαίσιο Linux, θα γνωρίζετε ποιες είναι οι μεταβατικές εξαρτήσεις. Με το Maven 1, πρέπει να δηλώσετε κάθε JAR που θα χρειαστεί, άμεσα ή έμμεσα, από την αίτησή σας. Για παράδειγμα, μπορείτε να απαριθμήσετε τα JAR που απαιτούνται από μια εφαρμογή αδρανοποίησης; Με το Maven 2, δεν χρειάζεται. Απλά πείτε στον Maven ποιες βιβλιοθήκες εσείς ανάγκη και ο Maven θα φροντίσει τις βιβλιοθήκες που χρειάζονται οι βιβλιοθήκες σας (και ούτω καθεξής).

Ας υποθέσουμε ότι θέλετε να χρησιμοποιήσετε το Hibernate στο έργο σας. Θα προσθέσατε απλά μια νέα εξάρτηση στο εξαρτήσεις ενότητα στο pom.xml, ως εξής:

  αδρανοποίηση αδρανοποίησης 3.0.3 μεταγλώττιση 

Και αυτό είναι! Δεν χρειάζεται να κυνηγήσετε για να μάθετε σε ποια άλλα JAR (και σε ποιες εκδόσεις) πρέπει να εκτελέσετε το Hibernate 3.0.3. Ο Maven θα το κάνει για εσάς!

Η δομή XML για εξαρτήσεις στο Maven 2 είναι παρόμοια με αυτήν που χρησιμοποιείται στο Maven 1. Η κύρια διαφορά είναι η πεδίο εφαρμογής ετικέτα, η οποία εξηγείται στην ακόλουθη ενότητα.

Πεδία εξάρτησης

Σε μια πραγματική εταιρική εφαρμογή, ενδέχεται να μην χρειάζεται να συμπεριλάβετε όλες τις εξαρτήσεις στην υλοποιημένη εφαρμογή. Ορισμένα JAR απαιτούνται μόνο για δοκιμή μονάδας, ενώ άλλα θα παρέχονται κατά το χρόνο εκτέλεσης από το διακομιστή εφαρμογών. Χρησιμοποιώντας μια τεχνική που ονομάζεται κάλυψη εξάρτησηςΤο Maven 2 σάς επιτρέπει να χρησιμοποιείτε συγκεκριμένα JAR μόνο όταν τα χρειάζεστε πραγματικά και τα αποκλείετε από το classpath όταν δεν το χρειάζεστε.

Το Maven παρέχει τέσσερα πεδία εξάρτησης:

  • συντάσσω: Μια εξάρτηση μεταγλώττισης-πεδίου είναι διαθέσιμη σε όλες τις φάσεις. Αυτή είναι η προεπιλεγμένη τιμή.
  • υπό την προϋπόθεση: Μια παρεχόμενη εξάρτηση χρησιμοποιείται για τη μεταγλώττιση της εφαρμογής, αλλά δεν θα αναπτυχθεί. Θα χρησιμοποιούσατε αυτό το εύρος όταν περιμένετε ότι το JDK ή ο διακομιστής εφαρμογών θα παρέχουν το JAR. Τα servlet APIs είναι ένα καλό παράδειγμα.
  • χρόνος εκτέλεσης: Δεν απαιτούνται εξαρτήσεις εύρους χρόνου εκτέλεσης για συλλογή, μόνο για εκτέλεση, όπως προγράμματα οδήγησης JDBC (Java Database Connectivity).
  • δοκιμή: Οι εξαρτήσεις δοκιμής-πεδίου απαιτούνται μόνο για τη μεταγλώττιση και την εκτέλεση δοκιμών (για παράδειγμα, το JUnit).

Επικοινωνία έργου

Ένα σημαντικό μέρος κάθε έργου είναι η εσωτερική επικοινωνία. Αν και δεν είναι μια ασημένια σφαίρα, ένας κεντρικός ιστότοπος τεχνικού έργου μπορεί να συμβάλει σημαντικά στη βελτίωση της προβολής εντός της ομάδας. Με ελάχιστη προσπάθεια, μπορείτε να δημιουργήσετε έναν ιστότοπο έργου επαγγελματικής ποιότητας σε λειτουργία σε πολύ λίγο χρόνο.

Αυτό παίρνει μια εντελώς νέα διάσταση όταν η δημιουργία τοποθεσιών Maven ενσωματώνεται σε μια διαδικασία κατασκευής χρησιμοποιώντας συνεχή ενσωμάτωση ή ακόμα και αυτόματες νυχτερινές κατασκευές. Ένας τυπικός ιστότοπος Maven μπορεί να δημοσιεύει, καθημερινά:

  • Γενικές πληροφορίες έργου όπως αποθετήρια πηγών, παρακολούθηση ελαττωμάτων, μέλη της ομάδας κ.λπ.
  • Αναφορές δοκιμής μονάδας και κάλυψης δοκιμών
  • Αυτόματες κριτικές κώδικα και με Checkstyle και PMD
  • Πληροφορίες διαμόρφωσης και έκδοσης
  • Εξαρτήσεις
  • Javadoc
  • Ο πηγαίος κώδικας σε μορφή ευρετηρίου και παραπομπής HTML
  • Λίστα μελών της ομάδας
  • Και πολλα ΑΚΟΜΑ

Για άλλη μια φορά, οποιοσδήποτε προγραμματιστής του Maven θα γνωρίζει αμέσως πού να ψάξει για να εξοικειωθεί με ένα νέο έργο Maven 2.

Ένα πρακτικό παράδειγμα

Τώρα που έχουμε δει μερικές από τις βασικές έννοιες που χρησιμοποιούνται στο Maven 2, ας δούμε πώς λειτουργεί στον πραγματικό κόσμο. Το υπόλοιπο αυτού του σεμιναρίου εξετάζει πώς θα χρησιμοποιούσαμε το Maven 2 σε ένα απλό έργο Java Enterprise Edition. Η εφαρμογή επίδειξης περιλαμβάνει ένα φανταστικό (και απλοποιημένο) σύστημα βάσης δεδομένων ξενοδοχείων. Για να δείξουμε πώς το Maven χειρίζεται τις εξαρτήσεις μεταξύ έργων και εξαρτημάτων, αυτή η εφαρμογή θα κατασκευαστεί χρησιμοποιώντας δύο στοιχεία (βλ. Σχήμα 3):

  • Ένα στοιχείο επιχειρησιακής λογικής: HotelDatabase.jar
  • Ένα στοιχείο εφαρμογής Web: HotelWebApp.war

Μπορείτε να κατεβάσετε τον πηγαίο κώδικα για να ακολουθήσετε μαζί με το σεμινάριο στο Resources.

Ρυθμίστε το περιβάλλον του έργου σας

Ξεκινάμε διαμορφώνοντας το περιβάλλον εργασίας σας. Σε έργα πραγματικού κόσμου, συχνά θα πρέπει να ορίσετε και να διαμορφώσετε παραμέτρους περιβάλλοντος ή συγκεκριμένου χρήστη που δεν πρέπει να διανέμονται σε όλους τους χρήστες. Εάν βρίσκεστε πίσω από τείχος προστασίας με διακομιστή μεσολάβησης, για παράδειγμα, πρέπει να διαμορφώσετε τις ρυθμίσεις διακομιστή μεσολάβησης έτσι ώστε το Maven να μπορεί να κατεβάσει JAR από αποθετήρια στον Ιστό. Για τους χρήστες του Maven 1, τα αρχεία build.properties και project.properties κάνουν αυτήν την εργασία. Στο Maven 2, έχουν αντικατασταθεί από ένα αρχείο settings.xml, το οποίο πηγαίνει στον κατάλογο $ HOME / .m2. Εδώ είναι ένα παράδειγμα:

     http scott tiger 8080 my.proxy.url 

Δημιουργήστε ένα νέο έργο με την προσθήκη αρχέτυπου

Το επόμενο βήμα είναι να δημιουργήσετε ένα νέο πρότυπο έργου Maven 2 για το στοιχείο επιχειρησιακής λογικής. Το Maven 2 παρέχει το αρχέτυπο plug-in, το οποίο δημιουργεί μια κενή δομή καταλόγου έργου συμβατή με Maven 2. Αυτό το πρόσθετο αποδεικνύεται βολικό για την ταχεία λειτουργία ενός βασικού περιβάλλοντος έργου. Το προεπιλεγμένο μοντέλο αρχέτυπου θα δημιουργήσει ένα έργο βιβλιοθήκης JAR. Αρκετοί άλλοι τύποι τεχνουργημάτων είναι διαθέσιμοι για άλλους συγκεκριμένους τύπους έργων, συμπεριλαμβανομένων των εφαρμογών Ιστού, των προσθηκών Maven και άλλων.

Εκτελέστε την ακόλουθη εντολή για να ρυθμίσετε το έργο HotelDatabase.jar:

αρχέτυπος mvn: δημιουργία -DgroupId = com.javaworld.hotels - DartifactId = HotelDatabase -Dpackagename = com.javaworld.hotels

Τώρα έχετε μια ολοκαίνουργια δομή καταλόγου έργου Maven 2. Μετάβαση στο HotelDatabase για να συνεχίσετε το σεμινάριο.

Εφαρμογή της επιχειρηματικής λογικής

Τώρα εφαρμόζουμε τη λογική των επιχειρήσεων. ο Ξενοδοχειο τάξη είναι ένα απλό JavaBean. ο Ξενοδοχείο Μοντέλο κλάση εφαρμόζει δύο υπηρεσίες: το findAvailableCities () μέθοδος, η οποία απαριθμεί τις διαθέσιμες πόλεις και το βρείτεHotelsByCity () μέθοδο, η οποία απαριθμεί όλα τα ξενοδοχεία σε μια δεδομένη πόλη. Μια απλή, βασισμένη στη μνήμη εφαρμογή του Ξενοδοχείο Μοντέλο η τάξη παρουσιάζεται εδώ:

πακέτο com.javaworld.hotels.model;

εισαγωγή java.util.ArrayList; εισαγωγή java.util.List;

εισαγωγή com.javaworld.hotels.businessobjects.Hotel;

δημόσια κατηγορία HotelModel {

/ ** * Η λίστα όλων των γνωστών πόλεων στη βάση δεδομένων. * / ιδιωτικό στατικό String [] city = {"Paris", "London",}; / ** * Η λίστα όλων των ξενοδοχείων στη βάση δεδομένων. * / ιδιωτικό στατικό ξενοδοχείο [] ξενοδοχεία = {νέο ξενοδοχείο ("Hotel Latin", "Quartier latin", "Paris", 3), νέο ξενοδοχείο ("Hotel Etoile", "Place de l'Etoile", "Paris", 4), νέο ξενοδοχείο ("Hotel Vendome", "Place Vendome", "Παρίσι", 5), νέο ξενοδοχείο ("Hotel Hilton", "Trafalgar Square", "London", 4), νέο ξενοδοχείο ("Hotel Ibis" , "The City", "London", 3),}; / ** * Επιστρέφει τα ξενοδοχεία σε μια δεδομένη πόλη. * @param city το όνομα της πόλης * @ επιστρέψτε μια λίστα αντικειμένων ξενοδοχείου * / δημόσια λίστα ΕύρεσηHotelsByCity (String city) {List hotelsFound = new ArrayList () για (ξενοδοχείο ξενοδοχείου: ξενοδοχεία) {if (hotel.getCity (). equalsIgnoreCase (πόλη)) {hotelsFound.add (ξενοδοχείο); }} επιστροφή ξενοδοχείων } / ** * Επιστρέφει τη λίστα πόλεων στη βάση δεδομένων που διαθέτουν ξενοδοχείο. * @ επιστρέψτε μια λίστα ονομάτων πόλεων * / δημόσια συμβολοσειρά [] findAvailableCities () {επιστροφή πόλεων; }}