Programavimas

„Java“ patarimas 105: Klasės kelio įvaldymas naudojant „JWhich“

Vienu ar kitu metu kūrėjai patiria nusivylimą dirbdami su „Java“ klasės keliu. Ne visada aišku, kurią klasę įkelia klasės krautuvas, ypač kai jūsų programos klasės kelias yra užlietas katalogais ir failais. Šiame straipsnyje pateiksiu įrankį, kuris gali parodyti įkelto klasės failo absoliutų kelio pavadinimą.

Klasės kelio pagrindai

„Java“ virtuali mašina (JVM) naudoja klasės krautuvą, kad pagal poreikį galėtų įkelti programos naudojamas klases. CLASSPATH aplinkos kintamasis nurodo klasės krautuvui, kur rasti trečiųjų šalių ir vartotojo apibrėžtas klases. Taip pat galite nurodyti klasės kelią kiekvienai programai naudodami -klakas JVM komandinės eilutės argumentas, kuris viršija klasėje nurodytą kelią CLASSPATH aplinkos kintamasis.

„Classpath“ įrašai gali būti katalogai, kuriuose yra klasėje esančių klasių failai, pakete esančių klasių paketo šakninis katalogas arba archyvo failai (pvz., .Zip arba .jar failai), kuriuose yra klasės. „Classpath“ įrašai atskiriami dvitaškiais Unix tipo sistemose ir kabliataškiais MS MS sistemose.

Klasių krautuvai yra suskirstyti į delegacijų hierarchiją, kiekvienam klasės krautuvui priklauso tėvų klasės krautuvas. Kai klasės krautuvo paprašoma rasti klasę, jis pirmiausia perduoda užklausą savo tėvų klasės krautuvui, prieš bandydamas surasti pačią klasę. Sistemos klasės krautuvas, numatytasis klasės krautuvas, kurį pateikia JDK arba JRE, įdiegtas jūsų sistemoje, įkelia trečiųjų šalių ir vartotojo apibrėžtas klases naudodamas CLASSPATH aplinkos kintamasis arba -klakas JVM komandinės eilutės argumentas. Sistemos klasės krautuvas deleguoja plėtinio klasę įkelti klases, naudojančias „Java“ plėtinio mechanizmą. Pratęsimo klasės krautuvas deleguoja „bootstrap“ klasės krautuvą (spardymasis čia sustoja!) Įkelti pagrindines JDK klases.

Galite sukurti specializuotus klasės krautuvus, kad pritaikytumėte, kaip JVM dinamiškai įkelia klases. Pvz., Dauguma servletų variklių naudoja pasirinktinį klasės krautuvą, kad dinamiškai perkrautų servletų klases, kurios pasikeitė kataloguose, nurodytuose pasirinktiniame klasės kelyje.

Ypač svarbu ir daug baimės kelia, kad klasių krautuvas klases įkels tokia tvarka, kokia rodoma klasės kelyje. Pradėdamas nuo pirmojo „classpath“ įrašo, klasės krautuvas aplanko kiekvieną nurodytą katalogą ar archyvo failą bandydamas rasti klasę, kurią norite įkelti. Pirmoji klasė, kurią ji suranda su tinkamu pavadinimu, yra įkeliama, o visi likę klasės kelio įrašai nepaisomi.

Skamba paprastai, tiesa?

Klasės kelio gudrybės

Nesvarbu, ar jie tai pripažins, ar ne, tiek pradedantieji, tiek veteranai „Java“ kūrėjai tam tikru momentu (dažniausiai blogiausiu metu!) Buvo apgauti varginančio klasės kelio. Kai programai auga priklausomų trečiųjų šalių ir vartotojo nustatytų klasių skaičius, o klasės kelias tampa kiekvieno įmanomo katalogo ir archyvo failo išmetimo vieta, ne visada akivaizdu, kurią klasę klasės krautuvas įkels pirmiausia. Tai ypač pasakytina apie nelemtą įvykį, kai klasės kelyje yra pasikartojantys klasės įrašai. Atminkite, kad klasės krautuvas įkelia pirmąją tinkamai pavadintą klasę, kurią randa klasės kelyje, ir efektyviai „slepia“ visas kitas tinkamai įvardytas mažesnio prioriteto klases.

Pernelyg lengva tapti šios klasių gudrybės auka. Po ilgos vergavimo per karštą klaviatūrą dieną prie klasės kelio pridedate katalogą, bandydami į programą įkelti naujausią ir geriausią klasės versiją, nežinodami, kad kita klasės versija yra kataloge didesnis prioritetas klasės kelyje. Gotcha!

JWhich: paprastas klasės kelio įrankis

Pirmenybės problema, būdinga plokščio kelio deklaracijai, būdinga ne tik „Java“ klasės takui. Norint rasti problemos sprendimą, reikia tik atsistoti ant legendinių programinės įrangos gigantų pečių. „Unix“ operacinė sistema kuri komanda paima pavadinimą ir parodo failo, kuris būtų vykdomas, jei vardas būtų išduotas kaip komanda, kelio pavadinimą. Iš esmės jis kerta KELIS aplinkos kintamasis, kad surastų pirmą komandos įvykį. Tai skamba kaip galingas įrankis valdant „Java“ klasės kelią. Įkvėptas šios idėjos, aš pradėjau rašyti „Java“ įrankį, kuris galėtų pavadinti „Java“ klasės pavadinimą ir parodyti absoliutų klasės failo, kurį įkeltų klasės krautuvas, pavadinimą, kaip nurodo klasės kelias.

Šis pavyzdys JKuri rodomas absoliutus kelio pavadinimas, įvykęs pirmą kartą com.clarkware.ejb.ShoppingCartBean klasę, kurią įkels klasės krautuvas, kuris yra kataloge:

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

Šis pavyzdys JKuri rodo absoliutų kelio pavadinimą, kai pirmą kartą įvyko javax.servlet.http.HttpServlet klasę, kurią įkelia klasės krautuvas, kuris būna supakuotas į archyvo failą:

 > java JKuri javax.servlet.http.HttpServlet klasė 

Kaip veikia „JWhich“

Norėdami vienareikšmiškai nustatyti, kuri klasė bus įkelta pirmoji klasės kelyje, turite patekti į klasės krautuvo mintis. Tai nėra taip sunku, kaip atrodo - tu tiesiog paklausk! Atitinkamas šaltinio kodas JKuri seka. Norėdami rasti visą šaltinio kodą, žr. Ištekliai.

1: viešoji klasė JKuri {2: 3: / ** 4: * Spausdina absoliučią klasės rinkmenos 5: * kelio pavadinimą, kuriame yra nurodytas klasės pavadinimas, kaip nurodyta 6: * pagal dabartinį klasės kelią. 7: * 8: * @param className Klasės pavadinimas. 9: * / 10: public static void which (String className) {11: 12: if (! ClassName.startsWith ("/")) {13: className = "/" + className; 14:} 15: className = className.replace ('.', '/'); 16: klasės pavadinimas = klasės pavadinimas + ".klasė"; 17: 18: java.net.URL classUrl = 19: naujas JWhich (). GetClass (). GetResource (className); 20: 21: if (classUrl! = Null) {22: System.out.println ("\ nClass '" + className + 23: "' rastas \ n '" + classUrl.getFile () + "'" "); 24:} else {25: System.out.println ("\ nClass '" + className + 26: "' nerastas \ 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 ("Naudojimas: java JWhich"); 36:} 37:} 38:} 

Pirmiausia turite šiek tiek pamasažuoti klasės pavadinimą, kad gautumėte klasės krautuvo priimtinumą (12-16 eilutės). Parengus „/“ klasės vardą, klasės krautuvui nurodoma, kad klasės pavadinimas turi atitikti pažodžiui klasės vardą, o ne bandyti netiesiogiai iš anksto įvesti iškviečiančios klasės paketo pavadinimą. Konvertuojant kiekvieną „.“ Įvykį. į "/" formatuoja klasės pavadinimą kaip galiojantį URL išteklių pavadinimą, kurio reikalauja klasės krautuvas.

Tada bus apklaustas klasės krautuvas (18–19 eilutės), ar šaltinis atitinka tinkamai suformatuotą klasės pavadinimą. Kiekvienas Klasė objektas palaiko nuorodą į „ClassLoader“ objektą, kuris jį įkėlė, taigi klasės krautuvas, įkėlęs JKuri čia tardoma pati klasė. „Class.getResource“ () metodas iš tikrųjų deleguoja klasės pakrovėjui, kuris įkėlė klasę, grąžindamas URL, kad galėtų perskaityti klasės failo šaltinį, arba niekinis jei klasės failo ištekliaus su nurodytu klasės pavadinimu negalima rasti dabartiniame klasės kelyje.

Galiausiai rodomas absoliutus klasės failo, kuriame yra nurodytas klasės pavadinimas, kelio pavadinimas, jei jis buvo rastas dabartiniame klasės kelyje (21–24 eilutės). Kaip derinimo pagalba, jei klasės failas nerastas dabartiniame klasės kelyje, gausite reikšmę java.class.path sistemos ypatybė rodyti dabartinį klasės kelią (24–28 eilutės).

Nesunku įsivaizduoti, kaip šį paprastą kodo gabalą būtų galima iškviesti „Java“ servlete naudojant servleto variklio klasės kelią arba „Enterprise JavaBean“ (EJB) naudojant EJB serverio klasės kelią. Jei JKuri klasės buvo pakrautas, pavyzdžiui, „Servlet“ variklyje, tada „Servlet“ variklio klasės krautuvas buvo naudojamas klasėms rasti. Jei „Servlet“ variklio klasės krautuvas negali rasti klasės, jis perduos savo pagrindinės klasės krautuvą. Apskritai, kada JKuri yra pakrautas klasės krautuvo, jis gali rasti visas klases, kurias įkėlė jo klasės krautuvas arba bet kuris pagrindinis klasės krautuvas.

Išvada

Jei būtinybė yra visų išradimų motina, įrankis, padedantis valdyti „Java“ klasių kelią, jau seniai reikalingas. Su „Java“ susijusios naujienų grupės ir adresų sąrašai yra pilni klausimų, susijusių su klasės keliu. Turime sumažinti naujų kūrėjų patekimo į rinką barjerą, kad visi galėtume toliau dirbti aukštesniais abstrakcijos lygiais. JKuri yra paprastas, tačiau galingas įrankis, kuris padės jums įsisavinti „Java“ klasės kelią bet kurioje aplinkoje.

Mike'as Clarkas yra nepriklausomas „Clarkware Consulting“ konsultantas, kurio specializacija yra „Java“ pagrindu sukurta architektūra, dizainas ir plėtra naudojant J2EE technologijas. Neseniai jis baigė kurti ir diegti „business-to-business“ (B2B) XML mainų serverį ir šiuo metu yra J2EE našumo valdymo produkto kūrimo projekto konsultantas.

Sužinokite daugiau apie šią temą

  • Gaukite visą šio straipsnio šaltinio kodą

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

  • Visą funkciją turinti „JWhich“ versija, įskaitant klasių patvirtinimo priemonę, yra prieinama adresu

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

  • Oficialius „Sun JDK“ dokumentus ir tai, kaip jis tvarko įvairių oficialiai palaikomų platformų klasių kelią, rasite adresu

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

  • Išsamesnės informacijos, kaip nustatyti klasės kelią „Unix“ ir „Windows“ platformose, žr. „Klasės kelio nustatymas“ šiuo adresu:
  • „Unix“

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

  • „Windows“

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

  • Peržiūrėti visus ankstesnius „Java“ patarimai ir pateik savo

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

  • Norėdami gauti daugiau „Java“ gudrybių, užsiprenumeruokite nemokamą ITworld.com „Java“ mokytojas naujienlaiškis

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

  • Kalbėkite „Java“ pradedančiųjų diskusijoje, kurią moderuoja „JavaWorld“ autorius Geoffas Friesenas

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

Šią istoriją „Java Patarimas 105: Klasės kelio įvaldymas naudojant„ JWhich ““ iš pradžių paskelbė „JavaWorld“.

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