JavaMake je program i plugin za Ant koji omogućava 'pametno' kompajliranje, uzimajući u obziru međusobnu zavisnost (dependencies) klasa. Može se naći na sledećoj adresi: http://www.experimentalstuff.com/Technologies/JavaMake/. U pitanju je jedan od projekata Sun Microsystems laboratorije. Iako su tehnologije iz ove laboratorija eksperimentalne i ne spadaju u zvanične proizvode Sun-a, JavaMake postoji već duže vremena i konstantno se razvija.
Javin standardni kompajler (javac) uzima u obzir samo one sors fajlove koji su izmenjeni od poslednjeg kompajliranja. Znači, pri kompajliranju se poredi timestamp class i java fajlova, pa ako je java fajl noviji, ponovo se kompajlira. Međutim, to često zna da ne bude dovoljno. Razlog tome je to što neke od klasa koje nisu menjane mogu da i dalje koriste promenjenu klasu na način na koji to više nije moguće.
Evo jednostavnog primera, koji posmatra dve klase:
public class A {
public void foo() {
new B().foo();
}
}i
public class B {
public void foo() {
System.out.println("foo");
}
}
Neka se sada, nakon prvog uspešnog kompajliranja, promeni ime metoda B.foo() u foox().
Ponovo pokretanja Ant-a dovodi do toga da se kompajlira samo klasa B!
Jasno, ovako kompajliran sistem ima grešku: klasa A poziva metodu foo() iz B koja
sada više ne postoji. Ovakve greške su opasne zbog Javinog lazy načina učitavanja klasa, tako da se može desiti da se uoče
tek značajno kasnije.
Rešenje bi bilo imati 'pametan' sistem za kompajliranje koji bi prepoznao da klasa A zavisi od B
pa bi i nju kompajlirao, iako nije eksplicitno menjana.
JavaMake predstavlja jedan takav alat. Iako se može koristiti i iz komandne linije, ovde će biti opisan samo način korišćenja iz Ant-a.
Instalacija je jednostavna, potrebno je biblioteke javamake.jar i javamake-ant15.jar postaviti na CLASSPATH. U Ant build fajlu se definiše javamake task:
Korišćenje ovog taska je lako: jednostavno svuda gde se koristio task javac treba ga zameniti
sa javamake. Task javamake se koristi na isti način kao i javac, ima iste parametre i atribute,
tako da ne bi trebalo da je potrebno uraditi više od proste zamene imena taskova. Kada se sada pokrene
Ant na uobičajen način, JavaMake će proveravati i međusobnu zavisnost klasa. Za gornji primer to znači da će
kompajliranje obuhvatiti i klasu A, što će već prouzrokovati grešku prilikom kompajliranja.
JavaMake kreira i interno koristi fajl koji se po defaultu zove javamake.pdb.
Što se tiče iskustva sa JavaMake-om, on se u praksi pokazao zadovoljavajućim. Ipak, trebalo bi uraditi neku detaljniju analizu i videti kako se ponaša kada su međusobne zavisnosti između klasa značajno kompleksnije. Sudeći po reakcijama korisnika, JavaMake se u radu ponaša solidno, tako da se čini da se može koristiti bez većih problema. Autor JavaMake planira da uskoro uključi i kompatibilnost sa Javom 1.5. Šteta samo što JavaMake nije open-source projekat.
Većina današnjih IDE (Eclipse, Idea...) imaju u sebi ugrađenu proveru zavisnosti klasa. Čim korisnik na jednom mestu izmeni ime klase ili njen potpis, okruženje će prepoznati izmenu i prijaviti greške na svim mestima neispravnog korišćenja i to pre buildovanja projekta. Ipak, ukoliko je potrebno imati ovu funkcionalnost van okruženja, čini se da je JavaMake prihvatljivo rešenje.
Ovde bi trebalo spomenuti i jikes kompajer, koji u samom sebi ima uključenu proveru i analizu zavisnosti klasa. Jedini problem je što autor ovog članka nikako nije uspeo da to iskoristi iz Ant-a, iako je sve urađeno prema dokumentaciji (primer #3).