1049 γραμμές
68 KiB
Markdown
1049 γραμμές
68 KiB
Markdown
|
+++
|
|||
|
title = 'Java και Linux'
|
|||
|
date = '1999-09-01T00:00:00Z'
|
|||
|
description = ''
|
|||
|
author = 'Δημήτρης Γλυνός(mailto:glynos@dial.pipex.com)'
|
|||
|
issue = ['Magaz 17']
|
|||
|
issue_weight = 5
|
|||
|
+++
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
*Καιρός να δούμε ένα είδος καφέ λιγάκι διαφορετικό από αυτόν που πίναμε ως τώρα\...την Java.*
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
**1. Java - Τι σόι καφές είναι αυτός; (History/Internals)**
|
|||
|
----------------------------------------------------------------------------------
|
|||
|
|
|||
|
- [1.1 Ιστορική Αναδρομή:](#ss1.1)
|
|||
|
- [1.2 Εσωτερική Δομή:](#ss1.2)
|
|||
|
|
|||
|
**2. Χμμμ, ενδιαφέρον άρωμα\... (Features/Applications)**
|
|||
|
--------------------------------------------------------------------------------
|
|||
|
|
|||
|
**3. Μα γιατί δε μοιάζει με αυτόν που ήπια χθες; (Minor Problems)**
|
|||
|
------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
**4. Ωραία\... και πώς τον σερβίρουμε στο Linux-άκι; (Linux Installation Notes)**
|
|||
|
--------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
**5. Διαβάζοντας το φλιτζάνι (Java in the (not..so..) working world)**
|
|||
|
---------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
**6. Κώδικας και άλλα**
|
|||
|
----------------------------------------------
|
|||
|
|
|||
|
|
|||
|
### [1. Java - Τι σόι καφές είναι αυτός; (History/Internals)]{#s1}
|
|||
|
|
|||
|
### [1.1 Ιστορική Αναδρομή:]{#ss1.1}
|
|||
|
|
|||
|
Το 1991 η Sun αναλαμβάνει να φτιάξει μία πλατφόρμα εφαρμογών (σε C++) ικανή για να τρέξει εφαρμογές σε μία μεγάλη γκάμα υπολογιστικών συστημάτων. Μέσα από το
|
|||
|
project αυτό, γεννήθηκε μία γλώσσα προγραμματισμού, ονόματι Oak.
|
|||
|
|
|||
|
Το 1994, βλέποντας την ταχύτητα με την οποία αναπτύσσεται το World Wide Web, η Sun προσθέτει ορισμένα Web-extensions στην Oak και την μετονομάζει σε Java.
|
|||
|
|
|||
|
Το 1995 οι Αlpha eκδόσεις της Java και της HotJava διανέμονται δωρεάν εκ του δικτύου για τις πλατφόρμες των Solaris και ΝΤ. Σύντομα γίνονται και τα ports σε
|
|||
|
Linux και Win95.
|
|||
|
|
|||
|
Στις αρχές του 1996 κυκλοφορεί η έκδοση 1.0. Τόσο το Netscape όσο και o Internet Explorer υποστηρίζουν Java, σε server και εσωτερική (browser) μορφή. Μετά από
|
|||
|
\_αρκετά\_ bug και security fixes, η εταιρεία ανεβάζει στο Web την Βeta έκδοση της σειράς 1.1. Διαθέτει εκτός των άλλων: RMI (κλήση συναρτήσεων εξ αποστάσεως),
|
|||
|
functions για ανταλλαγή πληροφοριών με βάσεις δεδομένων, μοντέλα για κρυπτογραφικές ρουτίνες και πολλά άλλα\...
|
|||
|
|
|||
|
Η πρώτη επίσημη έκδοση της σειράς 1.1 βγαίνει το Μάρτιο του ΄97. Αυτή τη στιγμή η τελευταία σταθερή έκδοση για Linux είναι η 1.1.7v3 αν και υπάρχει έκδοση της
|
|||
|
σειράς 1.2 (JDK 1.2 pre-v1).
|
|||
|
|
|||
|
Το παρακάτω [link](http://java.sun.com/products/jdk/1.2/docs/relnotes/features.html) δίνει περισσότερες πληροφορίες για τις διαφορές από release σε release. Θα
|
|||
|
φανεί ιδιαίτερα χρήσιμο στο προγραμματιστικό κοινό, καθώς οι αλλαγές που έχουν επέλθει από την έκδοση 1.1 στην 1.2 είναι αρκετές και θεμελιώδεις.
|
|||
|
|
|||
|
### [1.2 Εσωτερική Δομή:]{#ss1.2}
|
|||
|
|
|||
|
Η Java ανήκει στην κατηγορία των interpreted γλωσσών. Όταν θα τρέξουμε το πρόγραμμά μας, ο υπολογιστής δεν θα διαβάσει κατ΄ευθείαν ένα binary executable, αλλά
|
|||
|
μια σειρά εντολών, που με τη σειρά της θα γίνει compiled την ώρα της εκτέλεσης. Εμπειρικά μπορούμε να πούμε, ότι αυτό θα κάνει το πρόγραμμά μας, 10-20 φορές πιο
|
|||
|
αργό απ΄το αντίστοιχο πρόγραμμα,γραμμένο σε C.
|
|||
|
|
|||
|
Η Java χρησιμοποιεί μία εικονική μηχανή, ένα Virtual Machine, το οποίο αναλαμβάνει να πάρει τον κώδικα σε μια semi-compiled μορφή (ονομαζόμενη [byte
|
|||
|
code](05_java-6.html#part1a)) και κατά την εκτέλεση, να τον μετατρέψει σε machine-dependent κώδικα. Εκτός, όμως, από αυτή τη λειτουργία, το Java Virtual Machine
|
|||
|
θα μπορούσε να χαρακτηριστεί και ως \"κουτί ασφαλείας\". Ελέγχει και προστατεύει το πρόγραμμα από τυχόν \"παράνομες\" κλήσεις, προσπαθώντας να αποτρέψει ένα
|
|||
|
γενικότερο **κακό** (π.χ. το πρόγραμμα να απο φασίσει ξαφνικά να φάει όλα τα memory resources του λειτουργικού μας) ή τουλάχιστον να δώσει όσο περισσότερες
|
|||
|
debugging πληροφοριές γίνεται περί του \"τι έγινε\" πριν το κακό :)
|
|||
|
|
|||
|
Εφόσον είναι στην ευθύνη του JVM να φτιάξει τον κατάλληλο κώδικα για την πλατφόρμα μας\... αυτό μας επιτρέπει να κυκλοφορούμε από μηχάνημα σε μηχάνημα με τον
|
|||
|
ίδιο :) Java semi-compiled κώδικα. Με άλλα λόγια, παίρνουμε τον πηγαίο κώδικά μας, τον κάνουμε compile με κάποιο εργαλείο (όπως το javac) που φτιάχνει
|
|||
|
\"byte-code\" κώδικα, και το νέο αρχείο με κατάληξη \".class\" μπορούμε να το τρέξουμε κάτω από οποιοδήποτε JVM είτε αυτό βρίσκεται σε PC, είτε σε SUN-ακι είτε
|
|||
|
σε κάποια άλλη supported πλατφόρμα\...
|
|||
|
|
|||
|
Το παρακάτω σχήμα δείχνει πώς, κατά την εκτέλεση του προγράμματος, η εφαρμογή βρίσκεται \"πάνω\" σε έναν JVM, αυτός με τη σειρά του επικοινωνεί με το
|
|||
|
λειτουργικό σύστημα που με τη σειρά του επικοινωνεί με το hardware.
|
|||
|
|
|||
|
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
|
|||
|
\ Εφαρμογή
|
|||
|
|
|||
|
Java Virtual Machine
|
|||
|
|
|||
|
Λειτουργικό Σύστημα
|
|||
|
|
|||
|
Hardware
|
|||
|
|
|||
|
|
|||
|
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
|
|||
|
|
|||
|
|
|||
|
### [2. Χμμμ, ενδιαφέρον άρωμα\... (Features/Applications)]{#s2}
|
|||
|
|
|||
|
H Java αποτελεί μία object oriented γλώσσα. Η πλειοψηφία των έτοιμων functions αποτελούν μέρος των αρμόδιων classes και έτσι ο νέος χρήστης συναντά από νωρίς
|
|||
|
όρους, όπως το object και την τεχνική του inheritance.
|
|||
|
|
|||
|
Η γλώσσα επιτρέπει σε μια δικιά μας class, να αποτελεί γόνο περισσότερων από μιας αρχέτυπων classes.Αυτό όμως δεν σημαίνει ότι η νέα class θα περιέχει τον
|
|||
|
κώδικα τών αρχέτυπων. Απλά, εξασφαλίζει με αυτόν τον τρόπο ότι στη νέα class θα υπάρχουν όλες οι functions που υπήρχαν στις πατρικές ΟΝΟΜΑΣΤΙΚΑ. Έτσι, θα
|
|||
|
είμαστε σίγουροι ότι μία class που κατάγεται από την Class Skylo και Class Gata, και θα νιαουρίζει και θα γαβγίζει (έχοντας γράψει και τον κατάλληλο κώδικα
|
|||
|
φυσικά). Classes σαν τον σκύλο και τη γάτα, που λειτουργούν ως αρχέτυπα και εξασφαλίζουν ότι ένας συγκεκριμένος αριθμός από functions θα υπάρχουν σε κάθε class
|
|||
|
που κατάγεται από αυτές, ονομάζονται interfaces και δεν περιεχουν implementation παρά μόνο function headers. Συνεπώς, σε μία function που περιμένει ως παράμετρο
|
|||
|
ένα interface, μπορούμε να περάσουμε κάθε class που κάνει implement αυτό τo [interface](05_java-6.html#part2a)
|
|||
|
|
|||
|
H Java αποτελεί μία εν γένει threaded γλώσσα. Βασικές της λειτουργίες όπως το αυτόματο garbage collection, o Audio Player, η διαχειριση των events σε γραφικό
|
|||
|
περιβάλλον αλλά και η ίδια η function main(), αναλαμβάνονται από ξεχωριστά threads κατά την εκτέλεση του προγράμματος. Τα threads αυτά τρέχουν παράλληλα και ο
|
|||
|
διαμερισμός του χρόνου για κάθε διεργάσια ίδιου priority προσδιορίζεται από το λειτουργικό σύστημα.
|
|||
|
|
|||
|
Προσοχή θα πρέπει να δοθεί στο γεγονός ότι η Java διαβάζει και γράφει σε unicode και όχι σε ASCII.
|
|||
|
|
|||
|
Aς δούμε όμως μερικά σημεία της γλώσσας που την κάνουν ιδιαίτερα επιθυμητή στο σημερινό προγραμματιστικό κοινό.
|
|||
|
|
|||
|
Λόγω threading είναι ιδανική για τη συγγραφή προγραμμάτων σχετικά με δικτυακές εφαρμογές. Π.χ. σε ένα server application το πρόγραμμα μπορεί να χρησιμοποιήσει
|
|||
|
ένα thread για να ακούει σε μια port και κάθε φορά που δέχεται ένα incomming connection, να ξεκινά ένα καινούριο [thread](05_java-6.html#part2b) για να
|
|||
|
αναλαμβάνει τις υπηρεσιές του connection αυτού. Έτσι δεν χρειάζεται να παίζουμε με fork() και if-then-else structures ώστε να χωρίζουμε τον κώδικα μεταξύ του
|
|||
|
αρχικού server και των forked παιδιών του (ό πως γίνεται στη C).
|
|||
|
|
|||
|
Eκτός αυτού, το threading μάς επιτρέπει να δώσουμε σε βαριά προγράμματα μια νέα αρχιτεκτονική, όπου κάποιες διεργασίες θα εκτελούνται παράλληλα, επιτρέποντας
|
|||
|
καλύτερη αξιοποίηση της υπολογιστικής δύναμης ενός multi-processor συστήματος.
|
|||
|
|
|||
|
Όσον αφορά το σχεδιασμό προγραμμάτων με GUI, εκτός από την πληθώρα των classes υπεύθυνες για τέτοιες διεργασίες, δίνεται στο χρήστη η δυνατότητα να επιλέξει το
|
|||
|
είδος των widgets που θα βγάλει στη φόρμα του. Για παράδειγμα μπορεί είτε να χρησιμοποιήσει τα default widgets του ήδη υπάρχοντος window manager είτε (για
|
|||
|
περισσότερη ταχύτητα) τα predefined widgets του swing, που έχουν σχεδιαστεί σε java και είναι όμοια για όλες τις πλατφόρμες.
|
|||
|
|
|||
|
Η εξοικείωση με το συντακτικό της γλώσσας δεν αργεί πολύ καθώς είναι παραπλήσιο με αυτό της C. H Java κρύβει από το χρήστη τα pointer semantics και έτσι το
|
|||
|
παιχνίδι με τα objects/classes γίνεται πολύ ευκολότερο απ΄ότι στη C++.
|
|||
|
|
|||
|
Έστω ότι μία function χρειάζεται ως παράμετρο την instance μιας class που δεν πρόκειται να ξαναχρησιμοποιήσουμε στο υπόλοιπο πρόγραμμα. Η Java μάς επιτρέπει να
|
|||
|
φτιάξουμε επί τόπου μια \"anonymous inner class\" και να κάνουμε τη δουλειά μας χωρίς άλλα declarations. Ή για παράδειγμα, αν χρειαστούμε, για ένα μικρό κομμάτι
|
|||
|
κώδικα, να κάνουμε override μια method μιας ήδη υπάρχουσας class\... :) η \"anonymous inner class\" θα μας λύσει τα [χέρια](05_java-6.html#part2c).
|
|||
|
|
|||
|
Η ελαστικότητα που προσφέρεται με τα threads παρατηρείται και στο event handling. Οι λεγόμενοι adapters και event listeners μάς δίνουν τη δυνατότητα να κάνουμε
|
|||
|
register ένα event μιας class σε περισσότερους από έναν listeners. Με αυτό τον τρόπο μπόρουμε να έχουμε ένα button στη φόρμα μας που αλλάζει times σε διάφορα
|
|||
|
objects χωρίς να χρειάζεται explicit reference στις συγκεκριμένες instances και methods των objects αυτών (που θα αναλάβουν το event).
|
|||
|
|
|||
|
Oι βιβλιοθήκες από functions είναι οργανωμένες σε μορφή πακέτων (packages). Αυτές που αρχίζουν από java (ή sun) είναι οι default που δίνονται με το jdk από τη
|
|||
|
Sun. Γράφοντας import java.awt.\* δίνουμε στο πρόγραμμα μας πρόσβαση σε όλες τις classes του πακέτου AWT (υπεύθυνο για ρουτίνες σε γραφικό περιβάλλον). Τα
|
|||
|
αρχεία .jar αποτελούν τον ενδεδειγμένο τρόπο συμπίεσης πακέτων. Όποτε ο java interpreter χρειαστεί μια class απο ενα τέτοιο πακέτο, θα το αποσυμπιέσει αυτόματα.
|
|||
|
Τα περιβόητα Java Beans δεν αποτελούν τ ίποτα παραπάνω από συμπιεσμένα packages, που χρησιμοποιούνται ως components, σε εργαλεία visual προγραμματισμού όπως ο
|
|||
|
Java Builder.
|
|||
|
|
|||
|
Εκτός από την απλή σχεδίαση γραφικών, μπορεί κανείς να βρει packages υπεύθυνα για επεξεργασία αντικειμένων σε 3d, classes για φιλτράρισμα ήχου, προβολή και
|
|||
|
επεξεργασία video, methods που απλουστεύουν τη χρήση των sockets στα networking apps, message encryption και signing (με επιλογή στους αλγόριθμους που θα
|
|||
|
χρησιμοποιηθούν) και πολλά πολλά άλλα.
|
|||
|
|
|||
|
Δεδομένου ότι η Sun ήταν η μαμά του RPC (remote procedure call), δεν θα μπορούσαν να αφήσουν απ΄έξω την RMI (remote method invocation) τεχνολογία. Σύμφωνα με το
|
|||
|
RMI, ένα object που τρέχει σε μια Virtual Machine μπορεί να καλέσει (μέσω δικτύου) μια method ενός object που υπάρχει σε μια άλλη virtual machine. Για να γίνουν
|
|||
|
τα πράγματα πιο λιανά, φανταστείτε ότι έχετε κάνει semi-compile ένα πρόγραμμα και το έχετε εγκαταστήσει σε ένα μηχάνημα ενός δικτύου. Χρησιμοποιώντας λιγοστά
|
|||
|
αρχεία (που περιέχουν πληροφορίες για το πώς θα καλέσουν τις methods στο server μηχάνημα) θα μπορούσατε να κάνετε όλα τα μηχανήματα στο LAN auto
|
|||
|
[clients](05_java-6.html#part2d) αυτού του προγράμματος (χωρίς φυσικά να αντιγράψετε ολόκληρο το software σας στο δίσκο κάθε μηχανήματος).
|
|||
|
|
|||
|
Τα Java Applets αποτελούν εκτελέσιμα αρχεία της java, κατασκευασμένα για να τρέξουν από τον web-browser κάθε χρήστη που θα τα κατεβάσει από το net. Στην ουσία
|
|||
|
καλούνται από τα {APPLET CODE=\"koko.class\"} tags της σελίδας που παρακολουθεί ο χρήστης. O web-browser πρίν τα τρέξει στη μικρή του jvm, θα τα ερευνήσει για
|
|||
|
οποιεσδήποτε παράνομες κλήσεις (π.χ. διάβασμα από τον τοπικό σκληρό δίσκο κλπ. κλπ.).
|
|||
|
|
|||
|
|
|||
|
### [3. Μα γιατί δε μοιάζει με αυτόν που ήπια χθες; (Minor Problems)]{#s3}
|
|||
|
|
|||
|
Όσοι από μας προγραμματίζουν με :) άκρως ντετερμινιστική λογική, θα πρέπει να είναι αρκετά προσεχτικοί με την Java. Όπως προαναφέραμε, πρόκειται για μια εν
|
|||
|
γένει Threaded γλώσσα, που αφήνει το priority scheme να το ελέγξει το λειτουργικό σύστημα.
|
|||
|
|
|||
|
Συνεπώς:
|
|||
|
|
|||
|
- Εάν τρέξουμε ένα πρόγραμμα 10 φορές, και του δώσουμε το ίδιο input και τις 10 φορές, αυτό ΔΕΝ ΣΗΜΑΙΝΕΙ ότι το πρόγραμμα θα τρέξει με τον ίδιο τρόπο και τις
|
|||
|
10 φορές. :-)
|
|||
|
- Έστω ότι παίρνουμε το όμορφο προγραμματάκι μας (koko.java) που είναι γεμάτο με threads (και γραμμένο φυσικά κάτω από linux) και το πάμε στου φίλου μας του
|
|||
|
Μάκη, που τρέχει winblowz98. Παρατηρούμε όμως ότι χρειάζεται να περάσουν 3-4 δευτερόλεπτα από τότε που πάτησε το κουμπάκι μέχρι να ανανεωθεί η όλη φόρμα\...
|
|||
|
και γεμάτοι απορία αναρωτιόμαστε τι δεν πήγε καλά\... Μια πιθανή απάντηση είναι το διαφορετικό priority scheme που έχουν τα winblowz από το linux-ακι
|
|||
|
(round-robin time-slicing isn\'t always working at its best).
|
|||
|
|
|||
|
Προκειμένου να αποφύγουμε προβλήματα που προκύπτουν από την ντετερμινιστική μας λογική :) θα ήταν προτιμότερο να προγραμματίζουμε με ένα event-driven μοντελό
|
|||
|
στο μυαλό (παρά με τον κλασικό σειριακό τρόπο : μετά από αυτό - θα κάνω αυτό). Τα threads γίνονται πολύ φιλικότερα όταν χρησιμοποιούνται σωστά :)
|
|||
|
|
|||
|
Ο Java Virtual Machine κάνει μια σειρά από checks πριν τρέξει το semi-compiled κώδικα. Αυτά τα checks αφορούν τον τρόπο με τον οποίο φορτώνονται οι classes και
|
|||
|
τα operations που εμπεριέχονται στις methods τους. Ακόμα και για πολύ απλά προγραμματάκια αυτή η διαδικασία είναι πολλές φορές επίπονη. Γι΄αυτό θα συνιστούσα σε
|
|||
|
όποιον σκέφτεται να ασχοληθεί κατά κόρον με τον προγραμματισμό στην java, να χρησιμοποιήσει είτε compiler που βγάζει native executable είτε να ψάξει για
|
|||
|
μηχάνημα άνω των 200mhz.
|
|||
|
|
|||
|
|
|||
|
### [4. Ωραία\... και πώς τον σερβίρουμε στο Linux-άκι; (Linux Installation Notes)]{#s4}
|
|||
|
|
|||
|
To www.blackdown.org είναι υπεύθυνο για τα ports της java σε linux. Αναλόγως με το αν έχουμε libc h\' glibc κατεβάζουμε την ανάλογη έκδοση του jdk (java
|
|||
|
development kit) και το βάζουμε στο αγαπημένο μας directory (συνήθως /usr/lib). Εκεί τραβάμε ένα
|
|||
|
|
|||
|
beast:/usr/lib # tar vxzf jdk_1.1.7-v1a-glibc-x86.tar.gz
|
|||
|
|
|||
|
και είμαστε έτοιμοι :)
|
|||
|
|
|||
|
Εδώ λοιπόν βλέπουμε την δενδρική δομή αυτού του directory:
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
-r--r--r-- 1 505 505 101235 Nov 5 1998 CHANGES
|
|||
|
-r--r--r-- 1 505 505 937 Nov 5 1998 COPYRIGHT
|
|||
|
-r--r--r-- 1 505 505 5994 Nov 5 1998 LICENSE
|
|||
|
-r--r--r-- 1 505 505 53189 Nov 5 1998 README
|
|||
|
-rw-r--r-- 1 505 505 12631 Nov 5 1998 README.linux
|
|||
|
-rw-r--r-- 1 505 505 7547 Nov 5 1998 README.linux.src
|
|||
|
drwxr-xr-x 3 505 505 1024 Nov 5 1998 bin
|
|||
|
drwxr-sr-x 4 505 505 1024 Nov 5 1998 include
|
|||
|
-r--r--r-- 1 505 505 2500 Nov 5 1998 index.html
|
|||
|
drwxr-xr-x 4 505 505 1024 Nov 5 1998 lib
|
|||
|
-rw-r--r-- 1 505 505 1675875 Nov 5 1998 src.zip
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
To αρχειάκι src.zip περιέχει τα sources της java (σε περίπτωση που δεν θέλουμε να χρησιμοποιήσουμε τις ήδη υπάρχουσες compilαρισμένες εκδόσεις) και στο
|
|||
|
README.linux.src περιέχονται οδηγίες για το compilation process.
|
|||
|
|
|||
|
Στο lib βρίσκονται όλα τα απαιτούμενα .so αρχεία μαζί με ένα σημαντικότατο αρχειάκι ονόματι classes.zip που περιέχει όλες τις classes (semi-compiled morfi
|
|||
|
.class) που έρχονται με το jdk. ΟΧΙ, ΔΕΝ ΧΡΕΙΑΖΕΤΑΙ ΝΑ ΤΟ ΑΠΟΣΥΜΠΙΕΣΕΤΕ! :)
|
|||
|
|
|||
|
Στις παλαιότερες εκδόσεις του jdk, o compiler της java απαιτούσε την ύπαρξη μιας shell variable, ονόματι \$CLASSPATH, που έδειχνε σε αυτό το αρχείο
|
|||
|
(classes.zip) αλλά και σε οποιαδήποτε άλλα directories, τα οποία περιείχαν \".class\" αρχεία που θα χρησίμευαν στο πρόγραμμά σας. Σύμφωνα με το documentation
|
|||
|
του jdk1.1.7 αυτή η variable δεν χρησιμοποιείται πια. Για καλό και για κακό όμως (και για όσους από εσάς έχουν τσιμπήσει παλιότερο jdk) καλό θα ήταν στο
|
|||
|
/etc/profile να βάλετε:
|
|||
|
|
|||
|
export CLASSPATH=.:/usr/lib/java117_v1a/lib/classes.zip:~/java
|
|||
|
|
|||
|
Όσοι από σας χρησιμοποιούν tsch :) ας παίξουν με την setenv.
|
|||
|
|
|||
|
Έτσι έχουμε στο CLASSPATH το παρόν directory εργασίας, το directory που περιέχει το classes.zip και ένα directory κάτω από το home μας με όνομα java.
|
|||
|
|
|||
|
To directory bin περιέχει τα binaries του JDK. Εφόσον δεν είμαστε αρκετά τρελοί για να τα καλούμε με τα full path names, θα ήταν καλό να βάλουμε το directory
|
|||
|
αυτό στο PATH μας (/usr/lib/java117\_v1a/bin). Έτσι θα έχουμε πρόσβαση από παντού στα παρακάτω εργαλεία:
|
|||
|
|
|||
|
- javac ( Java Compiler )\
|
|||
|
:) Ο compiler μας\...παίρνει αρχεία με κώδικα σε java (.java) και τα μεταφράζει σε bytecode.
|
|||
|
- java ( Java Interpreter )\
|
|||
|
O κύριος που αναλαμβάνει να ανεβάσει το προγραμματάκι μας πάνω στην virtual machine. Με άλλα λόγια, :) τρέχει τα προγράμματά μας.
|
|||
|
- java\_g ( java tracer )\
|
|||
|
Δίνει πληροφορίες για το τί γίνεται στην Virtual Machine, κατά την εκτέλεση του προγράμματος.
|
|||
|
- jre ( Java Runtime Interpreter )\
|
|||
|
Είναι μια ελαφριά έκδοση του παραπάνω. Χρησιμοποιείται κυρίως από τους κυρίους που \*απλώς θέλουν να τρέξουν το πρόγραμμα\*.
|
|||
|
- appletviewer ( Java AppletViewer )\
|
|||
|
Ένα όμορφο εργαλείο για να τεστάρετε locally τα applets σας.
|
|||
|
- jdb ( Java Debugger )\
|
|||
|
Ψάχνει για ζωύφια στα προγράμματά σας :)
|
|||
|
- javap ( Class File Disassembler )\
|
|||
|
Aυτό το όμορφο προγραμματάκι εκτός από το ότι τραβάει τα declarations από ένα .class αρχείο (ναι, ναι, compilαρισμένο αρχείο) σας μεταφράζει και τα
|
|||
|
byte-code περιεχόμενα αυτού του αρχείου (δηλ. τις εντολές που θα δωθούν στην virtual machine).
|
|||
|
- javadoc ( Java Documentation Generator )\
|
|||
|
Τελικά είναι της μόδας αυτές τις μέρες, κάθε γλώσσα προγραμματισμού να έχει και από ένα προγραμματάκι που διαβάζει τον κώδικα και από ειδικά comments, να
|
|||
|
παράγει μια HTML σελίδα με το documentation του προγράμματος.
|
|||
|
- javah ( C Header and Stub File Generator )\
|
|||
|
To προγραμματάκι αυτό θα βοηθήσει όσους θέλουν να βάλουν εξωτερικές functions (της C) μέσα στον java κώδικά τους (για περισσότερες πληροφορίες κοιτάξτε στο
|
|||
|
API documentation).
|
|||
|
- jar ( Java Archive Tool )\
|
|||
|
Μεταξύ άλλων, μαζεύει τα .class αρχεία και τα συμπιέζει σε ένα αρχείο. Φτιάχνει κάτι σαν μία συμπιεσμένη βιβλιοθήκη από classes :)
|
|||
|
- javakey ( Digital Signing Tool )\
|
|||
|
Θα χρησιμοποιηθεί από προγράμματα που χρειάζονται πιστοποίηση για την αυθεντικότητα ορισμένων κομματιών κώδικα.
|
|||
|
- native2ascii ( Native-To-ASCII )\
|
|||
|
Mετατροπή από native encoding (unicode) σε ascii με τη χρήση του \\udddd escape convention.
|
|||
|
- rmic ( Java RMI Stub Converter )\
|
|||
|
Χρησιμοποιείται στο RMI και φτιάχνει τα stubs που θα χρησιμοποιήσουν τα τερματικά σας :) προκειμένου να τρέξουν το πρόγραμμα του server.
|
|||
|
- rmiregistry ( Java Remote Object Registry )\
|
|||
|
Χρησιμοποιείται στο RMI και συνθέτει ένα registry για τα objects που θα διαθέσει o server, στους clients.
|
|||
|
- serialver ( Serial Version Command )\
|
|||
|
Επιστρέφει την έκδοση μιας class.
|
|||
|
|
|||
|
Aς δούμε όμως ένα απλό παράδειγμα από compilation. Κατ΄αρχήν ορίζουμε το όνομα του πακέτου που θα γράψουμε και φτιάχνουμε ένα directory με το όνομα του κάτω από
|
|||
|
το CLASSPATH:
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
glynos@beast:~/java > pwd
|
|||
|
/home/glynos/java
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
Έστω ότι το πακέτο μας λέγεται \"koko\". Φτιάχνουμαι το άναλογο directory:
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
glynos@beast:~/java > mkdir koko
|
|||
|
glynos@beast:~/java > cd koko
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
(Αν το πακέτο μας ονομαζόταν \"kati.akoma.pio.megalo\" θα έπρεπε να φτιάξουμε τα directories \"kati/akoma/pio/megalo\")
|
|||
|
|
|||
|
Αποφασίζουμε την κύρια class του προγράμματος να την ονομάσουμε \"trella\". Συνεπώς φτιάχνουμε ένα αρχειάκι με όνομα \"trella.java\" και τυπώνουμε μέσα τα
|
|||
|
παρακάτω:
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
package koko;
|
|||
|
|
|||
|
class trella {
|
|||
|
public static void main(String argv[]){
|
|||
|
System.out.println("geia sou kosmakh!");
|
|||
|
};
|
|||
|
};
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
Αφού σώσουμε το αρχειάκι, του τραβάμε και ένα compile :)
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
glynos@beast:~/java/koko > javac trella.java
|
|||
|
glynos@beast:~/java/koko > ls -l
|
|||
|
-rw-r--r-- 1 glynos users 474 Sep 5 12:17 trella.class
|
|||
|
-rw-r--r-- 1 glynos users 142 Sep 5 12:03 trella.java
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
Όπως βλέπουμε δημιουργήθηκε το \"trella.class\" που περιέχει σε byte-code τον κώδικα που θα τρέξει η virtual machine (συγκρίνετε το μέγεθος του αρχείου με το
|
|||
|
μέγεθος του αντίστοιχου εκτελέσιμου της C).
|
|||
|
|
|||
|
Τώρα έχοντας ορίσει σωστά το όνομα του πακέτου, του directory και του CLASSPATH, μπορούμε από οποιοδήποτε σημείο του δίσκου μας, να καλέσουμε το πρόγραμμα (το
|
|||
|
syntax είναι java {package\_name}.{main\_class\_name}).
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
glynos@beast:/ > java koko.trella
|
|||
|
geia sou kosmakh!
|
|||
|
glynos@beast:/ >
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
Ψάχνοντας στο net, μπορεί κανείς να βρει πολλά βοηθητικά tools για προγραμματισμό σε Java κάτω από Linux. Από web-browsers για να τεστάρετε τα applets σας
|
|||
|
(netscape, hot-java) μέχρι IDE, visual programming interfaces αλλά και decompilers (όπως ο jad που παίρνει τα .class files και τα μεταφράζει σε source code).
|
|||
|
Εδώ θα βρείτε μία μικρή [λίστα](05_java-6.html#part4a).
|
|||
|
|
|||
|
Επίσης, κυκλοφορούν αρκετοί JVMs και από τρίτες εταιρείες (όχι μόνο από την Sun) με πιο γνωστό τον [kaffe](http://www.transvirtual.com).
|
|||
|
|
|||
|
Σε περίπτωση που είστε λάτρης του CLI και δεν βρίσκετε κανένα λόγο για να χρησιμοποιήσετε κάποιο εργαλείο για Visual Programming, θα σας πρότεινα να σηκώσετε
|
|||
|
στο περιβάλλον των X, 2-3 rxvt\'s (για το γράψιμο debugging και testing του κώδικα) και ασφαλώς ένα web-browser για να διαβάζετε το API documentation του jdk.
|
|||
|
Για όσους από εσάς ξεκινούν τώρα με την Java, υπάρχει και ένα online tutorial στο <http://www.java.sun.com>
|
|||
|
|
|||
|
|
|||
|
### [5. Διαβάζοντας το φλιτζάνι (Java in the (not..so..) working world)]{#s5}
|
|||
|
|
|||
|
Μέχρι στιγμής η Java προωθείται με σωστό τρόπο από τη Sun. Υποστηρίζεται από developers/πανεπιστήμια σε ολόκληρο τον κόσμο και όλα δείχνουν ότι μάλλον μέσα στα
|
|||
|
επόμενα χρόνια θα γίνει το προγραμματιστικό standard στο χώρο του connectionist computing.
|
|||
|
|
|||
|
Η \"προστασία\" από τις έννοιες των pointers, το εύκολο συντακτικό και οι έτοιμες ρουτίνες για γραφικά, επεξεργασία δεδομένων και δικτυακές εφαρμογές, καθιστούν
|
|||
|
την Java ένα πανίσχυρο εργαλείο για το άτομο που ξεκινά σιγά σιγά τον προγραμματισμό στο Linux.
|
|||
|
|
|||
|
Aλλά και οι πιο προχωρημένοι του είδους δεν θα μείνουν δυσαρεστημένοι. Οι pluggable αλγόριθμοι, η trusted host αρχιτεκτονική και το platform independent στυλ
|
|||
|
της Java θα τους λύσουν πολλές φορές τα χέρια, καθώς δίνουν τη δυνατότητα να γράψει κανείς εύκολα και γρήγορα customisable software, για χρήση σε μεγάλες
|
|||
|
(δικτυακές και μη) εφαρμογές.
|
|||
|
|
|||
|
Δύο απ\'τα καλύτερα βιβλία που κυκλοφορούν στο εμπόριο, είναι:
|
|||
|
|
|||
|
1. \"Java. How to program\", των Deitel & Deitel (Prentice-Hall, 2nd Ed.,1997) και
|
|||
|
2. \"Java 1.1 Developer\'s Guide 2nd Edition\", tou Jaworski
|
|||
|
|
|||
|
Για περισσότερες πληροφορίες ρίξτε μια ματιά στα:\
|
|||
|
<http://www.java.sun.com>\
|
|||
|
<http://www.blackdown.org>\
|
|||
|
<http://www.datarepresentation.com>
|
|||
|
|
|||
|
Special thanx to George Glynos & Pete \"whatevah\" Blindell.
|
|||
|
|
|||
|
|
|||
|
### [6. Κώδικας και άλλα]{#s6}
|
|||
|
|
|||
|
[]{#part1a} Το Java Virtual Machine εκτελεί byte-code instructions. Για να δούμε πώς περίπου μοιάζουν αυτές ορίστε ένα παράδειγμα.
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
package koko;
|
|||
|
|
|||
|
class javap_example {
|
|||
|
|
|||
|
public static void main(String argv[]){
|
|||
|
int x=1;
|
|||
|
x = 4 + magiko(x);
|
|||
|
System.out.println(x);
|
|||
|
};
|
|||
|
|
|||
|
public static int magiko(int n){
|
|||
|
return n+1;
|
|||
|
};
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
Περνώντας το παραπάνω πρόγραμμα απο τον Java disassembler (javap -c) παιρνουμε τα παρακατω:
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
Compiled from 1.java
|
|||
|
synchronized class koko.javap_example extends java.lang.Object
|
|||
|
/* ACC_SUPER bit set */
|
|||
|
{
|
|||
|
public static void main(java.lang.String[]);
|
|||
|
public static int magiko(int);
|
|||
|
koko.javap_example();
|
|||
|
}
|
|||
|
|
|||
|
Method void main(java.lang.String[])
|
|||
|
0 iconst_1 # Κάθε γραμμή περιλαμβάνει και απο μια instruction
|
|||
|
1 istore_1
|
|||
|
2 iconst_4
|
|||
|
3 iload_1
|
|||
|
4 invokestatic #6 <Method int magiko(int)>
|
|||
|
7 iadd
|
|||
|
8 istore_1
|
|||
|
9 getstatic #7 <Field java.io.PrintStream out>
|
|||
|
12 iload_1
|
|||
|
13 invokevirtual #8 <Method void println(int)>
|
|||
|
16 return
|
|||
|
|
|||
|
Method int magiko(int)
|
|||
|
0 iload_0
|
|||
|
1 iconst_1
|
|||
|
2 iadd
|
|||
|
3 ireturn
|
|||
|
|
|||
|
Method koko.javap_example()
|
|||
|
0 aload_0
|
|||
|
1 invokespecial #5 <Method java.lang.Object()>
|
|||
|
4 return
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
Για περισσότερες πληροφορίες για την αρχιτεκτονική των Virtual Machines και τον ρόλο κάθε μιας απο τις instructions κοιτάξτε το Java Virtual Machine (των Meyer
|
|||
|
& Downing).
|
|||
|
|
|||
|
[]{#part2a} Προσέξτε πώς η class MyFrame κάνει implement τα interfaces ActionListener kai WindowListener. Σε όσες functions των interfaces δεν θέλouμε να
|
|||
|
γράψουμε κώδικα (π.χ. windowClosed) τις αφήνουμε κενές.
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
import java.awt.*;
|
|||
|
import java.awt.event.*;
|
|||
|
|
|||
|
class MyFrame extends Frame implements ActionListener,WindowListener
|
|||
|
{
|
|||
|
Button bOK,bCan;
|
|||
|
public MyFrame(){super("MyFrame"); setup(); setVisible(true);}
|
|||
|
public void setup()
|
|||
|
{
|
|||
|
add(bOK=new Button("OK"),"West");
|
|||
|
add(bCan=new Button("Cancel"),"East");
|
|||
|
bOK.addActionListener(this);
|
|||
|
bCan.addActionListener(this);
|
|||
|
addWindowListener(this);
|
|||
|
pack();
|
|||
|
}
|
|||
|
public void actionPerformed(ActionEvent e)
|
|||
|
{
|
|||
|
Object o = e.getSource();
|
|||
|
if (o==bOK) System.out.println("OK");
|
|||
|
else if (o==bCan) System.out.println("Cancel");
|
|||
|
}
|
|||
|
public void windowOpened(WindowEvent e){}
|
|||
|
public void windowClosing(WindowEvent e){System.exit(0);}
|
|||
|
public void windowClosed(WindowEvent e){}
|
|||
|
public void windowIconified(WindowEvent e){}
|
|||
|
public void windowDeiconified(WindowEvent e){}
|
|||
|
public void windowActivated(WindowEvent e){}
|
|||
|
public void windowDeactivated(WindowEvent e){}
|
|||
|
}
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
[]{#part2b} Ένας απλός echoserver με threads σε java.
|
|||
|
|
|||
|
Δημιουργήστε ένα directory \"echo\" κάτω από το \$CLASSPATH και δώστε
|
|||
|
|
|||
|
javac echoserver.java
|
|||
|
java echo.EchoServer &
|
|||
|
java echo.Client
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
package echo;
|
|||
|
|
|||
|
import java.util.*;
|
|||
|
import java.net.*;
|
|||
|
import java.io.*;
|
|||
|
|
|||
|
|
|||
|
class EchoServer
|
|||
|
{
|
|||
|
ServerSocket serverSocket=null;
|
|||
|
public EchoServer()
|
|||
|
{
|
|||
|
try {serverSocket = new ServerSocket(5555);}
|
|||
|
catch (IOException ex) {System.err.println(ex); System.exit(1);}
|
|||
|
}
|
|||
|
|
|||
|
public void run()
|
|||
|
{
|
|||
|
boolean listening = true;
|
|||
|
while (listening)
|
|||
|
{
|
|||
|
Socket clientSocket = null;
|
|||
|
try
|
|||
|
{
|
|||
|
clientSocket = serverSocket.accept();
|
|||
|
new ServerThread(clientSocket).start();
|
|||
|
}
|
|||
|
catch (IOException ex){System.err.println(ex);}
|
|||
|
}
|
|||
|
try {serverSocket.close();}
|
|||
|
catch (IOException ex) {System.err.println(ex);}
|
|||
|
}
|
|||
|
|
|||
|
public static void main(String[] args) {new EchoServer().run();}
|
|||
|
}
|
|||
|
|
|||
|
class ServerThread extends Thread
|
|||
|
{
|
|||
|
Socket socket;
|
|||
|
BufferedReader br;
|
|||
|
PrintWriter pw;
|
|||
|
ServerThread(Socket soc)
|
|||
|
{
|
|||
|
super("ServerThread");
|
|||
|
try
|
|||
|
{
|
|||
|
socket = soc;
|
|||
|
br = new BufferedReader(new InputStreamReader(soc.getInputStream()));
|
|||
|
pw = new PrintWriter(soc.getOutputStream());
|
|||
|
}
|
|||
|
catch(Exception ex){System.err.println(ex);}
|
|||
|
}
|
|||
|
public void run()
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
boolean listening = true;
|
|||
|
while (listening)
|
|||
|
{
|
|||
|
String inputLine = br.readLine();
|
|||
|
pw.println("echo: "+inputLine);
|
|||
|
pw.flush();
|
|||
|
}
|
|||
|
pw.close();
|
|||
|
br.close();
|
|||
|
socket.close();
|
|||
|
}
|
|||
|
catch (IOException e) {e.printStackTrace();}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
class Client extends Thread
|
|||
|
{
|
|||
|
PrintWriter os;
|
|||
|
BufferedReader is,stdin;
|
|||
|
Client(Socket soc) throws IOException
|
|||
|
{
|
|||
|
os = new PrintWriter(soc.getOutputStream());
|
|||
|
is = new BufferedReader(new InputStreamReader(soc.getInputStream()));
|
|||
|
stdin = new BufferedReader(new InputStreamReader(System.in));
|
|||
|
}
|
|||
|
|
|||
|
public void run()
|
|||
|
{
|
|||
|
boolean talking = true;
|
|||
|
while (talking)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
String s = stdin.readLine();
|
|||
|
os.println(s);
|
|||
|
os.flush();
|
|||
|
String s1 = is.readLine();
|
|||
|
System.out.println(s1);
|
|||
|
}
|
|||
|
catch(Exception ex){System.err.println(ex);}
|
|||
|
}
|
|||
|
}
|
|||
|
public static void main(String[] argv)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
Socket soc = new Socket("localhost",5555);
|
|||
|
new Client(soc).start();
|
|||
|
}
|
|||
|
catch(Exception ex){System.err.println(ex); System.exit(1);}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
[]{#part2c}
|
|||
|
|
|||
|
Προσέξτε πως παρακάμπτουμε το print method της Χ στην Α
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
class X
|
|||
|
{
|
|||
|
public int x;
|
|||
|
public X(int x1){x=x1;}
|
|||
|
public void print(){System.out.println(""+x);}
|
|||
|
}
|
|||
|
|
|||
|
class A
|
|||
|
{
|
|||
|
X myXInstance = new X(4){public void print(){System.out.println("x="+x);}}
|
|||
|
...
|
|||
|
}
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
[]{#part2d} Αν σας ενδιαφέρει ένα μικρό παράδειγμα του τί μπορεί να καταφέρει το RMI, στείλτε μου ένα mail στην διεύθυνση: <dglynos@freemail.gr> για να σας
|
|||
|
στείλω ενα παιχνιδάκι :) γραμμένο σε Java.
|
|||
|
|
|||
|
[]{#part4a}
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
Java Tools for Linux
|
|||
|
|
|||
|
[extracted from www.blackdown.org]
|
|||
|
|
|||
|
Java 1.1 compatible Web Browsers
|
|||
|
* Netscape Communicator v4.06 and 4.5Beta
|
|||
|
These versions of the netscape communicator support the JDK 1.1,
|
|||
|
including Swing. Both are available at Netscape JDK1.1 Update
|
|||
|
Support.
|
|||
|
* HotJava(tm) 1.1.4
|
|||
|
HotJava web browser is written entirely in Java. You can get more
|
|||
|
information about it at HotJava(tm) Browser Page.
|
|||
|
|
|||
|
IDE's
|
|||
|
* NetBeans Developer (commercial)
|
|||
|
NetBeans Developer cross-platform, full-featured IDE that combines
|
|||
|
support for all stages of application development including visual
|
|||
|
GUI design, editing, compilation, and debugging - an industrial
|
|||
|
strength yet intuitive development tool for development tool for
|
|||
|
developers at all levels. A version for Java 2 is now available
|
|||
|
for use so you can start using Java 2 on Linux as soon as the port
|
|||
|
is available. In addition, NetBeans features:
|
|||
|
+ Sophisticated support for Swing and layout managers, allowing
|
|||
|
quick and flexible design of highly functional GUIs.
|
|||
|
+ JavaBeans based architecture, making it highly extensible and
|
|||
|
customizable, down to every item on the menus and toolbars.
|
|||
|
+ A consistent approach to all object types (configuration
|
|||
|
objects, various data types, classes and their
|
|||
|
fields/methods, beans, etc.), simplifying the learning curve
|
|||
|
for NetBeans.
|
|||
|
+ Integrated, visual multi-threaded debugger with support for
|
|||
|
breakpoints, watches, locales, and threads
|
|||
|
+ Source Editor with syntax coloring and advanced features like
|
|||
|
dynamic word completion
|
|||
|
A non-commercial version is available for free from NetBeans.
|
|||
|
* Simplicity for Java (commercial / free trial version)
|
|||
|
Simplicity for Java is the most powerful RAD tool available on the
|
|||
|
Linux platform for creating Java applications and applets. By
|
|||
|
using the Simplicity for Java IDE, developers build Java software
|
|||
|
interactively through a visual model which is instantaneously
|
|||
|
updated to reflect any changes made to the program's source code
|
|||
|
without compiling. Its features include:
|
|||
|
+ Execution of Java source code on-the-fly
|
|||
|
+ Full support of all AWT and Swing Components and Layout
|
|||
|
Managers
|
|||
|
+ Code Sourcerer writes Java statements for you
|
|||
|
+ Full JavaBeans support
|
|||
|
+ Powerful Programmer's Editor features:
|
|||
|
+ Method lookup and autocompletion via introspection
|
|||
|
+ Search and replace using Perl5 regular expressions
|
|||
|
+ Color syntax highlighting
|
|||
|
+ Printing in full color
|
|||
|
+ Unlimited undo/redo
|
|||
|
* Cross-platform development and file formats
|
|||
|
* All generated code is pure Java (no proprietary libraries).
|
|||
|
* Uses any Java classes on your classpath including jar and zip
|
|||
|
files
|
|||
|
* Use JDK 1.1 or 1.2 (Java 2)
|
|||
|
* View signature, methods, and fields of any class
|
|||
|
* Double click compiler error messages to jump directly to code
|
|||
|
* Year 2000 Compliant
|
|||
|
|
|||
|
A free trial of the new version 1.1 is available from Data
|
|||
|
Representations, Inc.
|
|||
|
|
|||
|
CodeGuide (commercial / free non-commercial edition)
|
|||
|
CodeGuide is the first IDE which really understands Java. It offers a
|
|||
|
vast assortment of powerful programming aids:
|
|||
|
* COMPLETE and INSTANTANEOUS error detection to show you errors as
|
|||
|
you type.
|
|||
|
* Prefix completion of field accesses and method invocations which
|
|||
|
works just like the file-completion in the UNIX bash.
|
|||
|
* Display of valid methods and fields in the code.
|
|||
|
* Display of expected method parameters.
|
|||
|
* Source browsing to navigate quickly within your code.
|
|||
|
|
|||
|
CodeGuide also features other advanced IDE functionality:
|
|||
|
* External compiler integration.
|
|||
|
* Connection to external VMs.
|
|||
|
* Syntax highlighting.
|
|||
|
* JDK switching.
|
|||
|
* Full Java 2 support.
|
|||
|
|
|||
|
A non-commercial edition is available for free from Omnicore Software.
|
|||
|
|
|||
|
StructureBuilder (commercial)
|
|||
|
Tendril Software's StructureBuilder products are innovative UML
|
|||
|
model-based Java component and application development tools. They are
|
|||
|
the only visualization tools to be tightly integrated into an IDE.
|
|||
|
StructureBuilder can currently be integrated with NetBeans Developer
|
|||
|
and VisualCafe 3.
|
|||
|
* StructureBuilder has synchronized source code and Class Diagram.
|
|||
|
It supports Sequence Diagrams and Use Case Diagrams.
|
|||
|
* StructureBuilder is the only tool that will allow a developer to
|
|||
|
generate code from interaction diagrams.
|
|||
|
* StructureBuilder is the only tool in its class that can recognize
|
|||
|
1:Many relationships when reverse engineering.
|
|||
|
* You can generate Javadoc tags automatically and create HTML
|
|||
|
documentation of your object model with diagram imagemaps.
|
|||
|
* StructureBuilder allows you to visually define, verify and
|
|||
|
generate supporting code for JavaBeans and Enterprise JavaBeans as
|
|||
|
well as parse, identify and extend existing components.
|
|||
|
* The product contains a comprehensive and easy to use Open API.
|
|||
|
* StructureBuilder is certified 100% Pure Java and is supported on
|
|||
|
the Linux platform, as well as Windows and SPARC.
|
|||
|
|
|||
|
Download an evaluation version at Tendril's website.
|
|||
|
|
|||
|
AnyJ (freeware with professional commercial version)
|
|||
|
AnyJ is a cross-platform, full-featured IDE that supports all kinds of
|
|||
|
of java applications: Servlets, Applets, Applications. Includes a Java
|
|||
|
Beans conform Visual GUI-Builder (Swing), Debugger, integrated Version
|
|||
|
Control and a very powerful and fast Editor.
|
|||
|
* GUI Builder: Full support of AWT and Swing Components, JavaBeans
|
|||
|
support, Unlimited undo/redo
|
|||
|
* Source Code Engineering: True Intelli*ense-like parser backed code
|
|||
|
completion, class browsers & source analysis tools, "Goto
|
|||
|
definition" for quick navigation.
|
|||
|
* Editor: Autocompletion (uses source parsing or .jar/.class file
|
|||
|
scaning), auto import, Unlimited undo/redo,
|
|||
|
Syntax Coloring of Java, Html, XML, etc.. Jump to source from
|
|||
|
compiler error messages or Stack traces
|
|||
|
* integrated graphical debugger (multithreaded, remote debugging,
|
|||
|
breakpoints in inner & anonymous classes)
|
|||
|
* integrated GUI-based Version Control & Diff-viewer,
|
|||
|
* Servlet support (Simply Compile & Run),
|
|||
|
* Customizable Shortcuts, Menu's, Plugin Architecture to extend AnyJ
|
|||
|
in Java, Dependency Checker to support deployment, Commandline
|
|||
|
interface to integrate external tools and scripts.
|
|||
|
* Supports JDK 1.1 or 1.2 (Java 2) (WinNT: + MS-SDK)
|
|||
|
|
|||
|
The Linux release is freeware. Unrestricted non-commercial versions
|
|||
|
for Solaris and WinNT are available for free from NetComputing.
|
|||
|
|
|||
|
BlueJ (free)
|
|||
|
BlueJ is an integrated Java environment specifically designed for
|
|||
|
introductory teaching. It was developed at Monash University for the
|
|||
|
purpose of teaching in a first-year course and is suitable for
|
|||
|
teachers and individuals who want to learn or use Java. Some features:
|
|||
|
* fully integrated environment
|
|||
|
* graphical class structure display
|
|||
|
* graphical and textual editing
|
|||
|
* built-in editor, compiler, virtual machine, debugger, class
|
|||
|
browser, etc.
|
|||
|
* easy-to-use interface, ideal for beginners
|
|||
|
* interactive object creation
|
|||
|
* interactive object calls and testing
|
|||
|
* incremental application development
|
|||
|
|
|||
|
Class and dependancy visualisation helps to understand object-oriented
|
|||
|
structures and interaction facilities support very flexible
|
|||
|
experimentation and immediate feedback.
|
|||
|
|
|||
|
JDesignerPro from BulletProof (commercial / free 90 day trial
|
|||
|
version)
|
|||
|
JDesignerPro is a complete solution for building and deploying your
|
|||
|
intranet/internet/extranet applications that require database
|
|||
|
connectivity. The visual wizards make development and deployment easy
|
|||
|
even for those who have never programmed before. Some of the features
|
|||
|
include:
|
|||
|
* True WYSIWYG development - build and deploy client-side
|
|||
|
applications
|
|||
|
* Enterprise Server - build and deploy server-side applications
|
|||
|
* Database connection pooling
|
|||
|
* Completely Object Oriented Structure - Import any JavaBean or
|
|||
|
other component
|
|||
|
* Solid User Access Control system to allow deployment to just the
|
|||
|
right endusers
|
|||
|
* Instant deployment to remote servers
|
|||
|
* SQL Wizard for adhoc querying
|
|||
|
* Wizards for Forms, Grids, Reports, Charts, Email, Paging and more
|
|||
|
* Clients run on Netscape 3.0 or IE 3.0 or later on any platform
|
|||
|
* Integrated HelpDesk system for your endusers
|
|||
|
* Build over the web - Application Builder can be run over the web
|
|||
|
to allow remote development
|
|||
|
* Manage server side processes over the web and monitor active
|
|||
|
endusers
|
|||
|
|
|||
|
BulletProof also offers free email support and paid phone support.
|
|||
|
Download a free trial from the BulletProof website.
|
|||
|
|
|||
|
Elixir IDE (commercial/free Lite version)
|
|||
|
Elixir IDE is a slick, lightweight programmer's editor for
|
|||
|
professional Java developers. It was developed on Linux in 100% Java
|
|||
|
sporting the Swing interface. Its features include:
|
|||
|
* Pluggable architecture supporting multiple compilers (JDK 1.1,
|
|||
|
1.2, Jikes), scripting engine (Scheme), and version control system
|
|||
|
(RCS);
|
|||
|
* Powerful editor with syntax colouring for Java, HTML, Scheme,
|
|||
|
unlimited undo-redo and collapsible code blocks;
|
|||
|
* Powerful editor with syntax colouring for Java, HTML, Scheme,
|
|||
|
unlimited undo-redo and collapsible code blocks;
|
|||
|
* File and source code browser and management environment scalable
|
|||
|
for large team development;
|
|||
|
* Integrated HTML browser for viewing help files such as Java APIs;
|
|||
|
and
|
|||
|
* Runs on all JDK 1.1 and 1.2 platforms including Linux, with Swing
|
|||
|
user interface.
|
|||
|
|
|||
|
A free Lite version with 10 Java file limit is available.
|
|||
|
|
|||
|
LOREx2 for Java (commercial)
|
|||
|
LOREx2 for Java is a Java-centric, UML-based CASE tool designed for
|
|||
|
Java developers. Developed in 100% Java, LOREx2 runs on all JDK 1.1
|
|||
|
platforms including Linux. Its features include:
|
|||
|
* Support for UML diagrams with intuitive diagramming features like
|
|||
|
an intelligent connector that auto-detects valid connection types
|
|||
|
between 2 objects;
|
|||
|
* Support for Java keywords like synchronized and @deprecated;
|
|||
|
* Java code generation;
|
|||
|
* Reverse engineers Java applications to UML diagrams:
|
|||
|
+ view class interaction and object structure;
|
|||
|
+ perform impact analysis for system maintenance; and
|
|||
|
+ no source code needed.
|
|||
|
* Support for Java plug-ins to allow tool extension and
|
|||
|
customization by Java developers (the Java code generator is
|
|||
|
itself one such plug-in); and
|
|||
|
* A design repository browser with an object database underneath to
|
|||
|
ensure full design and view integrity.
|
|||
|
|
|||
|
Super Mojo (commercial)
|
|||
|
Penumbra's page describes Super Mojo as a "visual Java development
|
|||
|
environment, Super Mojo offers three primary advantages to the
|
|||
|
developer: Rapid Application Development through ease of use and a
|
|||
|
fresh approach to the user interface. Total Application Control
|
|||
|
through complete access to all underlying code. Maximum Code Reuse by
|
|||
|
pushing the limits of object oriented programming ideals."
|
|||
|
|
|||
|
WipeOut (freeware with professional commercial version)
|
|||
|
softwarebuero is developing Java IDE, WipeOut, for Linux. It's not
|
|||
|
just a frontend for the JDK, it also fronts for CVS, make, C++
|
|||
|
compiler and GDB. It's features include: general support of C++ and
|
|||
|
Java, revision management / team work support, fast, incremental
|
|||
|
source code parser, central text editor with syntax highlighting, all
|
|||
|
components are fully integrated, nice, productive GUI (no Motif
|
|||
|
required!) and automatic generation of makefiles. It includes a
|
|||
|
Project/Revision Browser, a Class Browser, a Debugger Front End, and a
|
|||
|
Text Editor. For more information Visit the WipeOut Page or download
|
|||
|
it here.
|
|||
|
|
|||
|
JForge (Commercial)
|
|||
|
JForge is a Java Beans GUI builder, certified 100% Pure Java by Sun
|
|||
|
Microsystems. It provides a WYSIWYG style interface for creating AWT
|
|||
|
and JFC based Java Beans or GUI forms, saving and loading of Beans as
|
|||
|
Java code or serialized objects, full support for the standard Layout
|
|||
|
Managers, a Menu Builder, pluggable user menus and customizable
|
|||
|
interface, and a feature-rich API allowing even further customization
|
|||
|
or integration with third-party tools. JForge is sold by Tek Tools,
|
|||
|
makers of the popular Kawa Java IDE, and is available for a free 30
|
|||
|
day evaluation period for either JDK 1.1.x or JDK 1.2 development
|
|||
|
environments on all Java-enabled platforms.
|
|||
|
|
|||
|
Source Navigator (free "lite" version)
|
|||
|
SN v4 is a complete ide for Java, c/c++, Tcl, Assembly, Fortran, and
|
|||
|
COBOL. It has a Symbol Browser, Class Browsers, Class Hierarchy
|
|||
|
Browser, Include Browser, Cross Referencer, GUI Editor, Diff Tool,
|
|||
|
Debugger Interface, SDK with APIs. Get your lite version while you buy
|
|||
|
a copy for me at the Cygnus Source Navigator site.
|
|||
|
|
|||
|
JACOB - The Java Commando Base for Emacs (free)
|
|||
|
Jacob is a Java class browser and project manager for Emacs and
|
|||
|
includes a powerful class wizard. Unlike traditional browsers the
|
|||
|
windows are vertically aligned and the full vertical screen size is
|
|||
|
still reserved for editing. Height of browser lists (packages,
|
|||
|
classes, methods) can be dynamically changed. Now you can spend all
|
|||
|
the screen real estate for your methods or classes, just as you like
|
|||
|
it. Additionally Jacob generates a makefile to compile, run, and/or
|
|||
|
archive (with zip and rcs) your application. JACOB can be found at
|
|||
|
http://home.pages.de/~kclee/clemens/jacob/.
|
|||
|
|
|||
|
Emacs JDE (free)
|
|||
|
The JDE Hompage explain JDE as "an Emacs Lisp package that provides a
|
|||
|
highly configurable Emacs wrapper for command-line Java development
|
|||
|
tools, such as those provided in JavaSoft's JDK. The JDE provides menu
|
|||
|
access to a Java compiler, debugger, and API doc. The Emacs/JDE
|
|||
|
combination adds features typically missing from command-line tools,
|
|||
|
including: syntax coloring, auto indentation, compile error to source
|
|||
|
links, source-level debugging, source code browsing."
|
|||
|
|
|||
|
Visaj (commercial)
|
|||
|
Visaj is a rapid visual application builder for Java written
|
|||
|
completely in Java. It fully supports JavaBeans and the Java 2
|
|||
|
Platform. Visaj enhances developers' productivity by providing a
|
|||
|
point-and-click environment and advanced layout editors for rapidly
|
|||
|
building pure Java applications.
|
|||
|
|
|||
|
The rapidity and flexibility inherent in the builder shortens
|
|||
|
development times significantly. Its many features, which include an
|
|||
|
image editor, resource bundle constructor and live event wiring, means
|
|||
|
even the most sophisticated of designs can be put together with ease.
|
|||
|
|
|||
|
Its full support for Swing brings the power of Sun's rich Java
|
|||
|
Foundation Classes to all Java developers and allows developers to
|
|||
|
reuse third-party or in-house components with ease.
|
|||
|
|
|||
|
Visaj and applications built with it are fully compliant with the Sun
|
|||
|
Microsystems Java Developer's Kit v. 1.1 and JavaBeans, and will run
|
|||
|
on ANY Java platform.
|
|||
|
|
|||
|
Free evaluation copies are available for download from Imperial
|
|||
|
Software Technology.
|
|||
|
|
|||
|
Sun's Java WorkShop(tm) v2.0 (commercial/trial)
|
|||
|
If you have the commercial or trial version, grab the patch for linux
|
|||
|
at ftp://ftp.suse.com/pub/SuSE-Linux/suse_update/JWS2.0/. For the
|
|||
|
trial version essentially do everything it asks except inserting the
|
|||
|
CD. And also erase that huge JDK directory and replacing it with a
|
|||
|
soft link to your jdk (but you shouldn't even have to do that). SuSE
|
|||
|
distributes it commercially as well.
|
|||
|
|
|||
|
Instant Basic(tm) for Java(tm) (commercial)
|
|||
|
Instant Basic for Java (IB4J) is the first and only 100% Pure Java(tm)
|
|||
|
certified fourth-generation language (4GL) tool. It offers an
|
|||
|
Integrated Development Environment similar to Microsoft(R) Visual
|
|||
|
Basic(R) that enables developers to create new Java-based applets and
|
|||
|
applications. IB4J provides easy migration of existing Visual Basic
|
|||
|
applications to the Java platform. Available in both a Standard and
|
|||
|
Professional Edition.
|
|||
|
|
|||
|
Sun's JavaStudio(tm) v1.0 (commercial/trial)
|
|||
|
If you have the trial version you need to do a few funky things. You
|
|||
|
will need the Solaris SPARC distribution and the jws.zip file from the
|
|||
|
win32 distribution. Yes that means you must have access to an
|
|||
|
installed trail version of JavaStudio on Windows.
|
|||
|
* Replace Java-Studio1.0/JDK with a link to /usr/local/java or where
|
|||
|
the JDK resides
|
|||
|
* Remove the contents of Java-Studio1.0/JS/classes
|
|||
|
* Inside Java-Studio1.0/JS/classes, unzip the jws zipfile
|
|||
|
* cd to Java-Studio1.0/JS/sparc-S2/bin and apply js-linux.diff
|
|||
|
* ./js
|
|||
|
|
|||
|
FreeBuilder (free)
|
|||
|
Still new but the next release looks VERY promising. Visit the
|
|||
|
FreeBuilder Homepage. JIT's
|
|||
|
* The TYA Just In Time Compiler
|
|||
|
TYA is a ``100% inofficial'' JIT-compiler original designed as an
|
|||
|
add-on to Randy Chapman's port of JDK 1.0.2 for Linux (x86). Later
|
|||
|
I have added some changes in TYA code for working together with
|
|||
|
the newer 1.1.x ports by Steve Byrne. TYA is current is a very
|
|||
|
stable and usuable development stage. Expect to double the speed
|
|||
|
of your java applications. You can download it from the TYA ftp
|
|||
|
site .
|
|||
|
* Metrowerks JIT for PowerPC
|
|||
|
This is freely available from Kevin Buettner and Metrowerks,
|
|||
|
thanks guys. Visit the Java for Linux on the PowerPC for more
|
|||
|
information and to download it.
|
|||
|
* CACAO JIT for Alpha
|
|||
|
CACAO is 64 bit just-in-time (JIT) compiler for Java. It
|
|||
|
translates Java byte code on demand into native code for the ALPHA
|
|||
|
processor. The current version CACAO 0.1 supports the Alpha
|
|||
|
processor under Linux and Digital Unix. It can be used with the
|
|||
|
class library of the JDK 1.0.2. CACAO version 0.1 does not support
|
|||
|
AWT, it only supports java/lang, java/io and java/util.
|
|||
|
|
|||
|
Java Virtual Machines
|
|||
|
* Sun's Java Virtual Machines
|
|||
|
The most common is the Java Development Kit (JDK) ports to various
|
|||
|
architectures is available at the Ports Page. Sun also has a Java
|
|||
|
Runtime Environment (JRE). It includes a Java runtime interpreter
|
|||
|
and all required libraries. The JRE does not include appletviewer
|
|||
|
or compilers. The JRE is also available at the Ports Page.
|
|||
|
* Japhar
|
|||
|
Japhar is the Hungry Programer's Java VM. It has been built from
|
|||
|
the ground up without consulting Sun's sources. Visit the Japhar
|
|||
|
Homepage for more information. Downloads of the distribution are
|
|||
|
available at: ftp://ftp.hungry.com/pub/hungry/japhar.
|
|||
|
* Kaffe
|
|||
|
The Kaffe Homepage says, "Kaffe is a virtual machine design to
|
|||
|
execute Java bytecode. Unlike other virtual machines available,
|
|||
|
this machine performs "just-in-time" code conversion from the
|
|||
|
abstract code to the host machine's native code. This will
|
|||
|
ultimately allow execution of Java code at the same speed as
|
|||
|
standard compiled code but while maintaining the advantages and
|
|||
|
flexibility of code independence. You can download Kaffe at
|
|||
|
ftp://ftp.kaffe.org/pub/kaffe/ .
|
|||
|
* TowerJ
|
|||
|
TowerJ is a native Java deployment compiler and runtime
|
|||
|
environment. It allows for the creation of optimized self
|
|||
|
contained executables from Java bytecode for improved application
|
|||
|
performance, manageability and security.
|
|||
|
|
|||
|
Translators to Java
|
|||
|
* Toba: A Java-to-C Translator
|
|||
|
Toba translates Java class files into C source code. This allows
|
|||
|
the construction of directly executable programs that avoid the
|
|||
|
overhead of interpretation. Toba deals with stand-alone
|
|||
|
applications, not applets, and currently support the 1.1 JDK.
|
|||
|
* Harissa
|
|||
|
Harissa is a Java environment that includes a compiler from Java
|
|||
|
bytecode to C and a Java interpreter. While Harissa is aimed at
|
|||
|
applications that are statically configured, such as the Javac
|
|||
|
compiler, it is also designed to allow code to be dynamically
|
|||
|
loaded in an already compiled application. This novel feature is
|
|||
|
introduced by integrating our bytecode interpreter in the runtime
|
|||
|
library. Data structures are compatible between the Java compiled
|
|||
|
code and the interpreter, and data allocated by the interpreter
|
|||
|
does not conflict with data allocated by the compiled code.
|
|||
|
Harissa is written in C and provides an efficient and flexible
|
|||
|
solution for the execution of Java applications.
|
|||
|
|
|||
|
Compilers
|
|||
|
* Jikes
|
|||
|
Jikes is a fast, incremental Java byte-code compiler developed by
|
|||
|
IBM Research.
|
|||
|
|
|||
|
Decompilers
|
|||
|
* JAD-- the fast JAva Decompiler
|
|||
|
The JAD Page says, "Jad is a Java decompiler, i.e. program that
|
|||
|
reads one or more Java class files and converts them into Java
|
|||
|
source files which can be compiled again. Jad is 100% pure C++
|
|||
|
program and it generally works several times faster than
|
|||
|
decompilers written in Java. Also Jad doesn't use the Java runtime
|
|||
|
for its functioning, therefore no special setup (like changes to
|
|||
|
CLASSPATH variable) is required."
|
|||
|
|
|||
|
Other
|
|||
|
* JStyle (free)
|
|||
|
JStyle is a family of Java source-code styling filters, written
|
|||
|
purely in Java. It includes JSBeautifier - a reindentation filter,
|
|||
|
and JSFormatter - a full reformation filter.
|
|||
|
* Instant Installer(tm)
|
|||
|
100% Pure Java(tm) certified Installer for developers who want to
|
|||
|
produce a universal installer that will run on all the Java
|
|||
|
platforms. Available from Halcyon Software.
|
|||
|
* Instant Converter(tm)
|
|||
|
100% Pure Java(tm) converter. Immediate VB to Java Source Code
|
|||
|
conversion. Available from Halcyon Software.
|
|||
|
* YACC and Lex for Java
|
|||
|
Modern Compiler Implementation in Java offers JLex (a lexical
|
|||
|
analyzer generator) and CUP (a parser generator) written in Java.
|
|||
|
* Free Tools for Java
|
|||
|
The Free Tools for Java Page contains an Java Obfuscator, Java
|
|||
|
based Installer, Java Assembler and more.
|
|||
|
* Packages and Non-development Tools
|
|||
|
Some leads are under Other Products.
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|