Java Hellenic User Group logo

Αρχική Σελίδα
Αγορά Συζήτησης
Κείμενα/Βοηθήματα

Valid CSS!

H Java στο Unix

Εισαγωγή 

Εγκαθιστώντας τη Java στο Unix/Linux είναι ευκολότερο από όσο ακούγεται. Το πρώτο βήμα που πρέπει να κάνουμε είναι εγκαταστήσουμε την Εικονική Μηχανή (JRE) για να μπορούμε να τρέχουμε τα προγράμματα και το πακέτο ανάπτυξης (J2SDK) για να μπορούμε να γράφουμε και να αποδελτιώσουμε (compile) τα προγράμματα μας. Πολλές διανομές του Linux έρχοντε με τη Java ήδη εγκαταστημένη οπότε μπορούμε να βεβαιωθούμε αν ήδη υπάρχει με το να δώσουμε την εντολή "which java" ή "whereis java". Αν ήδη υπάρχει τότε στην οθόνη μας θα εμφανιστεί η τοποθεσία της Java, αλλιώς ένα μήνυμα "no java in ..." ή "java: ".Αντίστοιχα για να βεβαιωθουμε οτι η εικονική μηχανή ειναι σωστα εγκατεστημένη και μπορούμε να την χρησιμοποιήσουμε αμέσως μπορουμε να πληκτρολογησουμε στην γραμμη εντολών (command prompt) την εντολή "java -version" η οποία θα μας δείξει την εκδοση της εγκατεστημένης  Java εικονικής μηχανης στο μηχανημα μας.. Αν δεν υπάρχει μπορούμε να πάμε στον δικτυακό τόπο της Sun και να κατεβάσουμε το πακέτο ανάπτυξης μαζί με την εικονική μηχανή. Αυτα μπορούν να βρεθούν εδώ . Καλό θα είναι να κατεβάσουμε και τα συνοδευτικά έγγραφα μιας και είναι αρκετά κατατοπιστικά για το τι κάνουνε όλες οι κλάσεις και πως να τις χρησιμοποιούμε.


Εγκατάσταση

Αφού κατεβάσουμε τα .bin αρχεία θα πρέπει να τα εκτελέσουμε. Εξ' ορισμού δεν μπορούμε να το κάνουμε αφού η άδεια εκτέλεσης δεν έχει δοθεί στο χρήστη. Για να αλλάξουμε την πρόσβαση στα αρχεία δίνουμε την εντολή "chmod 764 <όνομα αρχείου>" (στον υπολογιστή μου αυτό είναι: "chmod 764 j2sdk-1_4_0-linux-i386.bin" και "chmod 764 j2re-1_4_0-linux-i386.bin") ώστε να έχουμε πρόσβαση εκτέλεσης των αρχείων. Αφού δώσουμε την παραπάνω εντολή τότε μπορούμε να τα  εκτελέσουμε δίνοντας "./<όνομα αρχείου>" (στο περιβάλλον μου αυτό είναι: "./j2sdk-1_4_0-linux-i386.bin" και "./j2re-1_4_0-linux-i386.bin") και ακολουθούμε τις οδηγίες στην οθόνη. Όταν τελειώσουμε και με τα δύο αρχεία θα έχουμε εγκαταστήσει την Εικονική Μηχανή και το πακέτο ανάπτυξης. Προτού γράψουμε το πρώτο μας πρόγραμμα πρέπει να βεβαιωθούμε ότι μπορούμε να βρούμε τα "java" και "javac" προγράμματα από όπου και αν είμαστε. Για να το κάνουμε αυτό μπορούμε να θέσουμε το PATΗ ώστε να ψάχνει στον υποκατάλογο που έχουμε εγκαταστήσει το πακέτο ανάπτυξης (J2SDK) δίνοντας :

export PATH=$PATH:<path του J2SDK>/bin

Παραδείγματος χάρη στο δικό μου τον υπολογιστή αυτό είναι:

export PATH=$PATH:/home/girionis/java/j2sdk1.4.0/bin
ή
export PATH=$PATH:/home/girionis/java/j2re1.4.0/bin

και θα μπορούμε να τρέξουμε τη Java από όπου και αν είμαστε. Για να δούμε αν όλα πάνε καλά μπορούμε να ξαναδώσουμε την εντολή: "which java" ή "whereis java" και αυτή τη φορά πρέπει να δούμε την τοποθεσία της Java.Για να γράψουμε το πρώτο μας κείμενο τρέχουμε οποιονδήποτε κειμενογράφο μας βολεύει (προσωπική επιλογή αποτελεί ο emacs), ανοίγουμε ένα αρχείο με όνομα HelloWorldFromLinux.java ("emacs HelloWorldFromLinux.java") και γράφουμε ένα πολύ απλό πρόγραμμα:

public class HelloWorldFromLinux {
    public static void main(String [] arguments){
      System.out.println("Hello world from Linux.");
    }//end of main
}

Αφού σώσουμε το αρχείο (πατώντας διαδοχικώς Ctrl + x, Ctrl + s) δημιουργούμε το bytecode δίνοντας την εντολή: " javac HelloWorldFromLinux.java " και αν δε μας βγάλει μήνυμα λάθους το τρέχουμε με την εντολή: "java HelloWorldFromLinux". Αν όλα γίνανε κατά γράμμα τότε θα πρέπει να δούμε στην οθόνη το "Hello world from Linux." μήνυμα. Αν αντί για το παραπάνω μήνυμα δούμε το "Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorldFromLinux" μήνυμα σφάλματος τότε αυτό σημαίνει ότι η Εικονική Μηχανή δεν μπορεί να βρει το αρχείο HelloWorldFromLinux.class. Αυτό είναι κάτι που λύνεται πολύ εύκολα αν θέσουμε το CLASSPATH σωστά. Υπάρχουνε δύο τρόποι να το κάνουμε αυτό.

Ο πρώτος είναι να το θέσουμε μέσω των μεταβλητών του περιβάλλοντός μας (environment variables) και ο δεύτερος είναι να το θέτουμε κάθε φορά που τρέχουμε μία κλάση. Για να το θέσουμε μέσω των μεταβλητών περιβάλλοντος γράφουμε τα εξής: "export CLASSPATH=$CLASSPATH:<path to the class>". Στον υπολογιστή μου, έχοντας την κλάση "HelloWorldFromLinux.class" στον υποκατάλογο "/home/girionis/java" το CLASSPATH γίνεται: "export CLASSPATH=$CLASSPATH:/home/girionis/java". Για να δούμε αν έχει θετηθεί το CLASSPATH μπορούμε να γράφουμε την εντολή "echo $CLASSPATH". Τρέχουμε πάλι το πρόγραμμα με "java HelloWorldFromLinux" και λογικα πρέπει να δούμε το μήνυμα "Hello world from Linux" στην οθόνη μας.

Ο δεύτερος είναι να θέσουμε το CLASSPATH ενώ τρέχουμε το πρόγραμμα και χρησιμοποιώντας την -classpath επιλογή. Για παράδειγμα αν είμαστε στον υποκατάλογο /home/girionis και η κλάση "HelloWorldFromLinux" είναι στον "/home/girionis/java" τότε μπορούμε να την τρέξουμε δίνoντας

"java -classpath /home/girionis/java HelloWorldFromLinux"
                                                               
ή

"java -classpath java/ HelloWorldFromLinux".

Αν είμαστε μέσα στον "/home/girionis/java" τότε μπορούμε να γράψουμε την εντολή

"java -classpath . HelloWorldFromLinux".

Η τελεία μετά το "-classpath" σημαίνει τον τρέχων υποκατάλογο."


Επιδόσεις και εναλλακτικές προτάσεις

Σίγουρα για πολλούς το Linux και γενικά κάθε λειτουργικό βασισμένο στην οικογένεια λειτουργικών του Unix, αποτελούν την καλύτερη πλατφόρμα για ανάπτυξη εφαρμογών. Στα ιδιαίτερα χαρακτηριστικά των λειτουργικών συγκαταλέγεται η μεγάλη τους σταθερότητα και αξιοπιστία. Παραλληλα πολλά από αυτά είναι σχετικά ολιγαρκή όσο αναφορά την απορρόφηση πόρων από τον υπολογιστή μας.

Ο παραπάνω κανόνας όσο αναφορά την σταθερότητα και την αξιοπιστία δεν μπορεί να αποτελέσει εξαίρεση για την ανάπτυξη εφαρμογών σε Java. Παρόλα αυτά η σχετική εμπειρία και η τρέχουσα κατάσταση  μας επιφυλάσσουν μια μικρή δυσάρεστη έκπληξη. Είναι κοινά αποδεκτό ότι εφαρμογές Java που τρέχουν σε λειτουργικό όπως το Linux εμφανίζονται να έχουν μια  διάφορα σε επιδόσεις σε σχέση με την απόδοση που παρουσιάζουν στην πλατφόρμα των Windows.Η παρατήρηση αυτή μπορεί να γίνει ιδιαίτερα αισθητή όταν μιλάμε και παρατηρούμε ιδιαίτερα πολύπλοκα σύστημα.

Ο λόγος του προβλήματος οφείλεται στην σχετικά μη παράλληλη εξέλιξη της εικονικής μηχανής της Java στο Linux σε αντιπαράθεση με την αντίστοιχη εικονική μηχανή των Windows. Τελείως αναφορικά να πούμε ότι είναι εμφανές ότι η πιο γρήγορη εικονική μηχανή που εξελίσσει τάχιστα και δίνει προτεραιότητα η Sun είναι αυτή των Windows, στην συνεχεία η εικονική μηχανή του Solaris και μετά έρχοντε Unix και Linux.Με το πέρασμα του χρόνου γίνοντε προσπάθειες αυτές οι διαφορές να εξαλειφθούν. Για να μπορέσουν μερικοί προγραμματιστές να ξεπεράσουν αυτό το μικρό κόλλημα στην απόδοση έχουν στραφεί σε κάποιες άλλες λύσεις που τους προσφέρουν καλύτερες επιδόσεις σε σχέση με την standard εικονική μηχανή της Sun.

Μερικές από αυτές που μπορούμε να αναφέρουμε είναι η γνωστή στούς κύκλους των χρηστών Linux εικονική μηχανή με το όνομα BlackDown. Σύμφωνα με τους δημιουργούς της εναλλακτικής αυτής εικονικής Java μηχανής προσφέρει 10-30% καλύτερες επιδόσεις όταν εκτελεί Java bytecode σε σχέση με την αντίστοιχη της Sun.Πληροφορίες για την εναλλακτική εικονική μηχανή μπορείτε να βρείτε στο http://www.blackdown.org .

 Μια άλλη ακόμα πιο ενδιαφέρουσα λύση αποτελεί και ο γνωστός σε όλους μας GNU compiler (γνωστός ως gcc) ο οποίος αποτελεί βασικό συστατικό σε κάθε Unix-Linux λειτουργικού .O gcc στις τελευταίες του εκδόσεις 3.x.x περιέχει και μια έκδοση του που ονομάζεται Gnu Compiler for Java γνωστός και ως gcj. O gcj έχει την ιδιαιτερότητα και το προσόν να μπορεί να κάνει compile java κώδικα και στην συνεχεία να μας παράξει είτε τα κλασικά bytecode όπως θα έκανε ο γνωστός μας javac (Sun Java Compiler), είτε να περάξει κατευθείαν ιθαγενή Linux εκτελέσιμα αρχεία (Linux native executables). Για τους χρηστές να πούμε ότι μπορούν να φανταστούν ένα Linux εκτελέσιμο αρχείο ανάλογο με ένα εκτελέσιμο αρχείο των windows που έχει την κατάληξη  (.exe), μόνο που στο Linux έχει διαφορετική κατάληξη.

Και τί κερδίζουμε τελικά με το παραπάνω; Αυτό που κερδίζουμε είναι να προσπεράσουμε για χάρη των επιδόσεων την εικονική μηχανή της Java στο Linux και να αφήσουμε κατευθείαν την εκτέλεση του προγράμματος μας στο λειτουργικό Σε κανονική περίσταση όπως έχουμε εξηγήσει και παλιότερα την ο κώδικας μας θα μεταμορφωνόταν σε Java bytecode (μέσω του javac) και στην συνεχεία η εικονική μηχανή του εκάστοτε λειτουργικού θα αναλάμβανε να μεταφράσει τον bytecode μας σε κλήσεις στο αντίστοιχο λειτουργικό. Σύμφωνα με πολλούς οι επιδόσεις που προσφέρει ο gcj είναι κάτι παραπάνω από ενδιαφερουσες. Σε απλές υλοποιήσεις μπορεί να φτάσει ως και 50% αύξηση. Βέβαια  δεν είναι όλα ωραία έτσι ο gcj δεν μπορεί να κάνει compile διάφορες κλάσεις και χαρακτηριστικά που βρίσκονται σε σχετικά νέες εκδόσεις του JDΕ (όπως  το Swing). Πληροφορίες για τον gcc και την ειδική του έκδοση gcj μπορούν να βρεθούν εδώ http://www.gnu.org .

Επίλογος

Όπως και να έχει το μέλλον φαίνεται ιδιαίτερα λαμπρό και σίγουρα οι διάφορες αυτές εναλλακτικές απόψεις κερδίζουν όλο και περισσότερους θαμαστές και χρηστές, κάτι που υποδηλώνει και την ανοιχτή άποψη των χρηστών ενος ανοιχτού λειτουργικού όπως το Linux!

Κωνσταντινίδης Πάνος
Aποστολόπουλος Πάρις


Oreilly User Group Member Get Java Now!