Both sides previous revisionPrevious revisionNext revision | Previous revision |
java:packages:dir_structure [2015/09/19 03:38] – gthanos | java:packages:dir_structure [2020/02/11 10:04] (current) – external edit 127.0.0.1 |
---|
====== Δομή των αρχείων Java ====== | ====== Μεταγλώττιση κλάσεων που ανήκουν σε πακέτα ====== |
| |
| <WRAP important 80% center round> |
| ===Η συγκεκριμένη ενότητα είναι προαιρετική και μπορείτε να την παραλήψετε κατά την ανάγνωση της θεωρείας του μαθήματος.=== |
| </WRAP> |
| |
Μέχρι τώρα είδαμε ότι κάθε κλάση στη Java αποτελεί ένα ξεχωριστό αρχείο. Για παράδειγμα η κλάση ''myFirstClass'' θα βρίσκεται στο αρχείο με το όνομα ''myFirstClass.java''. Η εισαγωγή των πακέτων στην γλώσσα Java, εκτός από την ονοματοδοσία των αρχείων καθορίζει και τον κατάλογο (directory) μέσα στο οποίο θα πρέπει να βρίσκονται. | Μέχρι τώρα είδαμε ότι κάθε κλάση στη Java αποτελεί ένα ξεχωριστό αρχείο. Για παράδειγμα η κλάση ''myFirstClass'' θα βρίσκεται στο αρχείο με το όνομα ''myFirstClass.java''. Η εισαγωγή των πακέτων στην γλώσσα Java, εκτός από την ονοματοδοσία των αρχείων καθορίζει και τον κατάλογο (directory) μέσα στο οποίο θα πρέπει να βρίσκονται. |
| |
Ως παράδειγμα, θα θεωρήσουμε ξανά την κλάση Test του homework1 του τρέχοντος μαθήματος (JAVA). Με βάση τα παραπάνω διαμορφώνεται το πακέτο με όνομα ''gr.uth.inf.ce325.homework1'' μέσα στο οποίο βρίσκεται η κλάση ''Test''. | Ως παράδειγμα, θα θεωρήσουμε ξανά την κλάση Test του homework1 του μαθήματος CE325. Με βάση τα παραπάνω διαμορφώνεται το πακέτο με όνομα ''ce325.homework1'' μέσα στο οποίο βρίσκεται η κλάση ''Test''. Η ενδεικτική κλάση **Test** δίνεται παρακάτω |
| |
Ας θεωρήσουμε επίσης ότι το project ''homework1'' είναι ένα project που βρίσκεται μέσα στον κατάλογο ''JAVA/homework1/'', σε ένα τυχαίο μονοπάτι του filesystem. Ιδανικά θα θέλαμε να διαχωρίσουμε τα αρχεία πηγαίου κώδικα **.java** από τα εκτελέσιμα αρχεια **.class**. Για τον λόγο αυτό δημιουργούμε δύο υποκαταλόγους | <code java Test.java> |
| package ce325.homework1; |
| public class Test { |
| String test; |
| public Test(String s) { test = s; } |
| public String toString() { return test; } |
| } |
| </code> |
| |
| Ας θεωρήσουμε επίσης ότι όλα τα αρχεία της συγκεκριμένης εργασίας βρίσκονται μέσα στον κατάλογο ''project1/'', σε ένα τυχαίο μονοπάτι του filesystem. Ιδανικά θα θέλαμε να διαχωρίσουμε τα αρχεία πηγαίου κώδικα **.java** από τα εκτελέσιμα αρχεια **.class**. Για τον λόγο αυτό δημιουργούμε δύο υποκαταλόγους |
- ''src'' για τον πηγαίο κώδικα και | - ''src'' για τον πηγαίο κώδικα και |
- ''build'' για τα εκτελέσιμα αρχεία. | - ''build'' για τα μεταγλωττισμένα αρχεία. |
| |
Τελικά, έχουμε τους καταλόγους | Τελικά, έχουμε τους καταλόγους |
| |
<code> | <code> |
JAVA/homework1/src <-- πηγαίος κώδικας *.java | project1/src |
JAVA/homework1/build <-- εκτελέσιμα αρχεία *.class | project1/build |
</code> | </code> |
| |
Προκειμένου να μεταγλωττίσουμε την κλάση ''gr.uth.inf.ce325.homework1.Test'', αυτή θα πρέπει να βρίσκεται στον κατάλογο ''gr/uth/inf/ce325/homework1/'' μέσα στον φάκελο ''src'', δηλαδή τελικά η κλάση Test.java θα βρίσκεται στον κατάλογο | Προκειμένου να μεταγλωττίσουμε την κλάση ''ce325.homework1.Test'', αυτή θα πρέπει να βρίσκεται στον κατάλογο ''ce325/homework1/'' μέσα στον φάκελο ''src'', δηλαδή τελικά η κλάση **Test.java** θα βρίσκεται στον κατάλογο |
| |
<code> | <code> |
JAVA/Homework1/src/gr/uth/inf/ce325/homework1/Test.java | project1/src/ce325/homework1/Test.java |
</code> | </code> |
| |
Η παραπάνω κλάση μεταγλωττίζεται με μία δήλωση της μορφής | Υποθέτοντας ότι μεταβαίνουμε μέσα στον κατάλογο project1, η παραπάνω κλάση μεταγλωττίζεται με μία δήλωση της μορφής |
| |
<code> | <code> |
cd JAVA/Homework1/ | cd project1/ |
javac -d ./build/ src/gr/uth/inf/ce325/homework1/Test.java | javac -d ./build/ src/ce325/homework1/Test.java |
</code> | </code> |
| |
<WRAP tip 80% center round> | <WRAP tip 80% center round> |
To directive ''-d ./build/'' χρησιμοποιείται για να δηλώσουμε που θέλουμε να τοποθετήσουμε τελικά τα εκτελέσιμα αρχεία ''*.class''. Η τελική θέση του εκτελέσιμου **Test.class** είναι ''build/gr/uth/inf/ce325/homework1/Test.class''. O java compiler φτιάχνει την δομή καταλόγου των αρχείων **.class** όμοια με αυτή των αρχείων πηγαίου κώδικα αυτόματα με βάση τα πακέτα στα οποία ανήκουν και δεν χρειάζεται να το κάνετε εσείς. | To directive ''-d ./build/'' χρησιμοποιείται για να δηλώσουμε πού θέλουμε να τοποθετήσουμε τελικά τα εκτελέσιμα αρχεία ''*.class''. Η τελική θέση του εκτελέσιμου **Test.class** είναι στον κατάλογο ''project1/build''. Επειδή το μεταγλωττισμένο αρχείο θα πρέπει να βρίσκεται εσωτερικά στον κατάλογο ''ce325/homework1/'' τελικά καταλήγουμε το πλήρες path του μεταγλωττισμένου αρχείου να είναι ''project1/build/ce325/homework1/Test.class''. |
| |
| O Java compiler φτιάχνει την δομή καταλόγου των αρχείων **.class** __αυτόματα με βάση το πακέτο στο οποίο ανήκουν__. Για παράδειγμα, από το πακέτο ce325.homework1 φτιάχνονται αυτόματα από τον compiler κάτω από τον κατάλογο ''build'' οι κατάλογοι ''ce325'' και ''ce325/homework1''. Μέσα στον κατάλογο ''ce325/homework1'' εισάγεται το μεταγλωττισμένο αρχείο ''Test.class'' |
</WRAP> | </WRAP> |
| |
|Προηγούμενο: [[ :java:packages:using | Χρήση πακέτων ]] | Επόμενο: [[ :java:classpath | Η μεταβλητή περιβάλλοντος CLASSPATH ]] | | |Προηγούμενο: [[ :java:packages:using | Χρήση (μεταγλωττισμένων) κλάσεων από άλλες κλάσεις ]] | [[ :toc | Περιεχόμενα ]] | Επόμενο: [[ :java:jar_files | Αρχεία Java Archive (JAR) ]] | |