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:56] gthanos [Χρήση jar 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/Java/libraries/build/ | + | 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/Java/libraries/build/jar/shapes3d.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 ]]| | ||