Το Maven οργανώνει την κατασκευή ενός έργου σε έναν κύκλο ζωής (lifecycle): μια διατεταγμένη ακολουθία φάσεων. Όταν ζητάτε μια φάση, το Maven εκτελεί όλες τις προηγούμενες φάσεις με τη σειρά.
Αυτή είναι η σημαντικότερη αρχή που πρέπει να θυμάστε:
Η αίτηση μιας φάσης εκτελεί αυτόματα όλες όσες προηγούνται. Το
mvn packageεκκινεί λοιπόν και ταvalidate,compileκαιtest.
Το Maven διαθέτει στην πραγματικότητα τρεις κύκλους ζωής:
| Κύκλος ζωής | Ρόλος |
|---|---|
| default | Κατασκευή του έργου (compile, test, package…) |
| clean | Εκκαθάριση (διαγραφή του target/) |
| site | Δημιουργία της τεκμηρίωσης του έργου |
# Εκτέλεση μιας φάσης = εκτέλεση όλων μέχρι αυτήν
mvn package # εκκινεί validate -> compile -> test -> package🔧 Μίνι-άσκηση — Ποιες φάσεις εκτελούνται όταν εκκινείτε mvn package; Απαριθμήστε τις με τη σειρά.
validate → compile → test → package: η αίτηση μιας φάσης εκτελεί αυτόματα όλες όσες προηγούνται.
Ο κύκλος ζωής default περιλαμβάνει πολλές φάσεις· ακολουθούν οι πιο χρησιμοποιούμενες καθημερινά:
| Φάση | Τι κάνει |
|---|---|
validate | Επαληθεύει ότι το έργο είναι ορθό και ότι υπάρχουν όλες οι απαραίτητες πληροφορίες |
compile | Μεταγλωττίζει τον πηγαίο κώδικα (src/main/java) |
test | Εκτελεί τις μοναδιαίες δοκιμές |
package | Συσκευάζει τον μεταγλωττισμένο κώδικα (.jar ή .war) |
verify | Εκκινεί τις δοκιμές ολοκλήρωσης και τους ελέγχους ποιότητας |
install | Εγκαθιστά το τεχνούργημα στο τοπικό αποθετήριο ~/.m2 |
deploy | Δημοσιεύει το τεχνούργημα σε κοινό απομακρυσμένο αποθετήριο |
mvn validate # βασικοί έλεγχοι
mvn compile # + μεταγλώττιση
mvn test # + μοναδιαίες δοκιμές
mvn package # + δημιουργία του τεχνουργήματος
mvn verify # + δοκιμές ολοκλήρωσης
mvn install # + αντιγραφή στο ~/.m2
mvn deploy # + απομακρυσμένη δημοσίευσηΌσο προχωράτε στη λίστα, τόσο περισσότερα κάνει το Maven. Το
mvn installείναι το «ελβετικό μαχαίρι» της τοπικής ανάπτυξης: κατασκευάζει τα πάντα και καθιστά το τεχνούργημα διαθέσιμο στα άλλα έργα σας στον ίδιο υπολογιστή.
Η φάση compile μετατρέπει τον κώδικα Java σας (src/main/java) σε bytecode (.class) που τοποθετείται στο target/classes. Την αναλαμβάνει το πρόσθετο Compiler, χρησιμοποιώντας τον javac του JDK.
Η χρησιμοποιούμενη έκδοση Java ορίζεται από τις ιδιότητες που είδατε στο μάθημα 02:
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties># Μεταγλώττιση του κύριου κώδικα
mvn compile
# Μεταγλώττιση και του κώδικα δοκιμών
mvn test-compile🔧 Μίνι-άσκηση — Σε ποιον φάκελο τοποθετείται το bytecode .class του κύριου κώδικα μετά το mvn compile;
Στο target/classes (για παράδειγμα target/classes/com/exemple/App.class).
| Ιδιότητα | Ρόλος |
|---|---|
maven.compiler.source | Έκδοση της γλώσσας Java που γίνεται αποδεκτή στον κώδικα |
maven.compiler.target | Έκδοση του παραγόμενου bytecode |
Αποτέλεσμα στο target/:
target/
└── classes/
└── com/exemple/App.class <-- μεταγλωττισμένο bytecodeΑν η μεταγλώττιση αποτύχει (
BUILD FAILURE), το Maven σταματά αμέσως: οι επόμενες φάσεις (test,package) δεν εκτελούνται. Διορθώνουμε πάντα πρώτα τα σφάλματα μεταγλώττισης.
Η φάση test εκτελεί τις μοναδιαίες δοκιμές που βρίσκονται στο src/test/java. Τις εκκινεί το πρόσθετο Surefire, συνήθως με το πλαίσιο JUnit.
Μια τυπική δοκιμή JUnit:
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
class CalculTest {
@Test
void additionDeDeuxNombres() {
assertEquals(4, 2 + 2);
}
}# Εκτέλεση όλων των δοκιμών
mvn test
# Εκτέλεση μίας μόνο κλάσης δοκιμής
mvn test -Dtest=CalculTest
# Κατασκευή ΠΑΡΑΛΕΙΠΟΝΤΑΣ τις δοκιμές (να αποφεύγεται, εκτός συγκεκριμένων περιπτώσεων)
mvn package -DskipTests🔧 Μίνι-άσκηση — Γράψτε την εντολή Maven που συσκευάζει το έργο χωρίς να εκκινήσει τις δοκιμές.
mvn package -DskipTests| Στοιχείο | Ρόλος |
|---|---|
| JUnit | Το πλαίσιο που ορίζει και επαληθεύει τις δοκιμές |
| Surefire | Το πρόσθετο Maven που εκτελεί τις μοναδιαίες δοκιμές |
| Failsafe | Το πρόσθετο που εκτελεί τις δοκιμές ολοκλήρωσης (φάση verify) |
⚠️ Αν αποτύχει έστω μία δοκιμή, αποτυγχάνει ολόκληρη η κατασκευή (
BUILD FAILURE) και τοpackageδεν παράγεται. Αυτό είναι σκόπιμο: δεν παραδίδουμε τεχνούργημα του οποίου οι δοκιμές δεν περνούν. Η παράλειψη δοκιμών με-DskipTestsπρέπει να παραμένει εξαίρεση.
Η φάση package συναρμολογεί τον μεταγλωττισμένο κώδικα σε ένα παραδοτέο τεχνούργημα, που τοποθετείται στο target/. Ο τύπος τεχνουργήματος εξαρτάται από την ετικέτα <packaging> του pom.xml.
| Packaging | Τεχνούργημα | Χρήση |
|---|---|---|
jar | .jar | Βιβλιοθήκη ή αυτόνομη εφαρμογή Java |
war | .war | Εφαρμογή ιστού αναπτυγμένη σε διακομιστή (Tomcat…) |
pom | (κανένα) | Έργο γονέας/συσσωρευτής, χωρίς κώδικα |
<!-- Επιλογή του τύπου τεχνουργήματος -->
<packaging>jar</packaging># Παραγωγή του τεχνουργήματος
mvn package
# Εντοπισμός του αποτελέσματος
ls target/Αποτέλεσμα:
target/
├── classes/
├── mon-app-1.0.0-SNAPSHOT.jar <-- το παραδοτέο τεχνούργημα
└── ...Το όνομα του τεχνουργήματος ακολουθεί το μοτίβο
artifactId-version.packaging. Παράδειγμα:mon-app-1.0.0-SNAPSHOT.jar. Αυτό είναι το αρχείο που διανέμετε ή αναπτύσσετε.
Μετά το package, τρεις λειτουργίες ολοκληρώνουν τον κύκλο ζωής.
| Εντολή | Αποτέλεσμα |
|---|---|
mvn install | Κατασκευάζει + αντιγράφει το τεχνούργημα στο ~/.m2 (επαναχρησιμοποιήσιμο τοπικά) |
mvn deploy | Κατασκευάζει + δημοσιεύει το τεχνούργημα σε απομακρυσμένο αποθετήριο (Nexus/Artifactory) |
mvn clean | Διαγράφει τον φάκελο target/ (ξεκινά από το μηδέν) |
Ο συνδυασμός clean install είναι από τους πιο συνηθισμένους: εγγυάται μια εντελώς καθαρή κατασκευή.
# Εκκίνηση από το μηδέν και πλήρης κατασκευή μέχρι την τοπική εγκατάσταση
mvn clean install
# Κατασκευή και δημοσίευση στο απομακρυσμένο αποθετήριο της ομάδας
mvn clean deploy| Φάση | Ποιος τη χρειάζεται; |
|---|---|
install | Προγραμματιστής που θέλει να επαναχρησιμοποιήσει το τεχνούργημα σε άλλο τοπικό έργο |
deploy | Ομάδα / CI που δημοσιεύει μια έκδοση για όλους |
clean | Όποιος θέλει να αποφύγει κατάλοιπα προηγούμενης κατασκευής |
Το
mvn clean installείναι το αντανακλαστικό όταν «δεν δουλεύει πια χωρίς λόγο»: τοcleanεξαλείφει τυχόν παρωχημένα μεταγλωττισμένα αρχεία στοtarget/.
🔧 Μίνι-άσκηση — Γράψτε την εντολή που ξεκινά από καθαρό target/ και έπειτα εγκαθιστά το τεχνούργημα στο τοπικό αποθετήριο ~/.m2.
mvn clean installQuestion 1 : Τι συμβαίνει όταν εκκινείτε mvn package;
a) Εκτελείται μόνο η φάση package
b) Το Maven εκτελεί και όλες τις προηγούμενες φάσεις (validate, compile, test)
c) Το Maven δημοσιεύει το τεχνούργημα σε απομακρυσμένο αποθετήριο
d) Το Maven διαγράφει τον φάκελο target/
✅ Απάντηση: b) — Η αίτηση μιας φάσης εκτελεί όλες τις προηγούμενες με τη σειρά: validate → compile → test → package.
Question 2 : Ποιο πρόσθετο Maven εκτελεί τις μοναδιαίες δοκιμές;
a) Compiler
b) Surefire
c) Shade
d) Jar
✅ Απάντηση: b) — Το πρόσθετο Surefire εκτελεί τις μοναδιαίες δοκιμές (με JUnit) κατά τη φάση test.
Question 3 : Τι κάνει η φάση install;
a) Εγκαθιστά το Maven στον υπολογιστή
b) Αντιγράφει το τεχνούργημα στο τοπικό αποθετήριο ~/.m2
c) Δημοσιεύει στο Maven Central
d) Διαγράφει το target/
✅ Απάντηση: b) — Το install αντιγράφει το τεχνούργημα στο ~/.m2, καθιστώντας το επαναχρησιμοποιήσιμο από άλλα τοπικά έργα.
Question 4 : Ποια ετικέτα καθορίζει αν το έργο παράγει .jar ή .war;
a) <scope>
b) <version>
c) <packaging>
d) <artifactId>
✅ Απάντηση: c) — Το <packaging>jar</packaging> ή το <packaging>war</packaging> καθορίζει τον τύπο τεχνουργήματος που παράγει το package.
Question 5 : Τι συμβαίνει κατά το mvn package αν αποτύχει μια μοναδιαία δοκιμή;
a) Το τεχνούργημα παράγεται παρ' όλα αυτά
b) Η κατασκευή αποτυγχάνει (BUILD FAILURE) και το τεχνούργημα δεν παράγεται
c) Το Maven αγνοεί τη δοκιμή
d) Το Maven περνά απευθείας στο deploy
✅ Απάντηση: b) — Μια αποτυχημένη δοκιμή σταματά την κατασκευή· το package δεν δημιουργείται. Αυτό είναι σκόπιμο: δεν παραδίδουμε τεχνούργημα του οποίου οι δοκιμές αποτυγχάνουν.
Σε ένα έργο Maven, διατρέξτε τον κύκλο ζωής βήμα προς βήμα: καθαρίστε, μεταγλωττίστε, δοκιμάστε, συσκευάστε και έπειτα εγκαταστήστε τοπικά. Παρατηρήστε σε κάθε βήμα τι παράγει το Maven στο target/.
# 1. Εκκίνηση από το μηδέν : διαγράφει το target/
mvn clean
# 2. Μεταγλώττιση : παράγει target/classes
mvn compile
ls target/classes # υπάρχει bytecode .class
# 3. Δοκιμή : το Surefire εκτελεί τις δοκιμές JUnit
mvn test
# 4. Συσκευασία : παράγει το .jar στο target/
mvn package
ls target/*.jar # mon-app-1.0.0-SNAPSHOT.jar
# 5. Εγκατάσταση στο τοπικό αποθετήριο ~/.m2
mvn install
# Πιο συνηθισμένη συμπυκνωμένη παραλλαγή :
mvn clean installΑναμενόμενο αποτέλεσμα:
[INFO] --- compiler:compile --- (target/classes δημιουργήθηκε)
[INFO] --- surefire:test --- Tests run: 1, Failures: 0, Errors: 0
[INFO] --- jar:jar --- Building jar: target/mon-app-1.0.0-SNAPSHOT.jar
[INFO] --- install:install --- Installing ... to ~/.m2/repository/...
[INFO] BUILD SUCCESSΠαρατηρήστε τη σειρά των γραμμών
[INFO]:compile, έπειταtest, έπειταjar, έπειταinstall. Είναι η ορατή απόδειξη ότι το Maven αλυσιδώνει αυτόματα τις φάσεις με τη σειρά του κύκλου ζωής.
validate → compile → test → package → verify → install → deploy.compile (πρόσθετο Compiler) παράγει το bytecode στο target/classes.test (πρόσθετο Surefire + JUnit) εκτελεί τις δοκιμές· μια αποτυχία σταματά την κατασκευή.package δημιουργεί το .jar/.war· το install το αντιγράφει στο ~/.m2· το clean αδειάζει το target/.Πλέον κατέχετε το Maven: δομή, pom.xml, εξαρτήσεις και κύκλος ζωής. Η ενότητα 04 θα προσεγγίσει την εμπορευματοκιβωτιοποίηση με Docker, όπου θα συσκευάσετε αυτά τα τεχνουργήματα Maven σε φορητές εικόνες.
Με την επιφύλαξη παντός δικαιώματος. Οποιαδήποτε αναπαραγωγή, διάδοση, χρήση ή προσαρμογή αυτού του μαθήματος, εν όλω ή εν μέρει, απαγορεύεται αυστηρά χωρίς την προηγούμενη γραπτή άδεια του Dr. Haythem REHOUMA.
Μάθημα δημιουργημένο από τον Dr. Haythem REHOUMA — Ανάπτυξη και ανάπτυξη λύσεων δεδομένων