Κύκλος ζωής και φάσεις

8 λεπτά

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


1 — Ο κύκλος ζωής κατασκευής

Το Maven οργανώνει την κατασκευή ενός έργου σε έναν κύκλο ζωής (lifecycle): μια διατεταγμένη ακολουθία φάσεων. Όταν ζητάτε μια φάση, το Maven εκτελεί όλες τις προηγούμενες φάσεις με τη σειρά.

Αυτή είναι η σημαντικότερη αρχή που πρέπει να θυμάστε:

Η αίτηση μιας φάσης εκτελεί αυτόματα όλες όσες προηγούνται. Το mvn package εκκινεί λοιπόν και τα validate, compile και test.

Το Maven διαθέτει στην πραγματικότητα τρεις κύκλους ζωής:

Κύκλος ζωήςΡόλος
defaultΚατασκευή του έργου (compile, test, package…)
cleanΕκκαθάριση (διαγραφή του target/)
siteΔημιουργία της τεκμηρίωσης του έργου
bash
# Εκτέλεση μιας φάσης = εκτέλεση όλων μέχρι αυτήν
mvn package      # εκκινεί validate -> compile -> test -> package

🔧 Μίνι-άσκηση — Ποιες φάσεις εκτελούνται όταν εκκινείτε mvn package; Απαριθμήστε τις με τη σειρά.

✅ Δείτε μια λύση

validatecompiletestpackage: η αίτηση μιας φάσης εκτελεί αυτόματα όλες όσες προηγούνται.

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


2 — Οι κύριες φάσεις

Ο κύκλος ζωής default περιλαμβάνει πολλές φάσεις· ακολουθούν οι πιο χρησιμοποιούμενες καθημερινά:

ΦάσηΤι κάνει
validateΕπαληθεύει ότι το έργο είναι ορθό και ότι υπάρχουν όλες οι απαραίτητες πληροφορίες
compileΜεταγλωττίζει τον πηγαίο κώδικα (src/main/java)
testΕκτελεί τις μοναδιαίες δοκιμές
packageΣυσκευάζει τον μεταγλωττισμένο κώδικα (.jar ή .war)
verifyΕκκινεί τις δοκιμές ολοκλήρωσης και τους ελέγχους ποιότητας
installΕγκαθιστά το τεχνούργημα στο τοπικό αποθετήριο ~/.m2
deployΔημοσιεύει το τεχνούργημα σε κοινό απομακρυσμένο αποθετήριο
bash
mvn validate    # βασικοί έλεγχοι
mvn compile     # + μεταγλώττιση
mvn test        # + μοναδιαίες δοκιμές
mvn package     # + δημιουργία του τεχνουργήματος
mvn verify      # + δοκιμές ολοκλήρωσης
mvn install     # + αντιγραφή στο ~/.m2
mvn deploy      # + απομακρυσμένη δημοσίευση

Όσο προχωράτε στη λίστα, τόσο περισσότερα κάνει το Maven. Το mvn install είναι το «ελβετικό μαχαίρι» της τοπικής ανάπτυξης: κατασκευάζει τα πάντα και καθιστά το τεχνούργημα διαθέσιμο στα άλλα έργα σας στον ίδιο υπολογιστή.

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


3 — Μεταγλώττιση

Η φάση compile μετατρέπει τον κώδικα Java σας (src/main/java) σε bytecode (.class) που τοποθετείται στο target/classes. Την αναλαμβάνει το πρόσθετο Compiler, χρησιμοποιώντας τον javac του JDK.

Η χρησιμοποιούμενη έκδοση Java ορίζεται από τις ιδιότητες που είδατε στο μάθημα 02:

xml
<properties>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
</properties>
bash
# Μεταγλώττιση του κύριου κώδικα
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) δεν εκτελούνται. Διορθώνουμε πάντα πρώτα τα σφάλματα μεταγλώττισης.

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


4 — Οι δοκιμές (JUnit + Surefire)

Η φάση test εκτελεί τις μοναδιαίες δοκιμές που βρίσκονται στο src/test/java. Τις εκκινεί το πρόσθετο Surefire, συνήθως με το πλαίσιο JUnit.

Μια τυπική δοκιμή JUnit:

java
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;

class CalculTest {
    @Test
    void additionDeDeuxNombres() {
        assertEquals(4, 2 + 2);
    }
}
bash
# Εκτέλεση όλων των δοκιμών
mvn test

# Εκτέλεση μίας μόνο κλάσης δοκιμής
mvn test -Dtest=CalculTest

# Κατασκευή ΠΑΡΑΛΕΙΠΟΝΤΑΣ τις δοκιμές (να αποφεύγεται, εκτός συγκεκριμένων περιπτώσεων)
mvn package -DskipTests

🔧 Μίνι-άσκηση — Γράψτε την εντολή Maven που συσκευάζει το έργο χωρίς να εκκινήσει τις δοκιμές.

✅ Δείτε μια λύση
bash
mvn package -DskipTests
ΣτοιχείοΡόλος
JUnitΤο πλαίσιο που ορίζει και επαληθεύει τις δοκιμές
SurefireΤο πρόσθετο Maven που εκτελεί τις μοναδιαίες δοκιμές
FailsafeΤο πρόσθετο που εκτελεί τις δοκιμές ολοκλήρωσης (φάση verify)

⚠️ Αν αποτύχει έστω μία δοκιμή, αποτυγχάνει ολόκληρη η κατασκευή (BUILD FAILURE) και το package δεν παράγεται. Αυτό είναι σκόπιμο: δεν παραδίδουμε τεχνούργημα του οποίου οι δοκιμές δεν περνούν. Η παράλειψη δοκιμών με -DskipTests πρέπει να παραμένει εξαίρεση.

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


5 — Η συσκευασία (jar / war)

Η φάση package συναρμολογεί τον μεταγλωττισμένο κώδικα σε ένα παραδοτέο τεχνούργημα, που τοποθετείται στο target/. Ο τύπος τεχνουργήματος εξαρτάται από την ετικέτα <packaging> του pom.xml.

PackagingΤεχνούργημαΧρήση
jar.jarΒιβλιοθήκη ή αυτόνομη εφαρμογή Java
war.warΕφαρμογή ιστού αναπτυγμένη σε διακομιστή (Tomcat…)
pom(κανένα)Έργο γονέας/συσσωρευτής, χωρίς κώδικα
xml
<!-- Επιλογή του τύπου τεχνουργήματος -->
<packaging>jar</packaging>
bash
# Παραγωγή του τεχνουργήματος
mvn package

# Εντοπισμός του αποτελέσματος
ls target/

Αποτέλεσμα:

target/
├── classes/
├── mon-app-1.0.0-SNAPSHOT.jar   <-- το παραδοτέο τεχνούργημα
└── ...

Το όνομα του τεχνουργήματος ακολουθεί το μοτίβο artifactId-version.packaging. Παράδειγμα: mon-app-1.0.0-SNAPSHOT.jar. Αυτό είναι το αρχείο που διανέμετε ή αναπτύσσετε.

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


6 — Install, deploy και clean

Μετά το package, τρεις λειτουργίες ολοκληρώνουν τον κύκλο ζωής.

ΕντολήΑποτέλεσμα
mvn installΚατασκευάζει + αντιγράφει το τεχνούργημα στο ~/.m2 (επαναχρησιμοποιήσιμο τοπικά)
mvn deployΚατασκευάζει + δημοσιεύει το τεχνούργημα σε απομακρυσμένο αποθετήριο (Nexus/Artifactory)
mvn cleanΔιαγράφει τον φάκελο target/ (ξεκινά από το μηδέν)

Ο συνδυασμός clean install είναι από τους πιο συνηθισμένους: εγγυάται μια εντελώς καθαρή κατασκευή.

bash
# Εκκίνηση από το μηδέν και πλήρης κατασκευή μέχρι την τοπική εγκατάσταση
mvn clean install

# Κατασκευή και δημοσίευση στο απομακρυσμένο αποθετήριο της ομάδας
mvn clean deploy
ΦάσηΠοιος τη χρειάζεται;
installΠρογραμματιστής που θέλει να επαναχρησιμοποιήσει το τεχνούργημα σε άλλο τοπικό έργο
deployΟμάδα / CI που δημοσιεύει μια έκδοση για όλους
cleanΌποιος θέλει να αποφύγει κατάλοιπα προηγούμενης κατασκευής

Το mvn clean install είναι το αντανακλαστικό όταν «δεν δουλεύει πια χωρίς λόγο»: το clean εξαλείφει τυχόν παρωχημένα μεταγλωττισμένα αρχεία στο target/.

🔧 Μίνι-άσκηση — Γράψτε την εντολή που ξεκινά από καθαρό target/ και έπειτα εγκαθιστά το τεχνούργημα στο τοπικό αποθετήριο ~/.m2.

✅ Δείτε μια λύση
bash
mvn clean install

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


7 — Κουίζ — Κύκλος ζωής και φάσεις

Question 1 : Τι συμβαίνει όταν εκκινείτε mvn package;

a) Εκτελείται μόνο η φάση package

b) Το Maven εκτελεί και όλες τις προηγούμενες φάσεις (validate, compile, test)

c) Το Maven δημοσιεύει το τεχνούργημα σε απομακρυσμένο αποθετήριο

d) Το Maven διαγράφει τον φάκελο target/

💡 Δείτε τη λύση

Απάντηση: b) — Η αίτηση μιας φάσης εκτελεί όλες τις προηγούμενες με τη σειρά: validatecompiletestpackage.


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 δεν δημιουργείται. Αυτό είναι σκόπιμο: δεν παραδίδουμε τεχνούργημα του οποίου οι δοκιμές αποτυγχάνουν.

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


8 — Πρακτική — Διάσχιση του κύκλου ζωής

Εκφώνηση

Σε ένα έργο Maven, διατρέξτε τον κύκλο ζωής βήμα προς βήμα: καθαρίστε, μεταγλωττίστε, δοκιμάστε, συσκευάστε και έπειτα εγκαταστήστε τοπικά. Παρατηρήστε σε κάθε βήμα τι παράγει το Maven στο target/.


Διόρθωση — Αναμενόμενη ακολουθία εντολών

bash
# 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 αλυσιδώνει αυτόματα τις φάσεις με τη σειρά του κύκλου ζωής.

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


9 — Σύνοψη

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

  1. Ο κύκλος ζωής είναι μια διατεταγμένη ακολουθία φάσεων· η αίτηση μιας φάσης εκτελεί όλες τις προηγούμενες.
  2. Κύριες φάσεις: validatecompiletestpackageverifyinstalldeploy.
  3. Το compile (πρόσθετο Compiler) παράγει το bytecode στο target/classes.
  4. Το test (πρόσθετο Surefire + JUnit) εκτελεί τις δοκιμές· μια αποτυχία σταματά την κατασκευή.
  5. Το package δημιουργεί το .jar/.war· το install το αντιγράφει στο ~/.m2· το clean αδειάζει το target/.

Η συνέχεια

Πλέον κατέχετε το Maven: δομή, pom.xml, εξαρτήσεις και κύκλος ζωής. Η ενότητα 04 θα προσεγγίσει την εμπορευματοκιβωτιοποίηση με Docker, όπου θα συσκευάσετε αυτά τα τεχνουργήματα Maven σε φορητές εικόνες.

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


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

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