java:classpath

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
java:classpath [2015/09/19 04:30]
gthanos
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 πρόγραμμα δείχνει στο σύνολο των βιβλιοθηκών που απαιτούνται.
  
-<​WRAP ​important 80% center round> +Όλα τα λειτουργικά συστήματα διαθέτουν την μεταβλητή [[java:​install|PATH]],​ όπου προσδιορίζονται οι κατάλογοι του συστήματος οι οποίοι περιέχουν εκτελέσιμα αρχεία συστήματος. Σε αναλογία με την μεταβλητή PATH, η μεταβλητή CLASSPATH προσδιορίζει του καταλόγους ή τα αρχεία τύπου **.jar** που είναι απαραίτητα για τη εκτέλεση ή την μεταγλώττιση ενός πρόγράμματος. Η μεταβλητή CLASSPATH αποτελεί μεταβλητή του συστήματος,​ την οποία τα εργαλεία της Java ελέγχουν για ύπαρξη πιθανών βιβλιοθηκών.  
-**Προσοχή:​** Η μεταβλητή CLASSPATH δείχνει κάθε φορά όχι που βρίσκονται τα αρχεία *.class για κάθε κλάση, αλλά που θα πρέπει να ψάξει ο compiler ή το JRE για αρχεία *.class. ​Για παράδειγμα, αν έχετε τις κλάσεις+ 
 +===== Αλλάζοντας μόνιμα την μεταβλητή CLASSPATH ===== 
 + 
 +Στα πλαίσια του μαθήματος μας ΔΕΝ θα χρειαστεί να αλλάξετε μόνιμα την μεταβλητή CLASSPATH. Εάν επιθυμείτε αλλαγή της μεταβλητής CLASSPATΗ μπορείτε να το κάνετε με την βοήθεια των παρακάτω συνδέσμων. 
 +  * https://​docs.oracle.com/​javase/​8/​docs/​technotes/​tools/​windows/​classpath.html 
 +  * http://​javarevisited.blogspot.gr/​2011/​01/​how-classpath-work-in-java.html 
 + 
 +===== Αλλάζοντας προσωρινά την μεταβλητή CLASSPATH ===== 
 + 
 +Στις περισσότερες περιπτώσεις αυτό που θα σας ζητηθεί είναι ο προσωρινός ορισμός του περιεχομένου της μεταβλητής CLASSPATH για τις ανάγκες ενός προγράμματος. Για να μεταγλωττίσετε ή για να τρέξετε το πρόγραμμα σας συχνά θα χρειαστείτε άλλες κλάσεις τις οποίες έχετε μεταγλωττίσει ή βιβλιοθήκες τρίτων τις οποίες χρησιμοποιείτε στα προγράμματα σας. Για να ορίσετε επομένως τα PATHs των κλάσεων ή των βιβλιθηκών αυτών θα χρειαστεί να προσδιορίσετε τις κλάσεις ή τις βιβλιοθήκες αυτές. Αυτό το κάνετε κατά την μεταγλώττιση ή κατά την εκτέλεση ενός προγράμματος μέσω του flag **-classpath** ή **-cp**. 
 + 
 +<WRAP center ​tip round 70%> 
 +Όταν ορίζετε την μεταβλητή CLASSPATH μέσω της επιλογής (flag) **-classpath** ή **-cp** κάνετε **overwrite** την μεταβλητή περιβάλλοντος CLASSPATH που πιθανόν έχετε ορίσει προηγούμενα. 
 +</​WRAP>​ 
 + 
 + 
 +===== Παραδείγματα χρήσης CLASSPATH ===== 
 + 
 +===== Χρήση Classpath - Παράδειγμα 1ο ===== 
 +**Προσοχή:​** ​__Η μεταβλητή CLASSPATH δείχνει κάθε φορά όχι που βρίσκονται τα τελικά ​αρχεία *.class για κάθε κλάση, αλλά που θα πρέπει να ψάξει ο compiler ή το JRE για αρχεία *.class.__  
 + 
 +Θα εξηγήσουμε αυτή την λεπτή διαφορά με ένα παράδειγμα. Ας υποθέσουμε ότι ​έχετε τις κλάσεις
 <​code>​ <​code>​
 my.package1.Class1 my.package1.Class1
Line 16: Line 37:
 </​code>​ </​code>​
  
-οι οποίες ​είναι ​μεταγλωττισμένες ​μέσα στον κατάλογο **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**Από εκεί και κάτω, εφόσον ο compiler γνωρίζει το πλήρες όνομα της κλάσης (<package name+ <class name>) αναζητά στο αντίστοιχο path την κλάση που χρειάζεται κάθε φορά. ​+, δηλαδή έχουμε 
 +<​code>​ 
 +myProject/​build/​classes/​my/​package1/​Class1.class 
 +myProject/​build/​classes/​my/​package2/​Class2.class 
 +</code>
  
-Έτσι αν ο compiler ή το JRE χρειάζεται την κλάση my.package1.Class1 ​τότε στο classpath ​που έχετε ​ορίσει ​θα ψάξει για την κλάση με συνολικό path **my/package1/Class1.class**.+Αν θέλετε να μεταγλωττίσετε ή να εκτελέσετε ένα πρόγραμμα ​το οποίο χρησιμοποιεί τις παραπάνω μεταγλωττισμένες κλάσεις θα πρέπει ​να δηλώσετε ως classpath τον ​κατάλογο ​**myProject/​build/classes/**. 
  
-</WRAP>+δηλαδή 
 +<code> 
 +javac -cp path/to/​dir/​myProject/​build/​classes/​ JavaClassToCompileAndRun.java 
 +</code>
  
-Όλα τα λειτουργικά συστήματα διαθέτουν την μεταβλητή [[java:​install|PATH]],​ όπου προσδιορίζονται οι κατάλογοι ​του συστήματος οι οποίοι περιέχουν εκτελέσιμα αρχεία συστήματος. Σε αναλογία με την μεταβλητή PATH, η μεταβλητή CLASSPATH προσδιορίζει του καταλόγους ​ή τα αρχεία τύπου **.jar** που είναι απαραίτητα για τη εκτέλεση ή την μεταγλώττιση ενός πρόγράμματος. Η μεταβλητή CLASSPATH αποτελεί μεταβλητή του ​συστήματος, την ​οποία τα εργαλεία της Java ελέγχουν για ύπαρξη πιθανών βιβλιοθηκών+Από ​εκεί ​και κάτω, εφόσον ο compiler ​γνωρίζει το πλήρες όνομα της κλάσης (<​package name> + <class name>) αναζητά στο αντίστοιχο path την ​κλάση ​που χρειάζεται ​κάθε φορά
  
-===== Αλλάζοντας μόνιμα την ​μεταβλητή CLASSPATH =====+Έτσι αν ο compiler ή το JRE χρειάζεται την ​κλάση **my.package1.Class1** τότε στο classpath που έχετε ορίσει θα ψάξει για την κλάση με συνολικό path **myProject/​build/​classes/​my/​package1/​Class1.class**.
  
-Στα πλαίσια του μαθήματος μας ΔΕΝ θα χρειαστεί να αλλάξετε μόνιμα την μεταβλητή CLASSPATH. Εάν επιθυμείτε αλλαγή της ​μεταβλητής CLASSPATΗ μπορείτε να το κάνετε με την βοήθεια των παρακάτω συνδέσμων. +===== Χρήση ​Classpath - Παράδειγμα ​2ο =====
-  * http://​docs.oracle.com/​javase/​8/​docs/​technotes/​tools/​windows/​classpath.hml +
-  * http://​javarevisited.blogspot.gr/​2011/​01/​how-classpath-work-in-java.html+
  
-===== Αλλάζοντας προσωρινά την μεταβλητή CLASSPATH =====+Κατεβάστε το παράδειγμα {{:​java:​classpath_usage_ex2.tgz|}}.
  
-Στις περισσότερες περιπτώσεις αυτό που θα σας ζητηθεί είναι ο προσωρινός ορισμός του περιεχομένου της μεταβλητής CLASSPATH για τις ανάγκες ενός προγράμματος. Για να μεταγλωττίσετε ή για να τρέξετε το πρόγραμμα σας συχνά θα χρειαστείτε άλλες κλάσεις τις οποίες έχετε μεταγλωττίσει ή βιβλιοθήκες τρίτων τις οποίες χρησιμοποιείτε στα προγράμματα σας. Για να ορίσετε επομένως τα PATHs των κλάσεων ή των βιβλιθηκών αυτών θα χρειαστεί να προσδιορίσετε τις κλάσεις ή τις βιβλιοθήκες αυτές. Αυτό το κάνετε κατά την μεταγλώττιση ή κατά την εκτέλεση ενός προγράμματος μέσω του flag **-classpath** ή **-cp**. +Aς υποθέσουμε ότι θέλετε να μεταγλωττίσετε την κλάση ​**MyTestClass.java** η οποία απαιτεί τις κλάσεις ​**my.library.Cone.java** ​και ​**my.library.Cylinder.java**, δηλαδή τις κλάσεις ​**Cone** ​και ​**Cylinder** που ανήκουν στο package ​**my.library**. Ας υποθέσουμε επίσης ότι στο λειτουργικό σύστημα Linux το path των παραπάνω ​__μεταγλωττισμένων__ κλάσεων βρίσκεται στον παρακάτω κατάλογο
- +
-<WRAP center tip round 70%> +
-Όταν ορίζετε την μεταβλητή CLASSPATH μέσω της επιλογής (flag) **-classpath** ή **-cp** κάνετε **overwrite** την μεταβλητή περιβάλλοντος CLASSPATH που πιθανόν έχετε ορίσει προηγούμενα. +
-</​WRAP>​ +
- +
- +
-===== Παραδείγματα χρήσης CLASSPATH ===== +
- +
-Aς υποθέσουμε ότι θέλετε να μεταγλωττίσετε την κλάση ​''​MyTestClass.java'' ​η οποία απαιτεί ​την ​τις κλάσεις ​''​gr.uth.inf.ce325.homework2.Rectangle'' ​και ​''​gr.uth.inf.ce325.homework2.Cylinder''​, δηλαδή τις κλάσεις ​''​Rectangle'' ​και ​''​Cylinder'' ​που ανήκουν στο package ​''​gr.uth.inf.ce325.homework2''​. Ας υποθέσουμε επίσης ότι στο λειτουργικό σύστημα Linux το path των παραπάνω μεταγλωττισμένων κλάσεων βρίσκεται στον παρακάτω κατάλογο+
  
 <​code>​ <​code>​
-/home/username/CE325/my_projects/​homework2/​build/​classes/​gr/uth/inf/​ce325/​homework2/​Rectange.class +/path/to/dir/classpath_usage_ex1/​build/​classes/​my/library/Cone.class 
-/home/username/CE325/my_projects/​homework2/​build/​classes/​gr/​uth/​inf/​ce325/homework2/​Cylinder.class+/path/to/dir/classpath_usage_ex1/​build/​classes/​my/library/​Cylinder.class
 </​code>​ </​code>​
  
-Επίσης,​ το πακέτο ​''​gr.uth.inf.ce325.homework2'' ​μετά την μεταγλώττιση όλων των κλάσεων που ανήκουν σε αυτό συμπιέζεται σε ένα ​**.jar** ​αρχείο ​που βρίσκεται στον κατάλογο+Επίσης,​ το πακέτο ​**my.library** ​μετά την μεταγλώττιση όλων των κλάσεων που ανήκουν σε αυτό συμπιέζεται στο αρχείο **my-library.jar** που βρίσκεται στον κατάλογο
  
 <​code>​ <​code>​
-/home/username/CE325/my_projects/​homework2/build/jar/homework2.jar+/path/to/dir/classpath_usage_ex1/build/jar/my-library.jar
 </​code>​ </​code>​
  
 ==== Χρήση dir classpath ==== ==== Χρήση dir classpath ====
  
-Εάν θέλετε να ορίσετε στο CLASSPATH ένα κατάλογο (directory path) που περιέχει κλάσεις που απαιτούνται κατά την μεταγλώττιση ή εκτέλεση του προγράμματος σας τότε ορίζετε στο CLASSPATH το path αυτό. ​Για να μεταγλωττίσετε την κλάση του παραπάνω παραδείγματος αρκεί να γράψετε.+Για να μεταγλωττίσετε την κλάση του παραπάνω παραδείγματος αρκεί να γράψετε.
  
 <​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 73: 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 85: 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 99: 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 167: 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 ]]| 
  
  
java/classpath.1442637053.txt.gz · Last modified: 2016/02/26 11:15 (external edit)