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:45]
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>​
  
-οι οποίες ​είναι ​μεταγλωττισμένες ​μέσα στον κατάλογο **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/src/​my/​library/​Cone.class +/path/to/dir/classpath_usage_ex1/build/​classes/​my/​library/​Cone.class 
-/home/username/Java/libraries/src/​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 ====
  
-Εάν θέλετε να ορίσετε στο 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 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 ]]| 
  
  
java/classpath.1442637906.txt.gz · Last modified: 2016/02/26 11:15 (external edit)