Το pom.xml (Project Object Model) είναι το κεντρικό αρχείο κάθε έργου Maven. Είναι ένα έγγραφο XML που περιγράφει το έργο: την ταυτότητά του, τις εξαρτήσεις του, τις ιδιότητές του και τον τρόπο κατασκευής του.
Κάθε pom.xml ξεκινά από μια ρίζα <project> με τον χώρο ονομάτων του και δηλώνει υποχρεωτικά την έκδοση του μοντέλου:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- Η υπόλοιπη διαμόρφωση εδώ -->
</project>Το
<modelVersion>4.0.0</modelVersion>είναι υποχρεωτικό και αξίζει πάντα4.0.0σήμερα: είναι η έκδοση της μορφής αρχείουpom.xml, όχι η έκδοση του έργου σας.
Ένα pom.xml διαβάζεται από πάνω προς τα κάτω, σε μεγάλα μπλοκ. Ακολουθεί η τυπική οργάνωση:
| Μπλοκ | Ρόλος |
|---|---|
<modelVersion> | Έκδοση της μορφής (πάντα 4.0.0) |
<groupId> / <artifactId> / <version> | Συντεταγμένες (ταυτότητα του έργου) |
<packaging> | Τύπος τεχνουργήματος (jar, war, pom) |
<properties> | Επαναχρησιμοποιήσιμες μεταβλητές (εκδόσεις, κωδικοποίηση) |
<dependencies> | Οι χρησιμοποιούμενες βιβλιοθήκες (μάθημα 03) |
<build> | Πρόσθετα και διαμόρφωση κατασκευής |
Το μπλοκ <packaging> καθορίζει τον τύπο παραδοτέου:
| Τιμή | Προϊόν |
|---|---|
jar | Βιβλιοθήκη ή εφαρμογή Java (προεπιλογή) |
war | Εφαρμογή ιστού αναπτύξιμη σε διακομιστή |
pom | Έργο «γονέας» χωρίς κώδικα (συσσωρευτής) |
Αν παραλείψετε το
<packaging>, το Maven επιλέγειjarαπό προεπιλογή. Και πάλι: σύμβαση αντί για διαμόρφωση.
🔧 Μίνι-άσκηση — Γράψτε την ετικέτα <packaging> για να παράγετε μια εφαρμογή ιστού αναπτύξιμη σε Tomcat.
<packaging>war</packaging>Κάθε έργο Maven ταυτοποιείται μοναδικά από τρεις συντεταγμένες, συχνά συντομογραφούμενες GAV: GroupId, ArtifactId, Version.
<groupId>com.exemple</groupId>
<artifactId>mon-app</artifactId>
<version>1.0.0</version>| Συντεταγμένη | Σημασία | Σύμβαση |
|---|---|---|
| groupId | Ο οργανισμός / το έργο | Αντεστραμμένο όνομα τομέα: com.exemple |
| artifactId | Το όνομα της ενότητας | Σύντομο, πεζά: mon-app |
| version | Η τρέχουσα έκδοση | Αριθμητική: 1.0.0, ή 1.0.0-SNAPSHOT |
Το επίθημα -SNAPSHOT αξίζει ιδιαίτερη προσοχή:
| Έκδοση | Νόημα |
|---|---|
1.0.0-SNAPSHOT | Έκδοση υπό ανάπτυξη, ασταθής, ενημερώνεται συχνά |
1.0.0 | Έκδοση δημοσιευμένη (release), παγωμένη και αμετάβλητη |
# Το όνομα του παραγόμενου τεχνουργήματος συνδυάζει artifactId + version
# Π.χ. : mon-app-1.0.0-SNAPSHOT.jar
mvn packageΟ συνδυασμός
groupId:artifactId:versionείναι η «ταχυδρομική διεύθυνση» του έργου σας στο οικοσύστημα Maven. Έτσι μπορούν άλλα έργα να εξαρτώνται από αυτό.
🔧 Μίνι-άσκηση — Γράψτε τις τρεις ετικέτες GAV για ένα έργο com.banque με όνομα gestion-comptes σε έκδοση ανάπτυξης 1.0.0.
<groupId>com.banque</groupId>
<artifactId>gestion-comptes</artifactId>
<version>1.0.0-SNAPSHOT</version>Το μπλοκ <properties> ορίζει επαναχρησιμοποιήσιμες μεταβλητές σε όλο το pom.xml. Εκεί συγκεντρώνουμε εκδόσεις και ρυθμίσεις ώστε να αποφεύγονται οι επαναλήψεις.
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<junit.version>5.10.2</junit.version>
</properties>Στη συνέχεια επαναχρησιμοποιείτε μια ιδιότητα με τη σύνταξη ${nom}:
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>${junit.version}</version> <!-- επαναχρησιμοποιεί την ιδιότητα -->
<scope>test</scope>
</dependency>Συνηθισμένες ιδιότητες:
| Ιδιότητα | Ρόλος |
|---|---|
maven.compiler.source / target | Έκδοση Java του πηγαίου κώδικα και του bytecode |
project.build.sourceEncoding | Κωδικοποίηση αρχείων (πάντα UTF-8) |
Προσαρμοσμένες ιδιότητες (junit.version…) | Συγκέντρωση αριθμών έκδοσης |
Η συγκέντρωση των εκδόσεων στο
<properties>είναι καλή πρακτική: για να περάσετε το JUnit από 5.10 σε 5.11, τροποποιείτε ένα μόνο σημείο αντί για κάθε εξάρτηση.
🔧 Μίνι-άσκηση — Ορίστε μια ιδιότητα gson.version με τιμή 2.10.1 και δείξτε πώς την επαναχρησιμοποιείτε σε μια ετικέτα <version>.
<properties>
<gson.version>2.10.1</gson.version>
</properties>
<!-- ... -->
<version>${gson.version}</version>Ένα pom.xml μπορεί να κληρονομήσει από ένα άλλο pom.xml μέσω του μπλοκ <parent>. Το παιδί λαμβάνει τότε τις ιδιότητες, εξαρτήσεις και διαμορφώσεις του γονέα. Αυτός είναι ο μηχανισμός που επιτρέπει να παραγοντοποιείτε την κοινή διαμόρφωση πολλών ενοτήτων.
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.5</version>
<relativePath/> <!-- κενό : αναζήτηση του γονέα στο αποθετήριο -->
</parent>Η πιο γνωστή χρήση είναι ο γονέας Spring Boot, που καθορίζει τις εκδόσεις δεκάδων βιβλιοθηκών ώστε να είναι συμβατές μεταξύ τους. Χάρη σε αυτόν, δηλώνετε εξαρτήσεις χωρίς να προσδιορίζετε την έκδοσή τους:
<!-- Χωρίς <version> : κληρονομείται από τον γονέα -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>| Με κληρονομιά γονέα | Χωρίς κληρονομιά γονέα |
|---|---|
| Εγγυημένες συνεπείς εκδόσεις | Κίνδυνος ασύμβατων εκδόσεων |
| Λιγότερη επαναλαμβανόμενη διαμόρφωση | Όλα πρέπει να επαναδηλωθούν σε κάθε ενότητα |
Ο γονέας Spring Boot λειτουργεί ως «επικυρωμένη λίστα αγορών»: εγγυάται ότι όλες οι βιβλιοθήκες σας συνεννοούνται, χωρίς να επιλέγετε κάθε αριθμό έκδοσης στο χέρι.
Ακολουθεί ένα ρεαλιστικό pom.xml που συγκεντρώνει όσα προηγήθηκαν: συντεταγμένες, ιδιότητες, προαιρετικός γονέας και εξαρτήσεις.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- Έκδοση της μορφής αρχείου -->
<modelVersion>4.0.0</modelVersion>
<!-- Συντεταγμένες GAV : ταυτότητα του έργου -->
<groupId>com.exemple</groupId>
<artifactId>mon-app</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
<!-- Επαναχρησιμοποιήσιμες μεταβλητές -->
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<junit.version>5.10.2</junit.version>
</properties>
<!-- Χρησιμοποιούμενες βιβλιοθήκες -->
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>Μπορείτε να εμφανίσετε το «ενεργό» pom.xml (με όλη την κληρονομιά επιλυμένη):
# Εμφανίζει το πλήρες pom, συμπεριλαμβανομένου του γονέα
mvn help:effective-pomΗ εντολή
mvn help:effective-pomείναι πολύτιμη για να κατανοήσετε τι «βλέπει» πραγματικά το Maven, συμπεριλαμβανομένων όλων όσων προέρχονται από τον γονέα.
🔧 Μίνι-άσκηση — Γράψτε την εντολή που εμφανίζει το ενεργό pom.xml, με όλη την κληρονομιά του γονέα επιλυμένη.
mvn help:effective-pomQuestion 1 : Τι αξίζουν οι τρεις συντεταγμένες GAV;
a) Group, Action, Value
b) GroupId, ArtifactId, Version
c) Git, Apache, Version
d) General, Application, Version
✅ Απάντηση: b) — GAV = groupId, artifactId, version: η μοναδική ταυτότητα του έργου.
Question 2 : Τι σημαίνει το επίθημα -SNAPSHOT σε μια έκδοση;
a) Μια δημοσιευμένη και παγωμένη έκδοση
b) Μια έκδοση υπό ανάπτυξη, ασταθή και συχνά ενημερωμένη
c) Ένα στιγμιότυπο οθόνης του έργου
d) Μια παρωχημένη έκδοση
✅ Απάντηση: b) — Το -SNAPSHOT δηλώνει έκδοση ανάπτυξης. Έκδοση χωρίς αυτό το επίθημα είναι παγωμένη release.
Question 3 : Σε τι χρησιμεύει το μπλοκ <properties>;
a) Στη δήλωση των εξαρτήσεων
b) Στον ορισμό επαναχρησιμοποιήσιμων μεταβλητών (εκδόσεις, κωδικοποίηση) με ${...}
c) Στη διαμόρφωση του διακομιστή ιστού
d) Στη συγγραφή του κώδικα Java
✅ Απάντηση: b) — Οι ιδιότητες συγκεντρώνουν επαναχρησιμοποιήσιμες τιμές μέσω της σύνταξης ${nom}, αποφεύγοντας τις επαναλήψεις.
Question 4 : Ποιο είναι το πλεονέκτημα της κληρονομιάς από έναν <parent> όπως το spring-boot-starter-parent;
a) Καταργεί την ανάγκη κώδικα
b) Εγγυάται συνεπείς εκδόσεις βιβλιοθηκών και μειώνει τη διαμόρφωση
c) Επιταχύνει το δίκτυο
d) Κρυπτογραφεί το pom.xml
✅ Απάντηση: b) — Ο γονέας καθορίζει συμβατές μεταξύ τους εκδόσεις· μπορείτε τότε να δηλώνετε εξαρτήσεις χωρίς να προσδιορίζετε την έκδοσή τους.
Question 5 : Ποια τιμή παίρνει πάντα το <modelVersion> σήμερα;
a) 1.0.0
b) 3.9.6
c) 4.0.0
d) 17
✅ Απάντηση: c) — Το <modelVersion>4.0.0</modelVersion> είναι η έκδοση της μορφής αρχείου pom.xml, υποχρεωτική και αμετάβλητη.
Συντάξτε από το μηδέν ένα pom.xml για έργο ταυτοποιημένο ως com.banque:gestion-comptes:1.0.0-SNAPSHOT, συσκευασμένο σε jar, μεταγλωττισμένο σε Java 17 με κωδικοποίηση UTF-8, και συγκεντρώνοντας την έκδοση του JUnit σε μια ιδιότητα. Έπειτα επαληθεύστε το.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.banque</groupId>
<artifactId>gestion-comptes</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<junit.version>5.10.2</junit.version>
</properties>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>Επαλήθευση:
# Επαληθεύει ότι το pom είναι έγκυρο και επιλύσιμο
mvn validate
# Εμφανίζει το ενεργό pom (γονέας και ιδιότητες επιλυμένες)
mvn help:effective-pomΑναμενόμενο αποτέλεσμα:
[INFO] BUILD SUCCESSΑν το
mvn validateεμφανίζειBUILD SUCCESS, τοpom.xmlσας είναι συντακτικά ορθό και όλες οι συντεταγμένες του είναι καλά σχηματισμένες. Συχνό σφάλμα: παράλειψη του<modelVersion>ή κακό κλείσιμο ετικέτας XML.
pom.xml είναι αρχείο XML που περιγράφει ταυτότητα, ιδιότητες, εξαρτήσεις και κατασκευή.groupId, artifactId, version) ταυτοποιούν το έργο μοναδικά.-SNAPSHOT = έκδοση υπό ανάπτυξη· χωρίς επίθημα = παγωμένη δημοσιευμένη έκδοση.<properties> συγκεντρώνουν επαναχρησιμοποιήσιμες μεταβλητές μέσω ${nom}.<parent> παραγοντοποιεί τη διαμόρφωση και εγγυάται συνεπείς εκδόσεις.Μάθημα 03 — Διαχείριση εξαρτήσεων: δήλωση βιβλιοθηκών, κατανόηση των πεδίων εφαρμογής, των αποθετηρίων και της μεταβατικής επίλυσης.
Με την επιφύλαξη παντός δικαιώματος. Οποιαδήποτε αναπαραγωγή, διάδοση, χρήση ή προσαρμογή αυτού του μαθήματος, εν όλω ή εν μέρει, απαγορεύεται αυστηρά χωρίς την προηγούμενη γραπτή άδεια του Dr. Haythem REHOUMA.
Μάθημα δημιουργημένο από τον Dr. Haythem REHOUMA — Ανάπτυξη και ανάπτυξη λύσεων δεδομένων