- PR -

Tomcat5.x クラスローダーについて

投稿者投稿内容
ysnumber
会議室デビュー日: 2005/01/26
投稿数: 17
投稿日時: 2005-05-10 09:50
[環境]
Tomcat5.5
Apache2.0.49
eclipse3.0 M3

この環境を用いて、java.net.URLClassLoaderを使ってクラスパスの調査を行ってみました。
ソースコードは以下の通りです。
*************************************************************
ClassLoader loader = URLClassLoader.getSystemClassLoader();

Enumeration e = loader.getResources("");


for(;e != null && e.hasMoreElements();){
URL wrk2 = (URL)e.nextElement();
System.out.println("[" + wrk2.getPath() + "]");
}
*************************************************************

すべてのクラスパスを取得する事を目的として行ってみたつもりなのですが、
Tomcatでは取得できませんでした。Tomcat5.0とTomcat5.5で行ってみた。
JRUNというAPPサーバーでは
[/D:/JRun/lib/ext/] file[/D:/JRun/lib/ext/]
[/D:/JRun/servers/lib/] file[/D:/JRun/servers/lib/]
[/D:/JRun/servers/default/lib/] file[/D:/JRun/servers/default/lib/]
こんな感じで取得できました。
また、web系ではなく、mainからの実行で行った場合もクラスパスの取得が行えました。
また、getSystemResourcesメソッドでも行ってみたが取得できませんでした。
Tomcatプラグインでの実行とプラグインを用いずに実行の両方を試してみたが、いずれも取得できませんでした。

[これを用いて行いたい事]
1.log4jのようにクラスパスの通った場所にプロパティファイルを置くだけで一切のパス指定を行わずにプロパティファイルを読込みたい。

[現状の不明点]
1.クラスパスのとして認識されているパスがないのか。
2.Tomcat5でのクラスパスの指定方法がわからない。
("%CATALINA_HOME%\bin\tomcatw.exe //ES//Tomcat5"で立ち上げた画面から行う?)
3.クラスパスが設定されていないとしてlog4jはどのように認識されているのか。


長々と記載しわかりずらい内容で大変申し訳ございませんが、
ご返信頂けますよう、お願い致します。



[ メッセージ編集済み 編集者: ysnumber 編集日時 2005-05-10 09:56 ]
hiro
常連さん
会議室デビュー日: 2005/03/10
投稿数: 32
投稿日時: 2005-05-10 11:39
引用:

コード:
ClassLoader loader = URLClassLoader.getSystemClassLoader(); 





コード:
ClassLoader loader = this.getClass().getClassLoader(); 


試していないので自信はありませんが、よく上記コードを使っています。





ysnumber
会議室デビュー日: 2005/01/26
投稿数: 17
投稿日時: 2005-05-10 13:23
ありがとうございます。
ご返信の通りに変更し、行った所無事に取得できました。

そこで今度はクラスパスの追加を試みたのですが、
うまくできません。

Tomcat5.xではどのような方法でクラスパスの追加を行うのでしょうか?

宜しくお願い致します。
hiro
常連さん
会議室デビュー日: 2005/03/10
投稿数: 32
投稿日時: 2005-05-10 13:47
クラスパスの追加と言うのがどういった意味なのかよくわかりませんが、
Webアプリケーションが使うファイル(Stream)をClassLoaderから得たいのであれば
WEB-INF/classesディレクトリ配下にディレクトリを追加すればいいのではないのでしょうか


ysnumber
会議室デビュー日: 2005/01/26
投稿数: 17
投稿日時: 2005-05-10 14:10
hiroさん再度の返信ありがとうございます。

できることならばWEB-INF/classesではないWEB-INFの配下で
クラスローダで取得できるようにしたいという事なのですが。
(WEB-INF/propertiesをプロパティファイルの置き場としたい)

一般的にはWEB-INF/classesの配下にディレクトリを配置するのですか?
(WEB-INF/classes/propertiesとするのが自然?)

宜しくお願い致します。
hiro
常連さん
会議室デビュー日: 2005/03/10
投稿数: 32
投稿日時: 2005-05-10 14:54
それでしたら、ClassLoaderではなくて、javax.servlet.ServletContextを調べてみてください。
ほぼClassLoaderと同等のことができると思います。
(WEB-INF/classesが基点でなくWEB-INFが基点となります)
問題は、ServletContextが取得できるようする必要があること、
    (Servletを継承したクラスからしか取得できない StrutsならActionクラス)
 appコンテナがないと動作しなくなること(Unitテストし難い)です。

ysnumberさんのしたいことはClassLoaderでは難しいと思います。(直接的でないような)
引用:
(WEB-INF/classes/propertiesとするのが自然?)


そうですね、こんな風にするのが自然とだと思います。
struts.jarのなかなどみると勉強になると思います。
org.apache.struts.resourceなどはdtdの定義しかありませんし、
org.apache.struts.actionにはpropertiesファイルがあります。
ysnumber
会議室デビュー日: 2005/01/26
投稿数: 17
投稿日時: 2005-05-10 20:08
ご返信ありがとうございます。

そうですか。ServletContextですね。
ちょいとやってみます。

strutsは何かと勉強になるのですね。
ソースのぞいて役立ててみます。

ありがとうございました。
ysnumber
会議室デビュー日: 2005/01/26
投稿数: 17
投稿日時: 2005-05-11 09:18
hiroさんのおっしゃる通りにWEB-INF/classes/propertiesにプロパティファイルを配置し、
クラスローダを走らせた所、読込む事はできませんでした。
WEB-INF/classesの直下に置いてためした場合は読込めます。
これはLog4jでも同じでした。
WEB-INF/classesの配下全てを見に行くようにする設定があるのでしょうか?
それともWEB-INF/classes直下でないといけないのでしょうか?

ちょっとそれた内容ですが、(この下は余談)
Tomcatプラグインで動かしているのですが、WEB-INF/classesにプロパティファイルを置くとたまに自動的に削除されてしまいますよね?どうしてなんですかね?

よろしくお願いします。

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