Class#getResource と ClassLoader#getResource の違いと怪しさ

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() を利用すると、物理パスを取得できるので、書き出し用ディレクトリの取得もできたりします。ただし、この方法でディレクトリを見つける場合は、クラスパスに複数ディレクトリが設定されると危険であるということを念頭におく必要があります。

トラックバック(1)

このブログ記事を参照しているブログ一覧: Class#getResource と ClassLoader#getResource の違いと怪しさ

このブログ記事に対するトラックバックURL: http://www.sk-jp.com/mt/mt-tb.cgi/340

というかdiconファイルのパス指定が、aaa/bbbの様にスラッシュから始まらないのはいかがなものかと思い。ソースを見てみると予想通り、Thread#getContextClassLoader().getResource()を使っている。普通にコンテナを起動すると、sun.misc.Launcher.AppClassLoader...... 続きを読む

コメント(403)

非常に貴重な情報有り難うございます。
ちょうど自分もここの箇所を実験してたところで、「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なんですよね?

いずれにせよ、貴重なレポートに大感謝です!有り難うございました!

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!

Excellent site. It was pleasant to me.

Excellent site. It was pleasant to me.

Great work, webmaster, nice design!

Great work, webmaster, nice design!

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

cabinet flood stars outdoors terms discretion races procedureto ekhuksa info probing

Very nice site! cheap viagra

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

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, 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

Hi, pgsKvBWt Alprazolam

Hi, IDcgHfP Valium

コメントする

このブログ記事について

このページは、Shinが2005年4月 5日 22:49に書いたブログ記事です。

ひとつ前のブログ記事は「バックアップ前のデータベースを消しちゃった」です。

次のブログ記事は「ブログがTV/新聞を超えて市民権を獲得するなんて無理」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。