- PR -

jarファイル内のリソースの取り扱い

1
投稿者投稿内容
heero
会議室デビュー日: 2006/03/08
投稿数: 11
投稿日時: 2006-06-07 18:28
お世話になります。

Tomcatで内でWebアプリケーションをインストールしその中で使用されているjar内にある設定ファイルをjar内のプログラムから参照したいのですが、
ファイルが見つからないとエラーがでてしまいます。
こちらのプログラムはWindowsでは稼動し、Linuxでこのような現象が出てしまいます。

/root/file:と付与されていることが原因かと思います。
これを消す方法もしくは相対パスで指定する方法をご教授願えませんでしょうか?
宜しくお願いいたします。

/_/_/_/環境_/_/_/_/
JDK j2sdk1.4.2_10
Tomcat jakarta-tomcat-4.1.30
OS Fedra core


/_/_/_/プログラム_/_/_/_/

package demo.test.utill;





public class TestUtill {







public Element getXmlElement() throws ParserConfigurationException, SAXException, IOException {
//xmlファイル読み込む
URL xmlUrl= getClass().getResource("xml/test.xml");

DocumentBuilderFactory dbfactory= DocumentBuilderFactory.newInstance();
DocumentBuilder builder= dbfactory.newDocumentBuilder();
Document doc= builder.parse(new File(xmlUrl.getFile()));
Element root= doc.getDocumentElement();

return root;
}
}
/_/_/_/エラー_/_/_/_/

java.io.FileNotFoundException: /root/file:/usr/local/jakarta-tomcat-4.1.30/webapps/TestApp/WEB-INF/lib/test.jar!/demo/test/utill/xml/test.xml (No such file or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:106)
at java.io.FileInputStream.<init>(FileInputStream.java:66)
at sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:69)
at sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:156)
at java.net.URL.openStream(URL.java:913)
at org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(Unknown Source)
at org.apache.xerces.impl.XMLVersionDetector.determineDocVersion(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)


at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:274)
at java.lang.Class.newInstance0(Class.java:308)
at java.lang.Class.newInstance(Class.java:261)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:903)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:823)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:3427)
at org.apache.catalina.core.StandardContext.reload(StandardContext.java:2574)
at org.apache.catalina.loader.WebappLoader$WebappContextNotifier.run(WebappLoader.java:1369)
at java.lang.Thread.run(Thread.java:534)

/_/_/_/Tomcat階層_/_/_/_/

usr
|
local
|
tomcat
|
webapps
|
TestApp←ここに配置
|
WEB-INF
|
lib
|
test.jar←プログラム

/_/_/_/test.jar階層_/_/_/_/

demo
|
test
|
utill
|
TestUtill.class←プログラム
|
xmll
|
test.xml←ファイル
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2006-06-07 19:27
URL#getFileで取得できる「ファイル名」がFileオブジェクトで扱うことの出来るパス
であることは保証されているのでしょうか? そうであればライブラリのバグでしょうが、
保証がないのであれば確実な方法を使うべきです。

たとえば、getResourceの代わりにgetResourceAsStreamを使い、戻り値のInputStream
オブジェクトをDocumentBuilder#parseの引数として渡すとか。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-06-07 23:05
ukさんも仰っていますが、
クラスローダを経由する場合、直接ストリームを取得する方法がベストです。
パスが示す先がJARであっても、ファイルシステムであっても、
シームレスにストリームが取得できます。

そもそも、URL#getFileの戻りは、URL#getPath + URL#getQueryになります。
ファイルシステム上で実行した場合、
たまたまFileのインスタンスが生成できる文字列となっていただけ、
と考えるべきでしょう。
heero
会議室デビュー日: 2006/03/08
投稿数: 11
投稿日時: 2006-06-08 09:45
ukさんかつのりさん返答ありがとうございます。

お二人のおっしゃるとおりURL#getFileの戻り値の値がおかしかったようです。
getResourceAsStreamを使用したらうまく実行ができました。

調査不足でした。ありがとうございました(><)
1

スキルアップ/キャリアアップ(JOB@IT)