JavaSvet - otvorena java zajednica

 
glavna stranica arr2javasvet  english version arr2java.net

Uskočite u Javu!

Igor Spasić, Marko Simić

16 Jan
2008

10 Jan 2008

Poznavanje samog programskog jezika Java i objektno-orijentisanih principa je danas tek (neophodni) uslov za ulazak u svet Jave. Pored osnova, potrebno je znati više o samoj Java platformi, načina kako se ona integriše u operativni sistem i kako napraviti radno okruženje u kome će se lako razvijati Java aplikacije. Zbog svoje arhitekture, rad u Javi u prvom trenutku može da izgleda pomalo konfuzno, što zna da obeshrabi one koji tek počinju sa ovom tehnologijom. Namera članka je da upravo olakša ulazak početnika u Java svet. Deo teksta je odabran i preuzet iz raznih izvora, a drugi deo je rezultat praktičnog iskustva autora članka. Dalje, članak nikako ne treba shvatiti kao konačan, tako da će biti menjan ili proširen ukoliko se javi interesovanje ili potreba.

Programski jezik Java

Java je programski jezik koga krase sledeće osobine:

  • Jednostavan
  • Nezavisne arhitekture
  • Objektno orijentisan
  • Portabilan
  • Distribuiran
  • Izuzetnih performansi
  • Podržava niti (thread)
  • Robustan
  • Dinamičan
  • Siguran
  • U Javi, izvorni kod (source) programa se piše u običnom tekstualnom fajlu koji se završava sa .java ekstenzijom. Fajlovi sa izvornim kodom programa se potom prevode (kompajliraju, compile) u .class binarne fajlove. Za prevođenje se koristi programski prevodilac (compiler), javac. Prevedeni fajlovi (.class) ne sadrže takozvani native kod, tj. mašinski kod koji odgovara hardveru i operativnom sistemu. Umesto toga, .class binarni fajl sadrži bajtkod (bytecode) - mašinski jezik Java Virtuelne Mašine (JVM). Za startovanje prevedenog programa potrebno je koristiti java launcher, program koji startuje izvršavanje prevedenog programa u JVM.

    Upravo koncept virtualne mašine omogućuje da se isti program izvršava na isti način na različitim operativnim sistemima. Java VM postoji za Windows, Solaris, Linux, MacOS... Moderne JVM ne služe samo za pokretanje programa, već, na primeru poput Java HotSpot VM, izvršavaju dodatne zadatke u toku rada programa (u runtime), čime značajno povećavaju performanse aplikacije. U ove zadatke HotSpot VM spada analiza koda, traženje kritičnih tačaka sa stanovišta perfomansi i njihovo ponovno prevođenje u native izvršni kod opertivnog sistema.

    Java platforma

    Platforma je softversko i/ili hardversko okruženje u kome se izvršava program. Java se upravo razlikuje od mnogih drugih platformi u tome što je isključivo softverska, koja radi na drugim hardverskim platformama. Kao što je rečeno, ovo čini Javu portabilnom i nezavisnom od hardverske platforme. Kao takva, Java platforma može biti nešto sporija od native koda. Ipak, napredne tehnike ugrađene u prevodilac i VM čine da razlike performansi budu na veoma prihvatljivom nivou.

    Java platforma se sastoji iz dve komponente:

    Alat za razvoj

    Za izvršavanje Java aplikacija potrebno je imati instaliranu samo Java platformu. Ona se naziva i Java Runtime Enviroment (JRE) i može se kao instalacija preuzeti sa Sun-ovog sajta za različite operativne sisteme.

    Za razvoj Java aplikacija je potrebno osim JRE imati i skup alata kojima se radi razvoj (prevodilac...). Sva ova 'oprema' za osnovni razvoj Java aplikacija je sadržana u skupu koji se naziva: Java Development Kit (JDK). JDK, dakle, sadrži JRE i sve dodatne alate neophodne za osnovni razvoj Java aplikacija. Ove alate uglavnom čine aplikacije koje se izvršavaju iz komandne linije. JDK se takođe može preuzeti kao instalacija sa Sun-ovog sajta.

    JDK izdanja

    Za neke Java aplikacije su potrebne dodatne mogućnosti, koje nisu sadržane osnovnim skupom JDK, kao što je slučaj sa web aplikacijama. Zato postoje razna izdanja (edition) JDK-a. Najpopularnija su sledeća izdanja:

    Integirsana okruženja za razvoj aplikacija (IDE)

    Iako je moguće razvijati Java aplikacije koristeći samo JDK, omiljeni editor teksta i pozivati Java alatke iz komandne linije, to je daleko od praktičnog i efikasnog razvoja. Danas postoje mnoga kvalitetna integrisana okruženja za razvoj Java aplikacija (IDE) koja nude pogodnosti kao što su provera ispravnosti java koda u toku pisanja, automatsko završavanje započetog koda (auto-complete), lako prevođenje, izvršavanje i debagovanje programa itd. Ovo je tek mali deo mogućnosti savremenih IDE, tako da se danas ozbiljni razvoj Java aplikacija jednostavno ne može zamisliti bez njih.

    Izbor IDE-a dosta zavisi od ličnih preferenci razvijaoca programa. Među najpopularnijim okruženjima spadaju: IntelliJ IDEA, Eclipse, NetBeans, Borland JBuilder, JCreator, Oracle JDeveloper i druga.

    Iako IDE značajno olakšava pisanje Java aplikacija, preporučljivo je biti upoznat sa celim postupkom prevođenja i izvršavanjem programa iz komande linije.

    JDK Instalacija

    Instalacija JDK zavisi od operativnog sistema. U osnovi, instalacija ne predstavlja problem jer se ne razlikuje se od instalacije bilo koje druge aplikacije.

    Destinacioni direktorijum

    Ne bi bilo loše izbeći uobičajeno ponuđenu lokaciju instalacionog direktorijuma (na Windows-u je to: c:\Program Files\Java\jdk1.x.x_xx), kod automatske instalacije JDK. Može se javiti potreba da se pristupi Java alatima ili JVM iz komandne linije, ili da je neophodno negde navesti punu putanju do JDK, pa je mnogo lakše kada se JDK instalira u direktorijum čija je putanja jednostavna i bez 'nezgodnih' karaktera (razmak), na primer: d:/java/jdk6.

    Više verzija JDK

    Moguće je imati više verzija JDK na sistemu - jednostavno ih treba instalirati u zasebne direktorijume. Ako se za razvoj koristi neki IDE, onda se uglavnom lako bira JDK sa kojom se radi projekat. Međutim, pošto se sa JDK instalira i JRE, često program za instalaciju postavlja da taj JRE bude default za operativni sistem. Zato je preporuka da se poslednja instalira JDK (tj. JRE) čija verzija treba da bude default na sistemu. Naravno, default verziju JRE je moguće promeniti ručno i posle instalacije, ali i eksplicitno navesti prilikom samog startovanja neke Java aplikacije.

    Sistemska promenljiva JAVA_HOME

    JAVA_HOME sistemska promenljiva (environment varijabla) bi trebalo da ukazuje na instalacioni direktorijum u kome je instalirana Java. Iako nije neophodna, ova sistemska promenljiva se koristi od strane mnogih Java aplikacija, te je postavljanje njene vrednosti preporučeno. U slučaju da je instalirano više verzija Jave, JAVA_HOME treba da ukazuje na podrazumevanu (default) verziju za operativni sistem.

    Sistemska promenljiva JDK_HOME i JRE_HOME

    Slično JAVA_HOME, mogu se postaviti vrednosti sistemskih promenljivih JDK_HOME i JRE_HOME, koje bi trebalo da ukazuju na podrazumevanu instalaciju JDK i JRE, respektivno. Neki Java programi koriste neke specifičnosti JDK-a koji ne postoje u instalaciji JRE (na pr. prevodilac), te zahtevaju postojanje sistemske promenljive JDK_HOME kako bi naglasili potrebu za JDK-om. Sistemska promenljiva JRE_HOME se retko upotrebljava.

    Kada se instalira JDK, najjednostavnije je postaviti istu vrednost za JAVA_HOME i JDK_HOME.

    Sistemska promenljiva PATH

    Zgodno je dodati putanju do Java alata u sistemsku promenljivu PATH, kako bi oni bili dostupni sa svih putanja i direktorijuma. Java alati se nalaze u bin pod-direktorijumu, tako da celokupna putanja može da izgleda: d:/java/jdk5/bin.

    Ako na sistemu već postoji postavljena sistemska promenljiva JAVA_HOME, onda je mudro umesto eksplicitne putanje na PATH dodati sledeće: %JAVA_HOME%/bin.

    Provera instalacije

    Sistemske promenljive:

    > echo %JAVA_HOME%
    > echo %JDK_HOME%
    

    Java VM:

    > java -version
    java version "1.5.0_12"
    Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_12-b04)
    Java HotSpot(TM) Client VM (build 1.5.0_12-b04, mixed mode)
    

    Java prevodilac:

    > javac -version
    javac 1.5.0_12
    javac: no source files
    Usage: javac <options> <source files>....

    Sistemska promenljiva CLASSPATH

    Pošto je često slučaj da Java aplikacije zavise od eksternih biblioteka (koje se distribuiraju kao JAR fajlovi), java VM mora nekako da 'zna' gde se ti JAR fajlovi nalaze na fajl sistemu. CLASSPATH sistemska promenljiva je predviđena da, slično PATH, sadrži skup putanja do JARova ili direktorijuma sa prevedenim klasama, koje razne Java aplikacije mogu da koriste.

    Iako se na većini mesta savetuje postavljanje ove sistemske promenljive, autor članka to NE preporučuje. Aplikacije koriste razne verzije biblioteka, a i njihov broj nije mali, tako da je teško izdvojiti skup biblioteka koji bi bio zajednički za više aplikacija. Umesto toga je praktičnije postaviti vrednost CLASSPATH za svaku aplikaciju posebno, što one to najčešće i rade u svojim izvršnim batch skriptovima.

    Zdravo Svete!

    Teško je zamisliti ovakav članak bez odgovarajućeg 'Hello World' primera;)

    Struktura projekta

    Važno je dobro organizovati Java projekat: pravilno odvojiti java izvorni kod od prevedenih klasa, organizovati bilblioteke i tome slično. Iako za male projekte to nije tako važno, preporučljivo je uvek razvijati projekat sa dobro odabranom strukturom. Sledi opis moguće strukture projekta za potrebe ovog jednostavnog primera. Struktura uključuje iskustva autora članka i slobodno se može menjati prema vlastitim potrebama. Uobičajeno je u programiranju da imena direktorijuma, svojim imenom, sugerišu njegov sadržaj.

    Direktorjum src (sinonim za source, izvorni kod) sadrži celokupan izvroni kod java programa. Klase bi trebalo da su uvek raspoređene po paketima, kojima na fajl sistemu odgovaraju dorektorijumi.

    Direktorijum out (sinonim za output, rezultat kreiranja aplikacije; često se naziva i bin, što je sinonim za binary, binarni, tj. prevedeni kod) sadrži celokupan rezultat prevođenja aplikacije (.class fajlove). U većim projektima, proces kreiranja (build-ovanja) aplikacije ne čini samo prevođenje, već on uključuje i druge korake, na primer: prevođenje i izvršavanje test klasa, kreiranje javadoc-a, izračunavanje pokrivenosti koda... Ne bi bilo loše da se rezultati svih ovih aktivnosti smeste u ovaj direktorijum. On nikako ne sme da sadrži bilo šta što se ne može generisati build-ovanjem aplikacije! Direktorijum treba posmatrati kao pomoćni, koji se u svakom trenutku može kompletno obrisati, da bi build-ovanje projekta moglo biti izvršeno potpuno ispočetka.

    Direktorijum lib (sinonim za library, biblioteke) sadrži sve eksterne biblioteke koje aplikacija koristi. Jedan način korišćenja je da se svi JARovi jednostavno kopiraju u ovaj direktorijum. Autor članka preferira drugi način gde se biblioteke grupišu po pod-direktorijumima - u svakom se nalaze potrebni distribucioni JARovi, ali i fajlovi sa licencama pod kojima su objavljene biblioteke.

    Direktorijum etc (sinonim za et cetera, 'i ostale stvari') može da sadrži sve pomoćne fajlove u vezi projekta - uputstva, zahteve, SQL skriptove i tome slično.

    Direktorijum dist (sinonim za distribution, distribucija) sadrži finalni rezultat build-ovanja aplikacije, spreman za distribuciju. To može biti JAR fajl, WAR fajl (za web), ili, na primer, ZIP fajl koji sadrži sve potrebne artifekte build-ovanja (iz out direktorijuma).

    Sam osnovni (root) direktorijum projekta ne bi trebalo da sadrži mnogo fajlova. Tu bi se našli build skriptovi (ant), ako se koriste, ili fajlovi korišćenog IDEa. Osnovni direktorijum bi trebalo da bude i direktorijum odakle se pokreće build-ovanje projekta, bez obzira da li se to radi ručno, iz IDE-a, ili iz nekog skripta.

    Program, njegovo prevođenje i izvršavanje

    Program je trivijalan:

    package net.javasvet;
    
    public class ZdravoSvete {
    	public static void main(String[] args) {
    		System.out.println("Zdravo Java Svete!");
    	}
    }
    

    Ako se ne koristi IDE, program se može prevesti sledećom komandom (pokrenutom iz osnovnog direktorijuma projekta):

    > javac -d out\Production\ZdravoSvete src\net\javasvet\ZdravoSvete.java 

    Kao što je rečeno ranije, javac prevodilac dolazi samo uz JDK. JRE služi samo za pokretanje Java aplikacija i ne sadrži alatke za razvoj. Da bi se prevodilac mogao koristiti na navedeni način, poželjno bi bilo da budu postavljene sistemske promenljive JAVA_HOME i JDK_HOME, kao i da PATH sadrži %JAVA_HOME%/bin putanju.

    Prevedena klasa se smešta u direktorijum naznačen komandnom opcijom d (destination). Ovako preveden program se može izvršiti sledećom komandom:

    > java -cp out\production\ZdravoSvete net.javasvet.ZdravoSvete

    Komandnom opcijom cp se postavlja vrednost za CLASSPATH. U ovom primeru, reč je direktorijumu u kome su smeštene prevedene klase.

    Svaki početak je težak...

    Happy Java coding :)