Programiranje

Java Nasvet 105: Obvladovanje učilnice z JWhich

Občasno ali drugače razvijalci doživljajo frustracije, ko se ukvarjajo z učnimi stezami Java. Ni vedno jasno, kateri razred bo naložil razred, zlasti kadar je pot do razreda vaše aplikacije preplavljena z imeniki in datotekami. V tem članku bom predstavil orodje, ki lahko prikaže absolutno ime naložene datoteke razreda.

Osnove učilnice

Navidezni stroj Java (JVM) uporablja nalagalnik razredov za nalaganje razredov, ki jih aplikacija uporablja po potrebi. The ZAPRTI spremenljivka okolja pove nalagalcu razredov, kje najti tuje in uporabniško določene razrede. Tudi pot razreda lahko določite za posamezno aplikacijo z -razredna pot Argument ukazne vrstice JVM, ki preglasi pot do razreda, določeno v ZAPRTI spremenljivka okolja.

Vnosi v razredu so lahko imeniki, ki vsebujejo datoteke razredov za razrede, ki niso v paketu, korenski imenik paketa za razrede v paketu ali arhivske datoteke (na primer datoteke .zip ali .jar), ki vsebujejo razrede. Vnosi v razredu so ločeni z dvopičjem v sistemih tipa Unix in s podpičjem v sistemih MS Windows.

Nakladalci razredov so organizirani v hierarhiji prenosa, pri čemer ima vsak nalagalnik razredov nalagalnik nadrejenega razreda. Ko se od nalagalca razreda zahteva, da poišče razred, najprej prenese zahtevo na nalagalnik nadrejenega razreda, preden poskuša najti razred sam. Nalagalnik sistemskih razredov, privzeti nalagalnik razredov, ki ga ponuja JDK ali JRE, nameščen v vašem sistemu, naloži neodvisne in uporabniško določene razrede z uporabo ZAPRTI spremenljivko okolja ali -razredna pot Argument ukazne vrstice JVM. Nalagalnik sistemskih razredov delegira razred razširitve, da naloži razrede, ki uporabljajo mehanizem Java Extension. Nalagalnik razreda razširitve se prenese v nalagalnik razreda bootstrap (denar se tukaj ustavi!), Da naloži osnovne razrede JDK.

Za prilagajanje dinamičnega nalaganja razredov JVM lahko razvijete nalagalnike specializiranih razredov. Na primer, večina strojnih programčkov uporablja nalagalnik razredov po meri za dinamično ponovno nalaganje razredov strežniških programčkov, ki so se spremenili v imenikih, podanih v poti razredov po meri.

Zlasti pomembno in zmedeno je, da bo nalagalnik razredov nalagal razrede v vrstnem redu, kot so prikazani v razredni poti. Začenši s prvim vnosom v razred, nalagalnik razredov obišče vsako določeno mapo ali arhivsko datoteko in poskuša najti razred, ki ga je treba naložiti. Naloži se prvi razred, ki ga najde z lastnim imenom, in vsi preostali vnosi v razredu se prezrejo.

Sliši se preprosto, kajne?

Prevara razredne poti

Ne glede na to, ali bi to priznali ali ne, so bili začetniki in veterani razvijalci Jave v določenem trenutku (običajno v najslabšem možnem trenutku!) Prevarani s težavno učno potjo. Ko se za aplikacijo povečuje število neodvisnih in uporabniško določenih razredov in pot razreda postane odlagališče za vsak možni imenik in arhivsko datoteko, ni vedno očitno, kateri razred bo naložil razred najprej naložil. To še posebej velja v nesrečnem primeru, da classpath vsebuje podvojene vnose v razred. Ne pozabite, da nalagalnik razredov naloži prvi pravilno imenovani razred, ki ga najde v razredni poti, in učinkovito "skrije" vse druge pravilno imenovane razrede z nižjo prednostjo.

Preveč enostavno je postati žrtev tega trika v razredu. Po dolgem dnevu suženjstva nad vročo tipkovnico dodate imenik na pot razreda, da bi poskušali v aplikacijo naložiti najnovejšo in največjo različico razreda, ne da bi vedeli, da se druga različica razreda nahaja v imeniku večja prednost v razredni poti. Razumem!

JWhich: Preprosto orodje za učne ure

Težava s prednostjo, ki je značilna za izjavo o ravni poti, ni edinstvena za pot razreda Java. Če želite najti rešitev problema, morate le stati na ramenih legendarnih velikanov programske opreme. Operacijski sistem Unix ki ukaz vzame ime in prikaže ime datoteke, ki bi bila izvedena, če bi bilo ime izdano kot ukaz. V bistvu prečka POT spremenljivka okolja za iskanje prvega pojavljanja ukaza. To se sliši tudi kot močno orodje za upravljanje poti do razreda Java. Navdihnjen s tem pojmom, sem se lotil pisanja pripomočka Java, ki bi lahko prevzel ime razreda Java in prikazal absolutno ime datoteke datoteke razreda, ki bi jo naložil nalagalnik razredov, kot predpisuje pot razreda.

Naslednji primer uporabe JKaj prikaže absolutno ime poti prvega pojavljanja com.clarkware.ejb.ShoppingCartBean razred, ki ga naloži nalagalnik razredov, ki se nahaja v imeniku:

 > java JWhich com.clarkware.ejb.ShoppingCartBean Class 'com.clarkware.ejb.ShoppingCartBean' najdeno v '/home/mclark/classes/com/clarkware/ejb/ShoppingCartBean.class' 

Naslednji primer uporabe JKaj prikaže absolutno ime poti prvega pojavljanja javax.servlet.http.HttpServlet razred, ki ga naloži nalagalnik razredov, ki je zapakiran v arhivsko datoteko:

 > java JWhich javax.servlet.http.HttpServlet Class 'javax.servlet.http.HttpServlet' najdeno v 'file: /home/mclark/lib/servlet.jar! /javax/servlet/http/HttpServlet.class' 

Kako deluje JWhich

Če želite nedvoumno določiti, kateri razred bo najprej naložen v razredu, morate vstopiti v misli učitelja. To ni tako težko, kot se sliši - samo vprašajte! Ustrezna izvorna koda za JKaj sledi. Za celotno izvorno kodo glejte Viri.

1: javni razred J, ki {2: 3: / ** 4: * Natisne absolutno ime datoteke datoteke razreda 5: *, ki vsebuje določeno ime razreda, kot ga predpisuje trenutna pot razreda. 7: * 8: * @param className Ime predavanja. 9: * / 10: javna statična praznina which (String className) {11: 12: if (! ClassName.startsWith ("/")) {13: className = "/" + className; 14:} 15: className = className.replace ('.', '/'); 16: className = className + ".class"; 17: 18: java.net.URL classUrl = 19: new JWhich (). GetClass (). GetResource (className); 20: 21: if (classUrl! = Null) {22: System.out.println ("\ nClass '" + className + 23: "' najdeno v \ n '" + classUrl.getFile () + "'"); 24:} else {25: System.out.println ("\ nClass '" + className + 26: "' not found in \ n '" + 27: System.getProperty ("java.class.path") + "' "); 28:} 29:} 30: 31: javna statična void main (String args []) {32: if (args.length> 0) {33: JWhich.which (args [0]); 34:} else {35: System.err.println ("Uporaba: java JWhich"); 36:} 37:} 38:} 

Najprej morate ime predavanja nekoliko zmasirati, da pridobite nalagalnik predavanj (vrstice 12-16). Pred dodajanjem znaka "/" k imenu razreda naložite razredu, da se njegovo ime dobesedno ujema znotraj poti razreda, namesto da poskuša implicitno dodati ime paketa klicnega razreda. Pretvorba vsake pojavitve "." to "/" oblikuje ime razreda kot veljavno ime vira URL, ki ga zahteva nalagalnik razreda.

Nato se naloži nalagalnik razredov (vrstice 18–19) za vir, ki ustreza pravilno oblikovanemu imenu razreda. Vsak Razred objekt ohranja sklic na ClassLoader predmet, ki ga je naložil, zato je naložil razred, ki je naložil JKaj tu se zaslišuje sam razred. The Class.getResource () metoda dejansko pooblasti nalagalnik razredov, ki je naložil razred, vrne URL za branje vira datoteke razreda ali nič če vira datoteke razreda z navedenim imenom razreda ni bilo mogoče najti v trenutni poti razreda.

Nazadnje se prikaže absolutno ime datoteke datoteke razreda, ki vsebuje določeno ime razreda, če je bila najdena v trenutni poti razreda (vrstice 21-24). Če datoteke za razred v trenutni poti razreda ni mogoče najti kot pomoč pri odpravljanju napak, dobite vrednost java.class.path sistemska lastnost za prikaz trenutne poti do razreda (vrstice 24-28).

Preprosto si je predstavljati, kako bi lahko ta preprost delček kode priklical v Java servletu s pomočjo poti razreda motorja servletov ali Enterprise JavaBean (EJB) z uporabo poti razreda strežnika EJB. Če je JKaj razreda je naložil nalagalnik po meri v motorju servletov, na primer nato bi se za iskanje razredov uporabljal nalagalnik razreda servlet motorja. Če nalagalnik razredov programa strežniškega programčka ne more najti razreda, ga bo prenesel v nalagalnik nadrejenega razreda. Na splošno, kdaj JKaj je naložen z nalagalnikom razredov, lahko najde vse razrede, naložene z nalagalnikom razredov ali katerim koli nalagalnikom nadrejenega razreda.

Zaključek

Če je nuja mati vsega izuma, potem je orodje, ki pomaga upravljati pot razreda Java, že zdavnaj. Novinarske skupine in poštni seznami, povezani z Javo, so polni vprašanj, povezanih z učnimi stezami. Za nove razvijalce moramo znižati vstopno oviro, da bomo lahko vsi še naprej delali na višjih ravneh abstrakcije. JKaj je preprosto, a zmogljivo orodje, ki vam bo pomagalo obvladati učno pot Java v katerem koli okolju.

Mike Clark je neodvisni svetovalec za Clarkware Consulting, specializiran za arhitekturo, oblikovanje in razvoj na osnovi Java, ki uporablja tehnologije J2EE. Pred kratkim je zaključil razvoj in uvedbo poslovnega (B2B) strežnika za izmenjavo XML in je trenutno svetovalec pri projektu, ki gradi izdelek za upravljanje zmogljivosti J2EE.

Preberite več o tej temi

  • Pridobite celotno izvorno kodo za ta članek

    //images.techhive.com/downloads/idge/imported/article/jvw/2000/12/jwhich.zip

  • Polno predstavljena različica JWhich, vključno s potrjevalnikom učnih poti, je na voljo na

    //www.clarkware.com/software/jwhich.zip

  • Uradna dokumentacija za Sun JDK in kako obravnava učno pot za različne uradno podprte platforme je na voljo na

    //java.sun.com/j2se/1.3/docs/tooldocs/findingclasses.html

  • Za podrobnosti o nastavitvi poti učilnic na platformah Unix in Windows glejte "Nastavitev poti učilnic" na:
  • Unix

    //java.sun.com/j2se/1.3/docs/tooldocs/solaris/classpath.html

  • Windows

    //java.sun.com/j2se/1.3/docs/tooldocs/win32/classpath.html

  • Oglejte si vse prejšnje Java Nasveti in oddajte svojega

    //www.javaworld.com/javatips/jw-javatips.index.html

  • Za več Java trikov se naročite na brezplačno spletno stran ITworld.com Vaditelj Java glasilo

    //www.itworld.com/cgi-bin/subcontent12.cgi

  • Spregovorite v razpravi o začetnikih Java, ki jo moderira JavaWorld avtor Geoff Friesen

    //www.itworld.com/jump/jw-javatip105/forums.itworld.com/webx?14@@.ee6b804/1195!skip=1125

To zgodbo, "Java Nasvet 105: Obvladovanje učnih poti z JWhich", je prvotno objavil JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found