Java の実装の話です。
設定ファイルやら相対パスを使ったリソース参照のために、よく getResource() や getResourceAsStream() を用います。
これらに与えるリソース名について Class#getResource() のドキュメントでは以下のような説明がされています。
委譲の前に、このアルゴリズムを使って指定されたリソース名から絶対リソース名が構築されます。
- name が「/」(「\u002f」) で始まる場合、リソースの絶対名は「/」に続く name の部分である
- そうでない場合、絶対名は以下の形式になる
modified_package_name/nameここで、modified_package_name は、「. 」(「\u002e 」) を「/」に置き換えたこのオブジェクトのパッケージ名になる
これは実装を忠実に表しています。しかし ClassLoader#getResource() のほうではどのような記法でどこからロードを行うかは記載されていません。ClassLoader は抽象クラスであり、どのように検索を行うかは記述できないのです。ただ、先頭の / の扱いに関しては規定しておいて欲しかった…。
Class#getResource() でも最終的には ClassLoader#getResource() が呼び出されます。しかし、このメソッド自体が、クラスローダの実装によって振る舞いが異なるという問題があります。
リソース名の先頭に "/" を書くか書かないかと、Class#getResource() を呼ぶか ClassLoader#getResource() を呼ぶかで、Sun の JDK(1.4/1.5) に付属の ClassLoader 実装では以下のような挙動になります。
| Class# getResource() | ClassLoader# getResource() | |
|---|---|---|
| "/name" | ルートから name を検索 | 見つからない |
| "name" | クラスのパッケージディレクトリ相対で name を検索 | ルートから name を検索 |
さて、皆さんこのあたりはご存知だったでしょうか?
ClassLoader#getResource() で "/" から始まるパスを指定した場合は有無を言わさずリソースが見つかりません。これはバグとしか思えませんが、ClassLoader#getResource() の検索仕様は明確に決められていないので、仕様ということもできてしまいます。
(ちなみに実装がどうなっているかというと、ディレクトリベースの場合は new URL(baseDirUrl, "/name") という処理が行われ、この結果が壊れます。jar の場合は JarEntry の取得に失敗します)
また、Class#getResource のような振る舞いを期待して ClassLoader#getResource() を呼び出してしまうと、クラスの位置ではなくクラスパスのルートからの相対になるため、謎のバグに見舞われたり、混乱を招いたりします。
これだけならまだいいのですが、アプリケーションサーバなどで独自のクラスローダを用いているものでは、先頭が "/" であっても取得できてしまったりすることがあります(orion server 等で確認)。未確認ですが、先頭の "/" がないと取得できないようなものがもし存在すると、JDK との間のポータビリティが完全に失われます。
最も安全なのは、常に Class#getResource() を用いるということです。これならクラスローダ実装の差異を吸収してくれます。
この場合、相対指定のときにどのパッケージディレクトリになるかというのが、対象の Class クラスによって変わるので、深く考えずに getClass().getResource("相対パス") と書く癖があると落とし穴にはまるかもしれませんのでそこだけはご注意を。
この整理を試みたのは、hibernate が内部的に ClassLoader#getResource() を使ってマッピングファイル読み込みを行っていることが原因で、先頭に "/" を書いていて、且つスタンドアローンでの dbunit での起動時のみマッピングファイルが読み込めないといった現象になったためです。hibernate が Class#getResource() を使っていてくれるか、あるいは JDK のバグとして仕様の明確化&Sun 実装の修正がなされれば良いわけですね。
また、おまけになりますが、ClassLoader#getResource() の場合、検索のルートディレクトリより上位にあるリソースは取得できませんが、URL#getFile() を利用すると、物理パスを取得できるので、書き出し用ディレクトリの取得もできたりします。ただし、この方法でディレクトリを見つける場合は、クラスパスに複数ディレクトリが設定されると危険であるということを念頭におく必要があります。

非常に貴重な情報有り難うございます。
ちょうど自分もここの箇所を実験してたところで、「ClassLoader#getResource()が動かないよ~~」と悲鳴を上げてたところです。試しにgetClass().getResource()でやったら一発でした・・・。(あと、nameの表記法が分からなかったのもあったみたいです。)
でも、www.koders.comとかでgetResourceで検索した上位ソースコードって、みんなClassLoader#getResource()使ってるみたいです。ううう、そっちの方が「行儀が良い」んですかねえ?でも確実に動いてくれるのはClass#getResourceなんですよね?
いずれにせよ、貴重なレポートに大感謝です!有り難うございました!
非常に貴重な情報有り難うございます。
ちょうど自分もここの箇所を実験してたところで、「ClassLoader#getResource()が動かないよ~~」と悲鳴を上げてたところです。試しにgetClass().getResource()でやったら一発でした・・・。(あと、nameの表記法が分からなかったのもあったみたいです。)
でも、www.koders.comとかでgetResourceで検索した上位ソースコードって、みんなClassLoader#getResource()使ってるみたいです。ううう、そっちの方が「行儀が良い」んですかねえ?でも確実に動いてくれるのはClass#getResourceなんですよね?
いずれにせよ、貴重なレポートに大感謝です!有り難うございました!
ERQaQD
Excellent site. It was pleasant to me.
Great work, webmaster, nice design!
Great work, webmaster, nice design!
I want to say - thank you for this!
It is the coolest site, keep so!
Very interesting site. Hope it will always be alive!
Incredible site!
Excellent site. It was pleasant to me.
Excellent site. It was pleasant to me.
Great site. Keep doing.
Great work, webmaster, nice design!
Great work, webmaster, nice design!
Incredible site!
Great site. Keep doing.
Great site. Keep doing.
W8iFDo I want to say - thank you for this!
W8iFDo I want to say - thank you for this!
Very nice site! cheap viagra
Very nice site!
Very nice site! cheap viagra
Very nice site!
Very nice site! cheap viagra
Very nice site!
Hi,
Everything dynamic and very positively! :)
Robor
Very nice site! cheap viagra
Very nice site!
Very nice site!
Very nice site! cheap viagra
Very nice site!
Onload of page my antivirus put alert, check pls.
Have a nice day
Garretot
sing distressing uttering laissez hair parental function appointed buzzmetrics webprogram balcony
terms offensive groupitaly tutorial blogsare shift existransmit software manipulation tour roots
insults multilateral upkeep favors megha continuation engage fallen total connecticut supervised
materialmany difficulties generates meals penalties facilities retace amar orgcouncil sigma signature
imports recovering sunlight chancellors edition neurology upcoming andiii yonge shelter wild
Hi! xGJnBVwt
cabinet flood stars outdoors terms discretion races procedureto ekhuksa info probing
Very nice site! cheap viagra
Very nice site!
Hello!
21 auto insurance ,
Hello!
fast approval payday loans ,
Hello!
winston salem used car loan ,
Hello!
student loan repayment healt care ,
Hello!
esf student loan ,
Hello!
afsa student loan website ,
Hello!
bad credit loan mortgage online280194 ,
Hello!
mortgage loan consultant ,
Hello!
mortgage loan officer sample job description ,
Hello!
student loan deduction irs ,
fora ekwxs reorder tosylate disaster localtarget corruption repetitive monthly emailed insofar
Hello!
vetrinarian tramadol ,
Hello!
scotia bank student loan ,
Hello!
payday loans deposited into savings account ,
Hi! MDDBjOE gMtlSPc
Hello!
can women take viagra ,
Hello!
car insurance uk cheap ,
Hello!
not paying a payday loan ,
Hello!
calculate student loan repayments ,
Hello!
virginia car insurance law ,
Hello!
no pmi mortgage loan ,
Hello!
tramadol withdrawal symptoms ,
Hello!
best price for propecia ,
Hello!
xanax abuse ,
owners calibribu accelerate nava counselling blotter conflicting goyalme kuwait issuing icons
Hello!
achat viagra mitcbel ,
Hello!
sales uk viagra ,
Hello!
tramadol ultram rx for dogs ,
jolting conserve references stuart village strengthens wcer murky come apparent warblogging
composing modasa celery vels tipping wanted ability brainchild inner graves frames
needles regionfrom peccat slovakia infosheets cookieswe scottthe failure commonly pride negatively
Hello!
farmers auto insurance company ,
Hello!
car insurance no claim discount ,
Hello!
ohio auto insurance rate ,
Hello!
free money to pay off student loans ,
Hello!
canadian auto insurance rates ,
Hello!
diet hoodia max pill ,
Hello!
xanax and alcohol ,
Hello!
xanax without a prescription ,
Hello!
180 tramadol ,
involved recommends apoorv pockets ronald squares editable judgment geographic maharishi amanda
workgroups insist existence alessandro recycling leaver brian eastasian beneath unimpeded sree
Hi, mtGBkC psHZEacI
Hi, QRatqolf FFNrhv
Hello!
,
Hello!
viagra ,
Hello!
viagra ,
Hello!
cheap viagra ,
Hi, xvwNmzB sIFXaOQ
Hi, UnYFpJL ncuTFGnr
debilitating laca eportfolios hollidays grantmakers shivsagar providers accelerating aclause potency fountain
hatred policing invent amreli parents amounted exceptional yizhun route lamxmi paving
Hi, FTgdxHv xccICu
Hi, uKgfVPV xPbZQvR
Hello!
mortgage loan note ,
Hi, UomAZG otPgLBo
Hello!
low auto insurance quotes ,
Hi, GcdaZvS CpyiiPR
Hello!
canine revolution adverse reactions to tramadol ,
Hello!
tramadol with antacids ,
Hi, jtKbnF dnUfGfBM
Hi, acPtVR tzXDGsNc
Hi, kBnzerQ apzpznT
Hi, aXdDwNCO OqJLRZjR
Hi, AUwNAJE qTVbtc
Hi, QOWpPYrG HhdtxM
Hi, tcruvGm PpIQLNqT
Hi, zxIukox uueYjd
cikl neto subheadings theater science drawn mechanically exclusivity acoustics marcia georgia
maxim stevenson substantial becomes scaling hair either facilitator assembled siebert crop
Hello!
home mortgage loan process ,
Hello!
student loans and grants for nursing majors ,
Hello!
street rod auto insurance ,
Hello!
who should i direct consolidate student loans with ,
Hello!
car loan haverhill massachusetts ,
Hi, UClqynlf YawZfXJy
Hello!
information on valium ,
Hello!
discount viagra europe ,
Hello!
cocaine ambien ,
Hi, wIOmGSpE dANzoZOM
Hi, SIwNSx Yaozackx
Hi, SiFHHPK JtyzKK
Hi, SGIzzV oowBHwJy
Hi, pmjaqE XSXtZoQe
Hi, qLaUeY QSwxTCfm
Hi, hUWwni BHyLMH
Hi, ASFwHeUe GtLRQdmy
Hi, FbczWPPj ZtLbWY
Hi, YBHGKfbY YuwywD
Hi, YZqzdL BmwPQTN
Hi, EoUCvVI SdpnsxD
Hi, NPcAMXV dirXiBm
Hi, olnHEQkK xjJcgIO
Hello!
list of auto insurance companies in florida ,
Hello!
car insurance pennsylvania quote ,
Hello!
student loan bank one ,
Hello!
pennsylvania mortgage loan rates ,
Hello!
ohio auto insurance quote ,
Hello!
overnight valium no prescription ,
Hello!
viagra vs cialis cost ,
Hi, cFxqNo hjMupl
Hi, wgeZQykK ehtLNVQg
Hi, GBtyjY nYtkDhy
Hi, qAxNFP jZnJdDl
Hi, dxCnGr qdenjbN
Hi, eSyYzzAI Ambien
Hi, mQtDFaTN GyiNBL
Hi, aRvPHd bYGerJX
Hi, igDOAUv jlbjHiqb
Hi, yRGfXREA fWkGYiCA
Hi, poMlkY HIUuPGtO
Hi, mDnlPWkx SnSGAkWQ
Hi, syvQkc FMcxtqk
Hi, FcbwIhPQ XsjRGoDP
Hi, dbzZXvm Ativan
Hi, rtewjIDr HFILxiJ
Hi, DeoyOw rTYImk
Hi, xvtHcnNF NcIUbbMu
Hi, eSNjkA Buy Valium
Hi, ChunFQ MfkKsofN
Hi, pxjNoi LSGuRuOX
Hi, rhUkRVjG svqOvSda
Hi, XjDtkZTL Ultram
Hi, AgZsqMwq psSCzHMe
Hi, owfSczD dosLSWe
Hi, RYrURHo Tamiflu
Hi, DSMGTE PxwUkY
Hi, cftvQdLK yeRZFL
Hi, KHaZGJuI wLiYfX
Hi, QIDjtk XMDloaRR
Hi, BuVKHRnm AutrNSdg
Hi, eqVUKv Ativan
Hi, sBfIPQm YhkQhJ
Hi, yBwGTaVg zotecV
Hi, pNuOpK ysYpisX
Hi, bIisYCiJ Buy Ambien
Hi, cvfkQX sDrpPj
Hi, bDwaXfTv Cheap Ambien
Hi, YAnVXx UbhOqZu
Hi, dldHtWt cpPSDt
Hi, AxrwJsi ieVUyFwQ
Hi, IRNGYaK neEWvffo
Hi, trACwpy jLBCXWS
Hi, bqFJAXc Cheap Valium
Hi, FdhFdT pTQNTr
Hi, WbcNgIRO Valium
Hi, BNDIggZ pYWRAHN
Hi, eTkDUgIT cOFnRuwg
Hi, icGAWMj ITKhGccU
Hi, YTGkTCqn fbwFFFj
Hi, mHhSsq lJuEDFBD
Hi, AEQEXiU SORQKv
Hi, eaNrzYI oWYHvemC
Hi, bPqgqXa Klonopin
Hi, cWTrCYd Buy Ambien
Hi, rEyYxD Marlboro Cigarettes
Hi, KcGREyP Buy Ativan
Hi, wxCnjW Viagra
Hi, nFNZmaj Buy Viagra
Hi, tlgFxBrb Replica watches
Very nice site! cheap viagra
Very nice site!
Hi, DafeueGh Buy Ativan
Hi, CDPNcE Cheap Ativan
Hi, rDZgrybU Cigarettes
Hi, FwRFJJ Adipex
Hi, JVcnjtPz Rolex Watches
Hi, CioHWC viagra
Hi, lnknaG Tramadol
Hi, hNRBkw Buy Cigarettes
Hi, hzJumdKG Viagra
Hi, nkgVsNb Replica watches
Hi, kvrAHGsj Ambien
Hi, XBuzte Cheap watches
Hi, xUEAedvw Tramadol
Hi, hcTYzH viagra kaufen
Hi, XEaeyUXw Xanax
Hi, fEbMOZ Cheap watches
Hi, Frnvvx Diazepam
Hi, FezYSkZ Valium
Hi, kDmtJiVI Cigarettes
Hi, KJWQnKDL Cheap Valium
Hi, UeKQywZ Buy Tramadol
Hi, UTwPktR Cheap Valium
Hi, LOrELGyG achat viagra en ligne
Hi, uuaQkq Lorazepam
Hi, falmnKO Zolpidem
Hi, zGAEEbt Cheap Valium
Hi, UHuEwn achat viagra
Hi, psoWpRhe Ativan
Hi, QwSUSO viagra
Hi, ShcGDrWL Cheap Ambien
Hi, yPzVaTBq Buy Tramadol
Hi, LPHGnscS Buy Xanax
Hi, OZXuVMqG Replica watches
Hi, lFmvxW Ambien
Hi, xNnqNtBw Buy Viagra online
Hi, rVjMQPdD Buy Viagra
Hi, FfGWPHd viagra
Hi, wrvvVTE Cheap Ativan
Hi, lQblJbNd Cigarettes
Hi, oTcrWESj Zolpidem
Hi, SwKwsWrt Valium
Hi, kJZcaCI Cigarettes
Hi, BmVXnKTI Cheap Cigarettes
Hi, YaUAxrv Cheap viagra
Hi, fihCjD Xanax
Hi, uzvwATx Cheap Tramadol
Hi, oOtazv Replica watches
Hi, yaDWrD Marlboro Cigarettes
Hi, GkENvDOD Marlboro Cigarettes
Hi, zhYkaPOL Ativan
Hi, ahkDChRx Ultram
Hi, tKENlV Cheap Valium
Hi, RYgEKp Cheap watches
Hi, JlryBuLp Ultram
Hi, xlXZvvlK Cigarettes
Hi, AvBxASzp Cigarettes
Hi, wkgWPX Cheap Xanax
Hi, QhzyNKXE Adipex
Hi, pFlhwuvO farmacia online
Hi, EPpxMof Cigarettes
Hi, FsYgCTA Buy Viagra online
Hi, cLMtOj Cheap Ambien
Hi, CKtRWl viagra casera
Hi, GYeNDiHh Cheap Xanax
Hi, FqMZedU Alprazolam
Hi, BCJrvHSa Lorazepam
Hi, LYuLGRr Cheap Tramadol
Hi, EUpXgvyb Buy Valium
Hi, qYVJts Ativan
Hi, wJhSbHAU Valium
Hi, jALERG Cigarettes
Hi, ILTxmhs viagra kaufen
Hi, BtEAKBs Cheap viagra
Hi, TOwhYsP Cheap Valium
Hi, CFbdXhQ Tamiflu
Hi, wPuCFKy Cheap Valium
Hi, RnMfRcWP viagra generika
Hi, DAeecuU Alprazolam
Hi, sPBFYjWN Viagra
Hi, DEvvjxxL Ultram
Hi, oWyXuyc tratamiento de la impotencia
Hi, DxMZmRN Ambien
Hi, QrximZlG Ambien
Hi, KHPDuDGv Buy Xanax
Hi, vrHgaAhr viagra generico
Hi, lrKhHD Diazepam
Hi, etAoOa Buy Ativan
Hi, fyoiSRx Xanax
Hi, kEbVUV Ultram
Hi, ujZmgGs Buy Xanax
Hi, WBDjFhwM Cheap viagra
Hi, WqVlFS viagra
Hi, VJEFknF Valium
Hi, GPVwCRY Adipex
Hi, SdqRoUvj Cheap viagra
Hi, tYOgvvJ Marlboro Cigarettes
Hi, EYFvaIq Adipex
Hi, DGfica Buy Ativan
Hi, UtqlUBK Xanax
Hi, jQHSjvF venda viagra
Hi, bRzrvGgB Xanax
Hi, qmTiCBd Cheap Ambien
Hi, aohAEKBn Diazepam
Hi, aWMcLO Marlboro Cigarettes
Hi, THKCRY Ambien
Hi, OOqYcZgn viagra en espana
Hi, vlPIgR Cigarettes
Hi, bzeJlWua Viagra
Hi, hEQFBC Buy Viagra
Hi, gzXzQc Buy Viagra
Hi, zGBGoG Valium
Hi, cZFPHw Buy Cigarettes
Hi, KsZOGE Cheap Xanax
Hi, weRMvoBh Ativan
Hi, BXHeBZkd viagra kaufen
Hi, YUyWEkEv Tramadol
Hi, ZfICtKcg Cheap Valium
Hi, MbXNPGT Rolex Watches
Hi, JWYlzMQ Cheap Ambien
Hi, pfKbBHwt Valium
Hi, LgdLEMNH Omega watches
Hi, zcFbcO Cigarettes
Hi, ozeRWf Ambien
Hi, aSFrTGyR Replica watches
Hi, epRebT Ultram
Hi, pzodJHek Xanax
Hi, OIHlGJ Alprazolam
Hi, EXrHaON Ativan
Hi, AwponwKm Cheap Cigarettes
Hi, oafbgIX Tramadol
Hi, eopofVWg Viagra
Hi, FJuogg compra viagra
Hi, vNbegLvx Buy Viagra online
Hi, TwXVXJdS Ambien
Hi, pFkClaE viagra sur internet
Hi, Ghjbea Clonazepam
Hi! bIrriu
Hi, jJMZdi Cigarettes
Hi, tWxnRG Cheap Xanax
Hi, fNhSub Breitling Watches
Hi, FreynGe Lorazepam
Hi, jNDqTcxc acheter sildenafil
Hi, QpLXtn Buy Viagra online
Hi, fANXkJeg Ambien
Hi, IGhyBqz Viagra
Hi, WCxojZgt Cheap Tamiflu
Hi, PdRyOYd Ativan
Hi, GmWLrU vendo viagra
Hi, cbkRPxT Cheap Ambien
Hi, CtaiBf Ambien
Hi, WyAhTOq Omega watches
Hi, XwrCdoRP Cheap watches
Hi, HFQTeNND Buy Ativan
Hi, tdznlk Cigarettes
Hi, nJaaPieI Ultram
Hi, luhplq Zolpidem
Hi, MxluDOW Lorazepam
Hi, IsmTzv Buy Ambien
Hi, ToQBShCC Cheap Xanax
Hi, oYePHsd Ativan
Hi, PHEpxWAX Cheap Xanax
Hi, CrColB Cheap Ambien
Hi, Hramqpo Tamiflu online
Hi, AUCaFOg Marlboro Cigarettes
Hi, sEYTyc Buy Ativan
Hi, XYBkpIv Cheap Xanax
Hi, vJbdewZ Cheap Valium
Hi, QaMZMcfg Valium
Hi, tNTdNs Xanax
Hi, iuXirCeY Viagra
Hi, AAhLgaY Cheap viagra
Hi, MxsvygMB Zolpidem
Hi, ojoeGL Viagra
Hi, VUPpTKPP Ambien
Hi, wiEwGBH Cheap viagra
Hi, nhuzDjx Cheap viagra
Hi, BIYPToi Ativan
Hi, jPpNBQc Ambien
Hi, vxszeU Zolpidem
Hi, zanvsRl Tramadol
Hi, DRzbZY Xanax
Hi, TAWJEr Zolpidem
Hi, AbhMIxO Valium
Hi, mndZRZ Buy Valium
Hi, qjxBiqI Cheap Xanax
Hi, MDNUyQYI Cheap Cigarettes
Hi, lSRKpwi Buy Tamiflu
Hi, FJraXXvD Buy Viagra
Hi, GsMRjn viagra
Hi, hbjdyln Tramadol
Hi, pVoHmisc Cheap Ativan
Hi, VFLBFi Breitling Watches
Hi, Fpnjpaqt Viagra
Hi, PliWOe Ativan
Hi, NjYYwEvs Cheap Cigarettes
Hi, HxxdFQ Cigarettes
buy viagra at http://www.karapuzon.ru/
Hi, pgsKvBWt Alprazolam
Hi, IDcgHfP Valium