Το αρχείο pom.xml

7 λεπτά

Πίνακας περιεχομένων


1 — Το pom.xml, πυρήνας του έργου

Το pom.xml (Project Object Model) είναι το κεντρικό αρχείο κάθε έργου Maven. Είναι ένα έγγραφο XML που περιγράφει το έργο: την ταυτότητά του, τις εξαρτήσεις του, τις ιδιότητές του και τον τρόπο κατασκευής του.

Κάθε pom.xml ξεκινά από μια ρίζα <project> με τον χώρο ονομάτων του και δηλώνει υποχρεωτικά την έκδοση του μοντέλου:

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>

    <!-- Η υπόλοιπη διαμόρφωση εδώ -->

</project>

Το <modelVersion>4.0.0</modelVersion> είναι υποχρεωτικό και αξίζει πάντα 4.0.0 σήμερα: είναι η έκδοση της μορφής αρχείου pom.xml, όχι η έκδοση του έργου σας.

↑ Επιστροφή στην αρχή


2 — Γενική δομή του 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.

✅ Δείτε μια λύση
xml
<packaging>war</packaging>

↑ Επιστροφή στην αρχή


3 — Οι συντεταγμένες του έργου (GAV)

Κάθε έργο Maven ταυτοποιείται μοναδικά από τρεις συντεταγμένες, συχνά συντομογραφούμενες GAV: GroupId, ArtifactId, Version.

xml
<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), παγωμένη και αμετάβλητη
bash
# Το όνομα του παραγόμενου τεχνουργήματος συνδυάζει artifactId + version
# Π.χ. : mon-app-1.0.0-SNAPSHOT.jar
mvn package

Ο συνδυασμός groupId:artifactId:version είναι η «ταχυδρομική διεύθυνση» του έργου σας στο οικοσύστημα Maven. Έτσι μπορούν άλλα έργα να εξαρτώνται από αυτό.

🔧 Μίνι-άσκηση — Γράψτε τις τρεις ετικέτες GAV για ένα έργο com.banque με όνομα gestion-comptes σε έκδοση ανάπτυξης 1.0.0.

✅ Δείτε μια λύση
xml
<groupId>com.banque</groupId>
<artifactId>gestion-comptes</artifactId>
<version>1.0.0-SNAPSHOT</version>

↑ Επιστροφή στην αρχή


4 — Οι ιδιότητες

Το μπλοκ <properties> ορίζει επαναχρησιμοποιήσιμες μεταβλητές σε όλο το pom.xml. Εκεί συγκεντρώνουμε εκδόσεις και ρυθμίσεις ώστε να αποφεύγονται οι επαναλήψεις.

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

xml
<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>.

✅ Δείτε μια λύση
xml
<properties>
    <gson.version>2.10.1</gson.version>
</properties>
<!-- ... -->
<version>${gson.version}</version>

↑ Επιστροφή στην αρχή


5 — Η κληρονομιά γονέα

Ένα pom.xml μπορεί να κληρονομήσει από ένα άλλο pom.xml μέσω του μπλοκ <parent>. Το παιδί λαμβάνει τότε τις ιδιότητες, εξαρτήσεις και διαμορφώσεις του γονέα. Αυτός είναι ο μηχανισμός που επιτρέπει να παραγοντοποιείτε την κοινή διαμόρφωση πολλών ενοτήτων.

xml
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.2.5</version>
    <relativePath/>   <!-- κενό : αναζήτηση του γονέα στο αποθετήριο -->
</parent>

Η πιο γνωστή χρήση είναι ο γονέας Spring Boot, που καθορίζει τις εκδόσεις δεκάδων βιβλιοθηκών ώστε να είναι συμβατές μεταξύ τους. Χάρη σε αυτόν, δηλώνετε εξαρτήσεις χωρίς να προσδιορίζετε την έκδοσή τους:

xml
<!-- Χωρίς <version> : κληρονομείται από τον γονέα -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
Με κληρονομιά γονέαΧωρίς κληρονομιά γονέα
Εγγυημένες συνεπείς εκδόσειςΚίνδυνος ασύμβατων εκδόσεων
Λιγότερη επαναλαμβανόμενη διαμόρφωσηΌλα πρέπει να επαναδηλωθούν σε κάθε ενότητα

Ο γονέας Spring Boot λειτουργεί ως «επικυρωμένη λίστα αγορών»: εγγυάται ότι όλες οι βιβλιοθήκες σας συνεννοούνται, χωρίς να επιλέγετε κάθε αριθμό έκδοσης στο χέρι.

↑ Επιστροφή στην αρχή


6 — Ένα πλήρες pom.xml με σχόλια

Ακολουθεί ένα ρεαλιστικό pom.xml που συγκεντρώνει όσα προηγήθηκαν: συντεταγμένες, ιδιότητες, προαιρετικός γονέας και εξαρτήσεις.

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 (με όλη την κληρονομιά επιλυμένη):

bash
# Εμφανίζει το πλήρες pom, συμπεριλαμβανομένου του γονέα
mvn help:effective-pom

Η εντολή mvn help:effective-pom είναι πολύτιμη για να κατανοήσετε τι «βλέπει» πραγματικά το Maven, συμπεριλαμβανομένων όλων όσων προέρχονται από τον γονέα.

🔧 Μίνι-άσκηση — Γράψτε την εντολή που εμφανίζει το ενεργό pom.xml, με όλη την κληρονομιά του γονέα επιλυμένη.

✅ Δείτε μια λύση
bash
mvn help:effective-pom

↑ Επιστροφή στην αρχή


7 — Κουίζ — Το αρχείο pom.xml

Question 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, υποχρεωτική και αμετάβλητη.

↑ Επιστροφή στην αρχή


8 — Πρακτική — Σύνταξη ενός pom.xml

Εκφώνηση

Συντάξτε από το μηδέν ένα pom.xml για έργο ταυτοποιημένο ως com.banque:gestion-comptes:1.0.0-SNAPSHOT, συσκευασμένο σε jar, μεταγλωττισμένο σε Java 17 με κωδικοποίηση UTF-8, και συγκεντρώνοντας την έκδοση του JUnit σε μια ιδιότητα. Έπειτα επαληθεύστε το.


Διόρθωση — Αναμενόμενο pom.xml

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>

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

Επαλήθευση:

bash
# Επαληθεύει ότι το pom είναι έγκυρο και επιλύσιμο
mvn validate

# Εμφανίζει το ενεργό pom (γονέας και ιδιότητες επιλυμένες)
mvn help:effective-pom

Αναμενόμενο αποτέλεσμα:

[INFO] BUILD SUCCESS

Αν το mvn validate εμφανίζει BUILD SUCCESS, το pom.xml σας είναι συντακτικά ορθό και όλες οι συντεταγμένες του είναι καλά σχηματισμένες. Συχνό σφάλμα: παράλειψη του <modelVersion> ή κακό κλείσιμο ετικέτας XML.

↑ Επιστροφή στην αρχή


9 — Σύνοψη

Σημεία προς απομνημόνευση

  1. Το pom.xml είναι αρχείο XML που περιγράφει ταυτότητα, ιδιότητες, εξαρτήσεις και κατασκευή.
  2. Οι συντεταγμένες GAV (groupId, artifactId, version) ταυτοποιούν το έργο μοναδικά.
  3. -SNAPSHOT = έκδοση υπό ανάπτυξη· χωρίς επίθημα = παγωμένη δημοσιευμένη έκδοση.
  4. Τα <properties> συγκεντρώνουν επαναχρησιμοποιήσιμες μεταβλητές μέσω ${nom}.
  5. Η κληρονομιά <parent> παραγοντοποιεί τη διαμόρφωση και εγγυάται συνεπείς εκδόσεις.

Η συνέχεια

Μάθημα 03 — Διαχείριση εξαρτήσεων: δήλωση βιβλιοθηκών, κατανόηση των πεδίων εφαρμογής, των αποθετηρίων και της μεταβατικής επίλυσης.

↑ Επιστροφή στην αρχή


Με την επιφύλαξη παντός δικαιώματος. Οποιαδήποτε αναπαραγωγή, διάδοση, χρήση ή προσαρμογή αυτού του μαθήματος, εν όλω ή εν μέρει, απαγορεύεται αυστηρά χωρίς την προηγούμενη γραπτή άδεια του Dr. Haythem REHOUMA.

Μάθημα δημιουργημένο από τον Dr. Haythem REHOUMA — Ανάπτυξη και ανάπτυξη λύσεων δεδομένων