Το Apache Maven είναι εργαλείο αυτοματοποίησης κατασκευής (build automation) για έργα Java. Παίρνει τον πηγαίο σας κώδικα και παράγει ένα παραδοτέο (ένα αρχείο .jar ή .war) οργανώνοντας όλα τα βήματα: μεταγλώττιση, δοκιμές, συσκευασία, διαχείριση εξαρτήσεων.
Συγκεκριμένα, το Maven απαντά σε τρεις θεμελιώδεις ανάγκες:
| Ανάγκη | Τι κάνει το Maven |
|---|---|
| Κατασκευή του έργου | Μεταγλωττίζει τον κώδικα και παράγει ένα τεχνούργημα (.jar, .war) |
| Διαχείριση των εξαρτήσεων | Κατεβάζει αυτόματα τις απαραίτητες βιβλιοθήκες |
| Τυποποίηση | Επιβάλλει την ίδια δομή έργου παντού |
Ο πυρήνας του Maven είναι ένα μοναδικό αρχείο, το pom.xml (Project Object Model), που περιγράφει το έργο: την ταυτότητά του, τις εξαρτήσεις του και τον τρόπο κατασκευής του. Είναι η «συνταγή» που εκτελεί το Maven.
Χωρίς Maven, η κατασκευή ενός έργου Java σημαίνει χειροκίνητη μεταγλώττιση με
javac, χειροκίνητη λήψη κάθε βιβλιοθήκης και αυτοδιαχείριση του classpath. Το Maven αυτοματοποιεί όλα αυτά από ένα μόνο αρχείο.
🔧 Μίνι-άσκηση — Αναφέρετε τις τρεις θεμελιώδεις ανάγκες στις οποίες απαντά το Maven.
Κατασκευή του έργου (μεταγλώττιση + παραγωγή τεχνουργήματος .jar/.war), διαχείριση των εξαρτήσεων (λήψη βιβλιοθηκών) και τυποποίηση (επιβολή ίδιας δομής έργου).
Πριν από το Maven, κάθε έργο Java κατασκευαζόταν «στο χέρι» ή με αυτοσχέδια σενάρια. Αυτό δημιουργούσε αρκετά επαναλαμβανόμενα προβλήματα:
| Πρόβλημα (χωρίς Maven) | Λύση (με Maven) |
|---|---|
Εύρεση και λήψη των .jar ένα προς ένα | Δήλωση στο pom.xml, αυτόματη λήψη |
| Συγκρούσεις εκδόσεων βιβλιοθηκών | Αυτόματη μεταβατική επίλυση |
| «Στον υπολογιστή μου μεταγλωττίζεται, στον δικό σου όχι» | Αναπαραγώγιμη και τυποποιημένη κατασκευή |
| Κάθε έργο ταξινομημένο διαφορετικά | Επιβεβλημένη δομή φακέλων |
Η κεντρική ιδέα: ένας προγραμματιστής που εντάσσεται σε έργο Maven ξέρει αμέσως πού βρίσκεται ο κώδικας, πού είναι οι δοκιμές και πώς να εκκινήσει την κατασκευή — ανεξάρτητα από την εταιρεία ή το έργο.
# Με το Maven, η κατασκευή ενός άγνωστου έργου συνοψίζεται σε:
mvn packageΤο Maven μετατρέπει το «πώς κατασκευάζεται αυτό το έργο;» — μια ερώτηση που κάποτε έπαιρνε ώρες — σε μία και μοναδική καθολική εντολή.
🔧 Μίνι-άσκηση — Γράψτε τη μόνη εντολή που αρκεί για να κατασκευάσετε ένα άγνωστο έργο Maven.
mvn packageΗ κεντρική αρχή του Maven είναι «σύμβαση αντί για διαμόρφωση» (convention over configuration). Αντί να περιγράφετε τα πάντα ρητά, το Maven ξεκινά από λογικές προεπιλεγμένες τιμές. Αν τηρείτε τις συμβάσεις, σχεδόν τίποτε δεν χρειάζεται να διαμορφώσετε.
Παραδείγματα προεπιλεγμένων συμβάσεων:
| Στοιχείο | Προεπιλεγμένη αναμενόμενη θέση |
|---|---|
| Κύριος πηγαίος κώδικας | src/main/java |
| Κύριοι πόροι | src/main/resources |
| Κώδικας δοκιμών | src/test/java |
| Παραγόμενο τεχνούργημα | target/ |
Ας συγκρίνουμε τις φιλοσοφίες:
| Προσέγγιση | Συνέπεια |
|---|---|
| Διαμόρφωση των πάντων | Ευέλικτη αλλά φλύαρη, επιρρεπής σε σφάλματα |
| Προεπιλεγμένη σύμβαση | Λιτή, συνεπής μεταξύ έργων, γρήγορη εκκίνηση |
Μπορείτε πάντα να επαναπροσδιορίσετε τις συμβάσεις αν χρειαστεί, αλλά το 95 % των έργων αρκείται στις προεπιλογές. Λιγότερη διαμόρφωση = λιγότερα σφάλματα.
Κάθε έργο Maven ακολουθεί την ίδια δενδροειδή δομή. Η γνώση της επιτρέπει να πλοηγείστε ακαριαία σε οποιοδήποτε έργο.
Λεπτομέρεια των φακέλων:
| Διαδρομή | Ρόλος |
|---|---|
pom.xml | Η συνταγή του έργου (στη ρίζα) |
src/main/java | Ο πηγαίος κώδικας της εφαρμογής |
src/main/resources | Αρχεία μη Java (.properties, .xml, εικόνες) |
src/test/java | Οι κλάσεις μοναδιαίων δοκιμών |
src/test/resources | Πόροι που χρησιμοποιούν οι δοκιμές |
target/ | Φάκελος εξόδου: μεταγλωττισμένες κλάσεις και τελικό τεχνούργημα |
🔧 Μίνι-άσκηση — Σε ποιον φάκελο πρέπει να τοποθετήσετε μια κλάση μοναδιαίας δοκιμής και σε ποιον ένα αρχείο application.properties;
Η μοναδιαία δοκιμή πηγαίνει στο src/test/java και το application.properties στο src/main/resources.
# Τυπική δενδροειδής δομή όπως φαίνεται στη γραμμή εντολών
mon-projet/
├── pom.xml
├── src/
│ ├── main/
│ │ ├── java/ # π.χ. com/exemple/App.java
│ │ └── resources/ # π.χ. application.properties
│ └── test/
│ └── java/ # π.χ. com/exemple/AppTest.java
└── target/ # παράγεται : μην το εκδοσιολογείτε (.gitignore)⚠️ Ο φάκελος
target/αναδημιουργείται σε κάθε κατασκευή. Προσθέστε τον στο.gitignore: δεν εκδοσιολογούμε ποτέ τα μεταγλωττισμένα τεχνουργήματα.
Το Maven χρειάζεται ένα ήδη εγκατεστημένο JDK (Java Development Kit), γιατί βασίζεται στον μεταγλωττιστή javac. Η μεταβλητή JAVA_HOME πρέπει να δείχνει σε αυτό το JDK.
Ανάλογα με το σύστημά σας:
| Σύστημα | Εντολή εγκατάστασης |
|---|---|
| Windows (με Chocolatey) | choco install maven |
| macOS (με Homebrew) | brew install maven |
| Linux (Debian/Ubuntu) | sudo apt install maven |
Χειροκίνητη εγκατάσταση (όλες οι πλατφόρμες):
# 1. Επαληθεύστε πρώτα ότι υπάρχει Java
java -version
# Πρέπει να εμφανίζει έκδοση 17+ για παράδειγμα
# 2. Ορισμός JAVA_HOME (παράδειγμα Linux/macOS)
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
# 3. Λήψη του Maven από το maven.apache.org, αποσυμπίεση,
# έπειτα προσθήκη του φακέλου bin/ στο PATH
export PATH=$PATH:/opt/apache-maven-3.9.6/binΣτα Windows, το
JAVA_HOMEρυθμίζεται στις «Μεταβλητές περιβάλλοντος». Σε Linux/macOS, προσθέστε τη γραμμήexportστο~/.bashrcή στο~/.zshrcώστε να είναι μόνιμη.
Μόλις εγκατασταθεί το Maven, επαληθεύουμε ότι λειτουργεί και δημιουργούμε έναν πρώτο σκελετό έργου.
# Επαλήθευση της εγκατεστημένης έκδοσης
mvn -versionΤυπική έξοδος:
Apache Maven 3.9.6
Maven home: /opt/apache-maven-3.9.6
Java version: 17.0.9, vendor: Eclipse AdoptiumΓια να δημιουργήσετε ένα κενό έργο που τηρεί τις συμβάσεις, χρησιμοποιείτε έναν αρχέτυπο (πρότυπο):
# Δημιουργεί ένα τυπικό έργο «quickstart»
mvn archetype:generate \
-DgroupId=com.exemple \
-DartifactId=mon-app \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DinteractiveMode=false| Εντολή | Αποτέλεσμα |
|---|---|
mvn -version | Εμφανίζει την έκδοση του Maven και της Java |
mvn archetype:generate | Δημιουργεί έργο από πρότυπο |
mvn package | Κατασκευάζει το τεχνούργημα στο target/ |
Το πρώτο
mvnείναι αργό: το Maven κατεβάζει τα δικά του πρόσθετα σε τοπική κρυφή μνήμη (~/.m2/repository). Οι επόμενες κατασκευές είναι πολύ ταχύτερες.
🔧 Μίνι-άσκηση — Γράψτε την εντολή που εμφανίζει την εγκατεστημένη έκδοση του Maven (και αυτή της Java).
mvn -versionQuestion 1 : Τι δηλώνει το αρχείο pom.xml σε ένα έργο Maven;
a) Τον κύριο πηγαίο κώδικα της εφαρμογής
b) Το Project Object Model: τη συνταγή που περιγράφει το έργο και την κατασκευή του
c) Το μεταγλωττισμένο αποτέλεσμα του έργου
d) Ένα αρχείο καταγραφών
✅ Απάντηση: b) — Το pom.xml (Project Object Model) περιγράφει την ταυτότητα του έργου, τις εξαρτήσεις του και τον τρόπο κατασκευής του.
Question 2 : Πού περιμένει το Maven να βρει από προεπιλογή τον κύριο πηγαίο κώδικα;
a) code/
b) target/main
c) src/main/java
d) java/source
✅ Απάντηση: c) — Κατά σύμβαση, ο κύριος κώδικας πηγαίνει στο src/main/java και οι δοκιμές στο src/test/java.
Question 3 : Τι σημαίνει «σύμβαση αντί για διαμόρφωση»;
a) Πρέπει να διαμορφώνετε τα πάντα ρητά
b) Το Maven χρησιμοποιεί λογικές προεπιλογές, μειώνοντας την απαραίτητη διαμόρφωση
c) Δεν μπορείτε ποτέ να αλλάξετε τη συμπεριφορά του Maven
d) Το Maven δεν έχει αρχείο διαμόρφωσης
✅ Απάντηση: b) — Τηρώντας τις προεπιλεγμένες συμβάσεις, το pom.xml παραμένει ελάχιστο. Μπορείτε πάντα να επαναπροσδιορίσετε μια σύμβαση αν χρειαστεί.
Question 4 : Ποιος φάκελος παράγεται αυτόματα από το Maven και δεν πρέπει να εκδοσιολογείται;
a) src/main/java
b) src/test/java
c) target/
d) resources/
✅ Απάντηση: c) — Το target/ περιέχει τις μεταγλωττισμένες κλάσεις και το τεχνούργημα· αναδημιουργείται σε κάθε κατασκευή και πρέπει να εμφανίζεται στο .gitignore.
Question 5 : Τι χρειάζεται το Maven για να λειτουργήσει;
a) Έναν διακομιστή ιστού
b) Ένα εγκατεστημένο JDK και ρυθμισμένο JAVA_HOME
c) Μια βάση δεδομένων
d) Node.js
✅ Απάντηση: b) — Το Maven βασίζεται στον μεταγλωττιστή javac του JDK· το JAVA_HOME πρέπει να δείχνει σε αυτό το JDK.
Επαληθεύστε την εγκατάσταση του Maven, δημιουργήστε ένα έργο «quickstart» με όνομα mon-app στην ομάδα com.exemple, κατασκευάστε το και εντοπίστε το παραγόμενο τεχνούργημα.
# 1. Επαλήθευση Maven και Java
mvn -version
# 2. Δημιουργία του έργου από τον αρχέτυπο quickstart
mvn archetype:generate \
-DgroupId=com.exemple \
-DartifactId=mon-app \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DinteractiveMode=false
# 3. Είσοδος στο έργο και επιθεώρηση της δομής
cd mon-app
ls -R # ή « tree » αν είναι διαθέσιμο
# 4. Κατασκευή του έργου
mvn package
# 5. Εντοπισμός του παραγόμενου τεχνουργήματος
ls target/Αναμενόμενο αποτέλεσμα:
target/
├── classes/
├── mon-app-1.0-SNAPSHOT.jar <-- το παραγόμενο τεχνούργημα
└── ...
BUILD SUCCESSΗ παραγόμενη δενδροειδής δομή πρέπει να περιέχει:
mon-app/
├── pom.xml
└── src/
├── main/java/com/exemple/App.java
└── test/java/com/exemple/AppTest.javaΑν το
mvn packageεμφανίζειBUILD SUCCESSκαι ένα.jarεμφανίζεται στοtarget/, η αλυσίδα Maven είναι λειτουργική. Το επίθημα-SNAPSHOTδηλώνει έκδοση υπό ανάπτυξη (βλ. μάθημα 02).
pom.xml είναι η μοναδική συνταγή που περιγράφει το έργο και την κατασκευή του.src/main/java, src/test/java, src/main/resources, έξοδος στο target/.JAVA_HOME· επαληθεύουμε με mvn -version.Μάθημα 02 — Το αρχείο pom.xml: λεπτομερής ανάλυση της συνταγής του Maven — συντεταγμένες του έργου, ιδιότητες και κληρονομιά γονέα.
Με την επιφύλαξη παντός δικαιώματος. Οποιαδήποτε αναπαραγωγή, διάδοση, χρήση ή προσαρμογή αυτού του μαθήματος, εν όλω ή εν μέρει, απαγορεύεται αυστηρά χωρίς την προηγούμενη γραπτή άδεια του Dr. Haythem REHOUMA.
Μάθημα δημιουργημένο από τον Dr. Haythem REHOUMA — Ανάπτυξη και ανάπτυξη λύσεων δεδομένων