This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
java:classpath [2015/09/19 04:55] gthanos [Παραδείγματα χρήσης CLASSPATH] |
java:classpath [2016/02/26 11:15] (current) |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== JAVA CLASSPATH ====== | + | ====== Η μεταβλητή περιβάλλοντος CLASSPATH ====== |
| Ως CLASSPATH ορίζεται το σύνολο των καταλόγων (directories) του συστήματος στα οποία βρίσκονται μεταγλωττισμένες κλάσεις (δηλ **.class** αρχεία) και οι οποίες είναι απαραίτητες για την μεταγλώττιση ή για τη εκτέλεση ενός προγράμματος Java. Με άλλα λόγια το CLASSPATH για κάθε Java πρόγραμμα δείχνει στο σύνολο των βιβλιοθηκών που απαιτούνται. | Ως CLASSPATH ορίζεται το σύνολο των καταλόγων (directories) του συστήματος στα οποία βρίσκονται μεταγλωττισμένες κλάσεις (δηλ **.class** αρχεία) και οι οποίες είναι απαραίτητες για την μεταγλώττιση ή για τη εκτέλεση ενός προγράμματος Java. Με άλλα λόγια το CLASSPATH για κάθε Java πρόγραμμα δείχνει στο σύνολο των βιβλιοθηκών που απαιτούνται. | ||
| Line 8: | Line 8: | ||
| Στα πλαίσια του μαθήματος μας ΔΕΝ θα χρειαστεί να αλλάξετε μόνιμα την μεταβλητή CLASSPATH. Εάν επιθυμείτε αλλαγή της μεταβλητής CLASSPATΗ μπορείτε να το κάνετε με την βοήθεια των παρακάτω συνδέσμων. | Στα πλαίσια του μαθήματος μας ΔΕΝ θα χρειαστεί να αλλάξετε μόνιμα την μεταβλητή CLASSPATH. Εάν επιθυμείτε αλλαγή της μεταβλητής CLASSPATΗ μπορείτε να το κάνετε με την βοήθεια των παρακάτω συνδέσμων. | ||
| - | * http://docs.oracle.com/javase/8/docs/technotes/tools/windows/classpath.hml | + | * https://docs.oracle.com/javase/8/docs/technotes/tools/windows/classpath.html |
| * http://javarevisited.blogspot.gr/2011/01/how-classpath-work-in-java.html | * http://javarevisited.blogspot.gr/2011/01/how-classpath-work-in-java.html | ||
| Line 22: | Line 22: | ||
| ===== Παραδείγματα χρήσης CLASSPATH ===== | ===== Παραδείγματα χρήσης CLASSPATH ===== | ||
| - | <WRAP tip 80% center round> | + | ===== Χρήση Classpath - Παράδειγμα 1ο ===== |
| **Προσοχή:** __Η μεταβλητή CLASSPATH δείχνει κάθε φορά όχι που βρίσκονται τα τελικά αρχεία *.class για κάθε κλάση, αλλά που θα πρέπει να ψάξει ο compiler ή το JRE για αρχεία *.class.__ | **Προσοχή:** __Η μεταβλητή CLASSPATH δείχνει κάθε φορά όχι που βρίσκονται τα τελικά αρχεία *.class για κάθε κλάση, αλλά που θα πρέπει να ψάξει ο compiler ή το JRE για αρχεία *.class.__ | ||
| Line 37: | Line 37: | ||
| </code> | </code> | ||
| - | οι οποίες είναι μεταγλωττισμένες μέσα στον κατάλογο **myProject/build/**, δηλαδή | + | οι οποίες μεταγλωττίζονται μέσα στον κατάλογο **myProject/build/classes/** με μία δήλωση της μορφής: |
| <code> | <code> | ||
| - | myProject/build/my/package1/Class1.class | + | cd path/to/dir/myProject |
| - | myProject/build/my/package2/Class2.class | + | javac -d build/classes/ src/my/package1/Class1.java |
| + | javac -d build/classes/ src/my/package1/Class2.java | ||
| </code> | </code> | ||
| - | Αν θέλετε να μεταγλωττίσετε ή να εκτελέσετε ένα πρόγραμμα το οποίο χρησιμοποιεί τις παραπάνω μεταγλωττισμένες κλάσεις θα πρέπει να δηλώσετε ως classpath τον κατάλογο **myProject/build**. | + | , δηλαδή έχουμε |
| + | <code> | ||
| + | myProject/build/classes/my/package1/Class1.class | ||
| + | myProject/build/classes/my/package2/Class2.class | ||
| + | </code> | ||
| + | |||
| + | Αν θέλετε να μεταγλωττίσετε ή να εκτελέσετε ένα πρόγραμμα το οποίο χρησιμοποιεί τις παραπάνω μεταγλωττισμένες κλάσεις θα πρέπει να δηλώσετε ως classpath τον κατάλογο **myProject/build/classes/**. | ||
| + | |||
| + | δηλαδή | ||
| + | <code> | ||
| + | javac -cp path/to/dir/myProject/build/classes/ JavaClassToCompileAndRun.java | ||
| + | </code> | ||
| Από εκεί και κάτω, εφόσον ο compiler γνωρίζει το πλήρες όνομα της κλάσης (<package name> + <class name>) αναζητά στο αντίστοιχο path την κλάση που χρειάζεται κάθε φορά. | Από εκεί και κάτω, εφόσον ο compiler γνωρίζει το πλήρες όνομα της κλάσης (<package name> + <class name>) αναζητά στο αντίστοιχο path την κλάση που χρειάζεται κάθε φορά. | ||
| - | Έτσι αν ο compiler ή το JRE χρειάζεται την κλάση **my.package1.Class1** τότε στο classpath που έχετε ορίσει θα ψάξει για την κλάση με συνολικό path **my/package1/Class1.class**. | + | Έτσι αν ο compiler ή το JRE χρειάζεται την κλάση **my.package1.Class1** τότε στο classpath που έχετε ορίσει θα ψάξει για την κλάση με συνολικό path **myProject/build/classes/my/package1/Class1.class**. |
| - | </WRAP> | + | |
| - | Aς υποθέσουμε ότι θέλετε να μεταγλωττίσετε την κλάση **MyTestClass.java** η οποία απαιτεί τις κλάσεις **my.library.Cone** και **my.library.Cylinder**, δηλαδή τις κλάσεις **Cone** και **Cylinder** που ανήκουν στο package **my.library**. Ας υποθέσουμε επίσης ότι στο λειτουργικό σύστημα Linux το path των παραπάνω __μεταγλωττισμένων__ κλάσεων βρίσκεται στον παρακάτω κατάλογο | + | ===== Χρήση Classpath - Παράδειγμα 2ο ===== |
| + | |||
| + | Κατεβάστε το παράδειγμα {{:java:classpath_usage_ex2.tgz|}}. | ||
| + | |||
| + | Aς υποθέσουμε ότι θέλετε να μεταγλωττίσετε την κλάση **MyTestClass.java** η οποία απαιτεί τις κλάσεις **my.library.Cone.java** και **my.library.Cylinder.java**, δηλαδή τις κλάσεις **Cone** και **Cylinder** που ανήκουν στο package **my.library**. Ας υποθέσουμε επίσης ότι στο λειτουργικό σύστημα Linux το path των παραπάνω __μεταγλωττισμένων__ κλάσεων βρίσκεται στον παρακάτω κατάλογο | ||
| <code> | <code> | ||
| - | /home/username/Java/libraries/build/my/library/Cone.class | + | /path/to/dir/classpath_usage_ex1/build/classes/my/library/Cone.class |
| - | /home/username/Java/libraries/build/my/library/Cylinder.class | + | /path/to/dir/classpath_usage_ex1/build/classes/my/library/Cylinder.class |
| </code> | </code> | ||
| - | Επίσης, το πακέτο **my.library** μετά την μεταγλώττιση όλων των κλάσεων που ανήκουν σε αυτό συμπιέζεται στο αρχείο **shapes3d.jar** που βρίσκεται στον κατάλογο | + | Επίσης, το πακέτο **my.library** μετά την μεταγλώττιση όλων των κλάσεων που ανήκουν σε αυτό συμπιέζεται στο αρχείο **my-library.jar** που βρίσκεται στον κατάλογο |
| <code> | <code> | ||
| - | /home/username/Java/libraries/build/jar/shapes3d.jar | + | /path/to/dir/classpath_usage_ex1/build/jar/my-library.jar |
| </code> | </code> | ||
| - | |||
| ==== Χρήση dir classpath ==== | ==== Χρήση dir classpath ==== | ||
| Line 69: | Line 83: | ||
| <code> | <code> | ||
| - | javac MyTestClass.java -cp /home/username/CE325/my_projects/homework2/build/classes/ | + | javac MyTestClass.java -cp /path/to/dir/classpath_usage_ex1/build/classes/ |
| </code> | </code> | ||
| Line 77: | Line 91: | ||
| <code> | <code> | ||
| - | javac MyTestClass.java -cp /home/username/CE325/my_projects/homework2/build/jar/homework2.jar | + | javac MyTestClass.java -cp /path/to/dir/classpath_usage_ex1/build/jar/my-library.jar |
| </code> | </code> | ||
| - | (__προσέξτε ότι ορίζουμε το jar αρχείο και όχι τον κατάλογο στον οποίο περιέχεται__). | ||
| - | ==== Χρήση πολλαπλών classpaths ==== | + | <WRAP tip 80% center round> |
| + | Παρατηρήστε ότι ορίζουμε το **jar** αρχείο και όχι τον κατάλογο στον οποίο περιέχεται. Στο παραπάνω παράδειγμα χρησιμοποιούμε απόλυτα paths για τον ορισμό του CLASSPATH. Φυσικά μπορείτε να χρησιμοποιείται και σχετικά paths, όπως παρακάτω | ||
| + | |||
| + | Υποθέτωντας ότι βρίσκεστε στον κατάλογο **/home/username/Java/test/** θα γράφατε. | ||
| + | <code> | ||
| + | javac MyTestClass.java -cp build/jar/my-library.jar | ||
| + | </code> | ||
| + | </WRAP> | ||
| + | |||
| + | ===== Χρήση πολλαπλών classpaths ===== | ||
| Εάν θέλετε να ορίσετε στο CLASSPATH πολλαπλά **jar** αρχεία ή directories, τότε μπορείτε να το κάνετε ακολουθώντας τους παραπάνω κανόνες και χωρίζοντας τις εγγραφές με τον χαρακτήρα **':'** στο Linux ή με τον χαρακτήρα **';'** στο λειτουργικό σύστημα Windows. | Εάν θέλετε να ορίσετε στο CLASSPATH πολλαπλά **jar** αρχεία ή directories, τότε μπορείτε να το κάνετε ακολουθώντας τους παραπάνω κανόνες και χωρίζοντας τις εγγραφές με τον χαρακτήρα **':'** στο Linux ή με τον χαρακτήρα **';'** στο λειτουργικό σύστημα Windows. | ||
| Line 89: | Line 111: | ||
| <code> | <code> | ||
| - | /home/username/CE325/other_libs/ntua-common-libs.jar | + | /home/username/CE325/other_libs/ntua-common-libs.jar (Linux) ή |
| + | C:\Users\username\CE325\other_libs\ntua-common-libs.jar (Windows) | ||
| </code> | </code> | ||
| Line 103: | Line 126: | ||
| <code> | <code> | ||
| - | javac MyTestClass.java -cp /home/username/CE325/my_projects/homework2/build/classes;/home/username/CE325/other_libs/ntua-common-libs.jar | + | javac MyTestClass.java -cp C:\Users\username\CE325\my_projects\homework2\build\classes;C:\Users\username\CE325\other_libs\ntua-common-libs.jar |
| </code> | </code> | ||
| Line 171: | Line 194: | ||
| </code> | </code> | ||
| - | Εναλλακτικά χρησιμοποιήστε το αρχείο ''build.xml'' που επισυνάπτεται για να αυτοματοποιήσετε την παραπάνω διαδικασία με το πρόγραμμα [[http://ant.apache.org/|Ant]]. Για εγκατάσταση του Ant σε Linux εγκαταστήστε το αντίστοιχο πακέτο. Για την εγκατάσταση σε Windows κατεβάστε το πρόγραμμα [[https://code.google.com/p/winant/|WinAnt]]. | + | Εναλλακτικά χρησιμοποιήστε το αρχείο ''build.xml'' που επισυνάπτεται για να αυτοματοποιήσετε την παραπάνω διαδικασία με το πρόγραμμα [[http://ant.apache.org/|Apache Ant]]. Περισσότερα για την μεταγλώττιση με την βοήθεια του Apache Ant μπορείτε να βρείτε στην ενότητα που ακολουθεί. |
| + | |||
| + | |Προηγούμενο: [[:java:jar_files | Αρχεία Java Archive (JAR) ]] | [[:toc | Περιεχόμενα]] |Επόμενο: [[ java:ant|Αυτόματη μεταγλώττιση με χρήση Apache Ant ]]| | ||
| - | |Προηγούμενο: [[:java:packages:dir_structure | Δομή των αρχείων Java ]] | Επόμενο: [[ :java:jar_files | Αρχεία JAR ]]| | ||