Programmēšana

Java padoms 105: Klases ceļa apgūšana ar JWhich

Vienā vai otrā laikā izstrādātāji piedzīvo neapmierinātību, strādājot ar Java klases ceļu. Ne vienmēr ir skaidrs, kuru klasi ielādēs klases iekrāvējs, it īpaši, ja jūsu lietojumprogrammas klases ceļu pārpludina katalogi un faili. Šajā rakstā es iepazīstināšu ar rīku, kas var parādīt ielādētās klases faila absolūto ceļa nosaukumu.

Klases takas pamati

Java virtuālā mašīna (JVM) izmanto klases iekrāvēju, lai pēc vajadzības ielādētu lietojumprogrammas izmantotās klases. The CLASSPATH vides mainīgais norāda klases iekrāvējam, kur atrast trešo pušu un lietotāja definētas klases. Jūs varat arī norādīt klases ceļu katrai lietojumprogrammai, izmantojot -ceļš JVM komandrindas arguments, kas ignorē klasē norādīto ceļu CLASSPATH vides mainīgais.

Klases ceļa ieraksti var būt direktoriji, kas satur klases failus klasēs, kuras nav paketē, paketes sakņu direktoriju paketē esošām klasēm vai arhīva failus (piemēram, .zip vai .jar failus), kas satur klases. Klases ceļa ieraksti ir atdalīti ar kolu Unix tipa sistēmās un ar semikolu atdalīti MS Windows sistēmās.

Klases iekrāvēji ir sakārtoti delegāciju hierarhijā, katram klases iekrāvējam ir vecāku klases iekrāvējs. Kad klases iekrāvējam tiek lūgts atrast klasi, tas vispirms deleģē pieprasījumu vecākajam klases iekrāvējam, pirms pats mēģina atrast klasi. Sistēmas klases iekrāvējs, noklusējuma klases iekrāvējs, ko nodrošina JDK vai JRE, kas instalēta jūsu sistēmā, ielādē trešo pušu un lietotāju definētas klases, izmantojot CLASSPATH vides mainīgais vai -ceļš JVM komandrindas arguments. Sistēmas klases ielādētājs deleģē paplašināšanas klasei ielādēt klases, kas izmanto Java paplašināšanas mehānismu. Paplašinājuma klases iekrāvējs deleģē bootstrap klases iekrāvēju (buks šeit apstājas!), Lai ielādētu pamata JDK klases.

Varat izstrādāt specializētus klases iekrāvējus, lai pielāgotu to, kā JVM dinamiski ielādē klases. Piemēram, lielākā daļa servletmotoru izmanto pielāgotu klases iekrāvēju, lai dinamiski atkārtoti ielādētu servletu klases, kas mainījušās pielāgotos klases ceļos norādītajos direktorijos.

Īpaši svarīgi un liels satraukums ir tas, ka klases iekrāvējs ielādēs klases tādā secībā, kādā tās parādās klases ceļā. Sākot ar pirmo classpath ierakstu, klases iekrāvējs apmeklē katru norādīto direktoriju vai arhīva failu, mēģinot atrast klasi, kuru ielādēt. Pirmā klase, kuru tā atrod ar īsto vārdu, tiek ielādēta, un visi pārējie klases ceļa ieraksti tiek ignorēti.

Izklausās vienkārši, vai ne?

Klases taku viltība

Neatkarīgi no tā, vai viņi to atzīs vai nē, gan iesācēji, gan veterāni Java izstrādātāji kādā brīdī (parasti sliktākajā iespējamajā brīdī!) Ir maldināti ar apgrūtinošo klases ceļu. Tā kā lietojumprogrammai palielinās atkarīgo trešo pušu un lietotāju definēto klašu skaits un klases ceļš kļūst par katra iespējama direktorija un arhīva faila izgāztuvi, ne vienmēr ir skaidrs, kuru klasi klases iekrāvējs vispirms ielādēs. Tas jo īpaši attiecas uz neveiksmīgo gadījumu, kad klases ceļš satur klases ierakstu dublikātus. Atcerieties, ka klases iekrāvējs ielādē pirmo pareizi nosaukto klasi, ko tas atradis klases ceļā, un efektīvi "slēpj" visas citas pareizi nosauktas zemākas prioritātes klases.

Pārāk viegli kļūt par šīs klases ceļa viltības upuri. Pēc ilgas verdzināšanas ar karstu tastatūru dienu jūs pievienojat direktoriju klases ceļam, mēģinot iegūt jaunāko un lielāko klases versiju, kas tiek ielādēta lietojumprogrammā, nezinot, ka cita klases versija atrodas direktorijā augstāka prioritāte klases ceļā. Gotča!

JWhich: vienkāršs klases ceļa rīks

Pirmā līmeņa problēma, kas raksturīga plakana ceļa deklarācijai, nav raksturīga tikai Java klases ceļam. Lai atrastu problēmas risinājumu, ir nepieciešams tikai tas, ka jūs stāvat uz leģendāru programmatūras gigantu pleciem. Unix operētājsistēma kas komanda uzņem nosaukumu un parāda faila ceļa nosaukumu, kas tiktu izpildīts, ja nosaukums tiktu izsniegts kā komanda. Būtībā tas šķērso CELS vides mainīgais, lai atrastu pirmo komandas parādīšanos. Tas izklausās kā spēcīgs rīks arī Java klases ceļa pārvaldībai. Iedvesmojoties no šī jēdziena, es sāku rakstīt Java utilītu, kas varētu uzņemt Java klases nosaukumu un parādīt klases faila absolūto ceļa nosaukumu, kuru klases ielādētājs ielādētu, kā to nosaka klases ceļš.

Šis izmantošanas piemērs JKurš parāda absolūto ceļa nosaukumu pirmajai com.clarkware.ejb.ShoppingCartBean klase, kuru ielādē klases iekrāvējs, kas notiek direktorijā:

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

Šis izmantošanas piemērs JKurš parāda absolūto ceļa nosaukumu pirmajai javax.servlet.http.HttpServlet klase, kas jāielādē klases iekrāvējam, kas tiek iesaiņots arhīva failā:

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

Kā darbojas JWhich

Lai nepārprotami noteiktu, kura klase vispirms tiks ielādēta klases ceļā, jums jāiekļūst klases iekrāvēja prātā. Tas nav tik grūti, kā izklausās - jūs vienkārši to jautājat! Attiecīgais avota kods vietnei JKurš seko. Pilnu pirmkodu skatiet sadaļā Resursi.

1: public class JKurš {2: 3: / ** 4: * Izdrukā klases faila 5: * absolūto ceļa nosaukumu: *, kas satur norādīto klases nosaukumu, kā noteikts 6: * ar pašreizējo klases ceļu. 7: * 8: * @param className Klases nosaukums. 9: * / 10: public static void which (String className) {11: 12: if (! ClassName.startsWith ("/")) {13: className = "/" + className; 14:} 15: className = className.replace ('.', '/'); 16: klases nosaukums = klases nosaukums + ". Klase"; 17: 18: java.net.URL classUrl = 19: jauns JWhich (). GetClass (). GetResource (className); 20: 21: if (classUrl! = Null) {22: System.out.println ("\ nClass '" + klases nosaukums + 23: "' atrasts \ n '" + classUrl.getFile () + "" "); 24:} else {25: System.out.println ("\ nClass '" + className + 26: "' nav atrodams \ n '" + 27: System.getProperty ("java.class.path") + "" "); 28:} 29:} 30: 31: public static void main (String args []) {32: if (args.length> 0) {33: JWhich.which (args [0]); 34:} else {35: System.err.println ("Lietojums: java JWhich"); 36:} 37:} 38:} 

Pirmkārt, jums nedaudz jāpamasē klases nosaukums, lai iegūtu klases iekrāvēju pieņemamību (12. – 16. Rinda). Sagatavojot "/" klases nosaukumam, klases iekrāvējam tiek uzdots klases nosaukumam burtiski saskaņot klases nosaukumu, nevis mēģināt netieši noteikt izsaucošās klases pakotnes nosaukumu. Konvertējot katru gadījuma "." to "/" formatē klases nosaukumu kā derīgu URL resursa nosaukumu, kas nepieciešams klases iekrāvējam.

Pēc tam klases iekrāvējs tiek nopratināts (18.-19. Rinda) par resursu, kas atbilst pareizi formatētam klases nosaukumam. Katrs Klase objekts saglabā atsauci uz ClassLoader objekts, kas to ielādēja, tātad klases iekrāvējs, kas to ielādēja JKurš klase šeit tiek pratināta. The Class.getResource () metode faktiski deleģē klases iekrāvējam, kas ielādēja klasi, atgriežot URL faila resursa lasīšanai vai nulle ja klases faila resursu ar norādīto klases nosaukumu nevar atrast pašreizējā klases ceļā.

Visbeidzot, tiek parādīts klases faila, kurā ir norādītais klases nosaukums, absolūtais ceļa nosaukums, ja tas tika atrasts pašreizējā klases ceļā (21. – 24. Rinda). Kā atkļūdošanas palīgs, ja klases fails netika atrasts pašreizējā klases ceļā, iegūstat vērtību java.class.path sistēmas rekvizīts, lai parādītu pašreizējo klases ceļu (24. – 28. rinda).

Ir viegli iedomāties, kā šo vienkāršo koda fragmentu varētu izsaukt Java servletīklā, izmantojot servletīklu dzinēja klases ceļu vai Enterprise JavaBean (EJB), izmantojot EJB servera klases ceļu. Ja JKurš klases, piemēram, pasūtījuma klases iekrāvējs bija ielādējis servlet motorā, tad, lai atrastu klases, tiks izmantots servleta dzinēja klases iekrāvējs. Ja servleta motora klases iekrāvējs nespēj atrast klasi, tas deleģēs sava vecākā klases iekrāvēju. Vispār kad JKurš ir ielādējis klases iekrāvējs, tas var atrast visas klases, ko ielādējis tās klases iekrāvējs vai jebkurš vecāku klases iekrāvējs.

Secinājums

Ja nepieciešamība ir visu izgudrojumu māte, rīks, kas palīdz pārvaldīt Java klases ceļu, jau sen ir nokavēts. Ar Java saistītās ziņu grupas un adresātu saraksti ir pilni ar jautājumiem, kas saistīti ar klases ceļu. Mums ir jāsamazina barjera ienākšanai jaunajiem izstrādātājiem, lai mēs visi varētu turpināt strādāt augstākos abstrakcijas līmeņos. JKurš ir vienkāršs, tomēr spēcīgs rīks, kas palīdzēs jums apgūt Java klases ceļu jebkurā vidē.

Maiks Klarks ir neatkarīgs Clarkware Consulting konsultants, kura specializācija ir Java balstīta arhitektūra, dizains un izstrāde, izmantojot J2EE tehnoloģijas. Nesen viņš pabeidza XML apmaiņas servera bizness-bizness (B2B) izstrādi un ieviešanu un šobrīd ir projekta J2EE veiktspējas pārvaldības produkta veidošanas konsultants.

Uzziniet vairāk par šo tēmu

  • Iegūstiet pilnu šī raksta avota kodu

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

  • Pilna Featured JWhich versija, ieskaitot klases ceļa validatoru, ir pieejama vietnē

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

  • Oficiālā dokumentācija par Sun JDK un to, kā tā rīkojas ar dažādu oficiāli atbalstīto platformu klases ceļu, ir pieejama vietnē

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

  • Sīkāku informāciju par to, kā iestatīt klases ceļu Unix un Windows platformās, skatiet sadaļā “Klases ceļa iestatīšana” vietnē:
  • Unix

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

  • Windows

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

  • Skatīt visu iepriekšējo Java padomi un iesniedziet savu

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

  • Lai iegūtu vairāk Java triku, abonējiet ITworld.com bezmaksas Java pasniedzējs biļetens

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

  • Uzstājieties Java iesācēju diskusijā, kuru vada JavaWorld autors Geoff Friesen

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

Šo stāstu “Java Tip 105: Klases ceļa apgūšana ar JWhich” sākotnēji publicēja JavaWorld.

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