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

Το Maven 2 POM απομυθοποιήθηκε

Η οικοδόμηση ενός έργου είναι πολύπλοκη επιχείρηση. Λόγω των δεκάδων εργασιών που απαιτούνται για τη μετατροπή του hodge-podge των αρχείων σας σε ένα πρόγραμμα εργασίας, υπάρχουν κυριολεκτικά εκατοντάδες εργαλεία που κάνουν τα πάντα, από τη δημιουργία πηγαίου κώδικα, τη σύνταξη, τη δοκιμή, τη διανομή, έως την παρασκευή του πρωινού καφέ σας (εάν βρείτε έναν, αγαπητέ αναγνώστη, επιτρέψτε μου να ξέρω). Πολλά από αυτά τα προγράμματα είναι εξαιρετικά σε αυτό που κάνουν. Δυστυχώς, για όσους από εμάς διαχειριζόμαστε συστήματα οικοδόμησης μεγάλης κλίμακας για τα προς το ζην, σπάνια υπάρχει πολύ κοινότητα κάθε πρόγραμμα απαιτεί τη δική του διαφορετική εγκατάσταση και εσωτερική διαμόρφωση. Έχει γίνει αναπόφευκτο γεγονός της ζωής μας ότι η πλειονότητα των συστημάτων κατασκευής είναι κατασκευασμένα κατά παραγγελία, κολλώντας χειροκίνητα αυτά τα εργαλεία με διάφορα σενάρια homebrew (ναι, μετράνε τα σενάρια Ant).

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

Ωστόσο, το πρόβλημα παραμένει: η διαχείριση χιλιάδων προσαρμοσμένων σεναρίων build σε ένα ενιαίο πλαίσιο είναι δύσκολη και, για να γίνει σωστά, απαιτεί πολλές πληροφορίες. Ευτυχώς, η ομάδα του Maven 2 ήταν αρκετά επιτυχημένη. Μαθαίνοντας από τα λάθη του Maven 1, αμέτρητα αιτήματα χρηστών, τροποποίηση και ενημέρωση, το Maven 2 είναι πιο ισχυρό από ποτέ. Δυστυχώς, με μεγάλη ισχύ έρχεται εξαιρετική διαμόρφωση. Προκειμένου τα αντικείμενα Maven 2 να είναι εύκολα φορητές μονάδες, αυτή η σύνθετη διαμόρφωση εμπίπτει σε ένα μόνο αρχείο. Μπείτε στο Maven POM.

Τι είναι το POM;

Το POM σημαίνει μοντέλο αντικειμένου έργου. Είναι μια αναπαράσταση XML ενός έργου Maven που διατηρείται σε ένα αρχείο με το όνομα pom.xml. Παρουσία του Maven, οι άνθρωποι μιλώντας για ένα έργο μιλούν με φιλοσοφική έννοια, πέρα ​​από μια απλή συλλογή αρχείων που περιέχουν κώδικα. Ένα έργο περιέχει αρχεία διαμόρφωσης, καθώς και εμπλεκόμενους προγραμματιστές και ρόλους που παίζουν, το σύστημα παρακολούθησης ελαττωμάτων, τον οργανισμό και τις άδειες, τη διεύθυνση URL όπου ζει το έργο, τις εξαρτήσεις του έργου και όλα τα άλλα μικρά κομμάτια που συμμετέχουν στο παιχνίδι για να δώσουν κώδικα ΖΩΗ. Ένα έργο είναι ένα ενιαίο κατάστημα για όλα τα πράγματα που σχετίζονται με αυτό. Στην πραγματικότητα, στον κόσμο του Maven, ένα έργο δεν χρειάζεται να περιέχει καθόλου κώδικα, απλώς ένα pom.xml. Θα συναντήσουμε μερικά τέτοια είδη έργων αργότερα στο άρθρο.

Μια γρήγορη δομική επισκόπηση

Το POM είναι μεγάλο και περίπλοκο, οπότε το σπάσιμο σε κομμάτια διευκολύνει την πέψη. Για τους σκοπούς αυτής της συζήτησης, αυτά τα κομμάτια ομαδοποιούνται σε τέσσερις λογικές ενότητες, όπως φαίνεται στο Σχήμα 1: Σχέσεις POM, πληροφορίες έργου, ρυθμίσεις κατασκευής και περιβάλλον κατασκευής. Θα ξεκινήσουμε συζητώντας τις σχέσεις POM.

Ακολουθεί μια λίστα με τα στοιχεία απευθείας στο στοιχείο έργου του POM. Σημειώσε ότι μοντέλοVersion περιέχει 4.0.0. Αυτή τη στιγμή είναι η μόνη υποστηριζόμενη έκδοση POM για το Maven 2 και απαιτείται πάντα. Ο ορισμός σχήματος Maven 4.0.0 XML βρίσκεται στη διεύθυνση //maven.apache.org/maven-v4_0_0.xsd. Τα στοιχεία ανώτατου επιπέδου είναι τα εξής:

4.0.0

... ... ... ... ... ... ...

... ... ... ... ... ... ... ...

... ... ... ...

... ... ... ...

... ... ... ... ...

POM σχέσεις

Η πρώτη μας σειρά επιχειρήσεων είναι να διερευνήσουμε τις σχέσεις έργου, που απεικονίζονται στο Σχήμα 2 ως την επάνω αριστερή γωνία του γραφήματος στο Σχήμα 1.

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

Συντεταγμένες

Κάθε έργο Maven περιέχει το δικό του μοναδικό αναγνωριστικό, το οποίο ονομάζεται συντεταγμένες, που λειτουργεί ως διεύθυνση ενός χειροποίητου αντικειμένου, δίνοντάς του μια μοναδική θέση στο σύμπαν Maven. Εάν τα έργα δεν είχαν κανένα τρόπο να συνδέονται μεταξύ τους, δεν θα χρειαστούν συντεταγμένες. Δηλαδή, εάν ένα σύμπαν είχε μόνο ένα σπίτι, γιατί θα χρειαζόταν μια διεύθυνση όπως το 315 Cherrywood Lane;

Ο παρακάτω κωδικός είναι το ελάχιστο POM που θα επιτρέπει το Maven 2—, , και είναι όλα τα απαιτούμενα πεδία. Ενεργούν ως διάνυσμα στο Maven space με τα στοιχεία grouper, αναγνωριστικό και χρονική σήμανση.

4.0.0org.codehaus.mojoένα1

Στον κόσμο του Maven, αυτά τα τρία βασικά στοιχεία (η τριάδα του Maven - δείτε τη δόξα του!) Αποτελούν τις συντεταγμένες του POM. Οι συντεταγμένες αντιπροσωπεύονται από το Σχήμα 3.

Ίσως αυτό το POM να μην είναι τόσο εντυπωσιακό από μόνο του. Γίνεται καλύτερο.

Εξαρτήσεις

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

Η διαχείριση της εξάρτησης έχει μια μακρά παράδοση να είναι ένα περίπλοκο χάος για οτιδήποτε άλλο εκτός από τα πιο ασήμαντα έργα. Το "Jarmageddon" ακολουθεί γρήγορα καθώς το δέντρο εξάρτησης γίνεται τεράστιο, περίπλοκο και ενοχλητικό για τους αρχιτέκτονες που περιφρονούνται από νέους πτυχιούχους που "θα μπορούσαν εντελώς να το έχουν κάνει καλύτερα". Ακολουθεί το "Jar Hell", όπου οι εκδόσεις εξαρτήσεων σε ένα σύστημα δεν είναι οι ίδιες εκδόσεις με αυτές που χρησιμοποιούνται για ανάπτυξη. Έχουν είτε λανθασμένη έκδοση είτε αντικρουόμενες εκδόσεις ανάμεσα σε παρόμοια ονόματα JAR. Ως εκ τούτου, τα πράγματα αρχίζουν να σπάνε και να δείχνουν γιατί αποδεικνύεται δύσκολο. Το Maven επιλύει και τα δύο αυτά προβλήματα έχοντας ένα κοινό τοπικό αποθετήριο από το οποίο θα συνδέεται με τα σωστά έργα, εκδόσεις και όλα.

Κληρονομία

Ένα από τα χαρακτηριστικά που φέρνει το Maven 2 από το Maven 1 ημέρες είναι η κληρονομιά του έργου, όπως απεικονίζεται στο Σχήμα 5. Σε συστήματα κατασκευής, όπως το Ant, η κληρονομιά μπορεί σίγουρα να προσομοιωθεί, αλλά ο Maven έχει κάνει το επιπλέον βήμα για να καταστήσει σαφές το κληρονομικό έργο το μοντέλο αντικειμένου έργου.

Ο ακόλουθος κωδικός ορίζει ένα γονικό POM στο Maven 2:

4.0.0org.codehaus.mojoσι2πομ

Αυτός ο γονέας μοιάζει με το πρώτο μας POM, με μια μικρή διαφορά. Παρατηρήστε ότι έχουμε ορίσει το συσκευασία πληκτρολογήστε ως πομ, το οποίο απαιτείται τόσο για γονικά όσο και για αθροιστικά έργα (θα καλύψουμε περισσότερα συσκευασία στην ενότητα "Ρυθμίσεις κατασκευής"). Εάν θέλουμε να χρησιμοποιήσουμε το παραπάνω έργο ως γονέας, μπορούμε να αλλάξουμε το έργο org.codehaus.mojo: α POM να είναι:

4.0.0org.codehaus.mojoσι2ένα

Είναι σημαντικό να σημειωθεί ότι όλα τα POM κληρονομούν από έναν γονέα είτε ορίζεται ρητά είτε όχι. Αυτό το βασικό POM είναι γνωστό ως "super POM" και περιέχει τιμές που κληρονομούνται από προεπιλογή. Ένας εύκολος τρόπος για να δείτε τις προεπιλεγμένες διαμορφώσεις του super POM είναι να δημιουργήσετε ένα απλό pom.xml με τίποτα άλλο μοντέλοVersion, ομάδαId, artifactId, και εκδοχήκαι εκτελεί την εντολή βοήθεια mvn: αποτελεσματικό-pom.

Πέρα από τον απλό καθορισμό τιμών για κληρονομικότητα, οι γονείς έχουν επίσης τη δύναμη να δημιουργούν προεπιλεγμένες διαμορφώσεις για τα παιδιά τους χωρίς να τους επιβάλλουν πραγματικά τιμές. Η διαχείριση της εξάρτησης είναι ένα ιδιαίτερα ισχυρό εργαλείο για τη διαμόρφωση ενός συνόλου εξαρτήσεων μέσω μιας κοινής τοποθεσίας (γονέας ενός POM). ο εξάρτηση η σύνταξη στοιχείου είναι παρόμοια με αυτήν της ενότητας εξάρτησης. Αυτό που κάνει, ωστόσο, είναι να επιτρέψει στα παιδιά να κληρονομήσουν τις ρυθμίσεις εξάρτησης, αλλά όχι την ίδια την εξάρτηση. Προσθήκη εξάρτησης με το εξάρτηση Το στοιχείο δεν προσθέτει πραγματικά την εξάρτηση στο POM, ούτε προσθέτει μια εξάρτηση στα παιδιά. δημιουργεί μια προεπιλεγμένη διαμόρφωση για οποιαδήποτε εξάρτηση που μπορεί να επιλέξει ένα παιδί να προσθέσει εντός της δικής του εξάρτησης. Ρυθμίσεις από εξάρτηση ισχύουν επίσης για την τρέχουσα διαμόρφωση εξάρτησης του POM (αν και οι διαμορφώσεις παρακάμπτονται εντός του στοιχείου εξάρτησης πάντα υπερισχύουν).

Συσσωμάτωση

Ένα έργο με ενότητες είναι γνωστό ως έργο πολλαπλών ενοτήτων. Οι ενότητες είναι έργα που παραθέτει ένα POM και εκτελούνται ως σύνολο. Τα έργα πολλαπλών ενοτήτων γνωρίζουν τις ενότητες τους, αλλά το αντίστροφο δεν είναι απαραίτητα αλήθεια, όπως φαίνεται στο Σχήμα 6.

Υποθέτοντας ότι το γονικό POM βρίσκεται στον γονικό κατάλογο όπου POM για το έργο ένα ζει, και ότι το έργο ένα επίσης βρίσκεται σε έναν κατάλογο με το ίδιο όνομα, ενδέχεται να αλλάξουμε το γονικό POM σι για να συγκεντρωθεί το παιδί ένα προσθέτοντάς το ως ενότητα:

4.0.0org.codehaus.mojoσι2πομένα

Τώρα αν τρέξαμε μεταγλώττιση mvn στον βασικό κατάλογο, θα δείτε το build να ξεκινά με:

[INFO] Σάρωση για έργα ... [INFO] Παραγγελία αντιδραστήρα: [INFO] Χωρίς όνομα - org.codehaus.mojo: b: pom: 2 [INFO] Χωρίς όνομα - org.codehaus.mojo: a: jar: 2 

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

Μια σημείωση για την κληρονομιά έναντι της συνάθροισης

Η κληρονομικότητα και η συγκέντρωση δημιουργούν μια ωραία δυναμική για τον έλεγχο των κατασκευών μέσω ενός ενιαίου POM υψηλού επιπέδου. Συχνά θα βλέπετε έργα που είναι γονείς και πολυμονάδες, όπως το παραπάνω παράδειγμα. Η συμπληρωματικότητά τους τους κάνει ένα φυσικό ταίριασμα. Ακόμη και ο πυρήνας του έργου Maven 2 διατρέχει ένα μόνο γονέα / πολυμερές POM org.apache.maven: maven, οπότε η δημιουργία ενός έργου Maven 2 μπορεί να εκτελεστεί με μία μόνο εντολή: μεταγλώττιση mvn. Παρόλο που χρησιμοποιείται σε συνδυασμό, ωστόσο, ένα multimodule και ένας γονέας δεν είναι το ίδιο και δεν πρέπει να συγχέεται. Ένα έργο POM (ενεργεί ως γονέας) μπορεί να κληρονομηθεί, αλλά αυτό το γονικό έργο δεν συγκεντρώνει απαραίτητα καμία ενότητα. Αντίθετα, ένα έργο POM μπορεί να συγκεντρώνει έργα που δεν κληρονομούνται από αυτό.

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

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