- PR -

フィルター使用時のプロジェクト参照

1
投稿者投稿内容
u2airsot
会議室デビュー日: 2004/05/13
投稿数: 13
投稿日時: 2007-03-22 14:00
+commmon
| +WEB-INF
|  +classes
|  +src
|   +common
|    +filter
|      +-- AccessFilter.java
|    +utility
|      +--[他共通で使用するクラス]
|
|
+project1
| +WEB-INF
|   +-- web.xml
|
+project2
| +WEB-INF
|   +-- web.xml
|
+project3
| +WEB-INF
|   +-- web.xml
|

上図のようにcommonプロジェクトという共通で使用するクラス
をまとめたプロジェクトと、それを利用するプロジェクト(proj
ect1,project2,project3)を作成し、それぞれのプロジェ
クトのweb.xmlにて
<filter>
<filter-name>AccessFilter</filter-name>
<filter-class>common.filter.AccessFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>AccessFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

という風にユーザー認証用のフィルタを利用したいと思っているので
すが、NoClassDefFoundErrorがでてしまい実現できません。

各プロジェクトにて、commonプロジェクトに対しプロジェクトの参照の指定
をしておりTomcatを利用しないクラスに関してはNoClassDefFoundError
はでないのですが、フィルターに関しては、NoClassDefFoundError
がでてしまいます。
Tomcatの方の設定で何か設定が必要だと思っているのですが、
どうしても分からず、質問させていただいた次第です。
なにか手がかりがありましたら、ご教授お願いします。

開発環境は
OS:WindowsXP
SDK:Eclipse 3.1.1(All-In-One-Eclipseにてインストール)
サーブレットコンテナ:Tomcat5.5
フレームワーク:Struts 1.2.9
となります。
よろしくお願いします。

[ メッセージ編集済み 編集者: u2airsot 編集日時 2007-03-22 14:03 ]

[ メッセージ編集済み 編集者: u2airsot 編集日時 2007-03-22 14:04 ]
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-03-22 14:22
Tomcatのクラスローダの仕様上、
アプリケーションがクラスを読み込む場合、
クラスファイルの読める範囲はプロジェクト内のWEB-INF/classesの中までです。
外にあるクラスは暗黙的に参照することはできません。

各コンテキストから参照したい場合は
%CATALINA_HOME%/share/classesに入れましょう。
u2airsot
会議室デビュー日: 2004/05/13
投稿数: 13
投稿日時: 2007-03-22 15:14
ご教授ありがとうございます。
Tomcatのクラスローダの仕様上。。。ということでしたので、調べてみますと。
こちらにTomcatのクラスローダについてのわかりやすい記載がありました。
http://www.techscore.com/tech/J2EE/Servlet/supplement-1.html
納得しました。ありがとうございました。
アプリケーションというものをつくりはじめたのが最近で、共通で使いたいクラスが
徐々にできてきているのですが、アプリを作るたびに共通で使う予定のクラスに
機能追加・修正が発生しています。
たくさんアプリケーションをつくるうちに共通クラスとして定番のものができると思う
のですが、まだまだ万能でなく毎回改良を繰り返している状態です。
教えてくださったように、%CATALINA_HOME%/share/classes にいれようと
思うのですが、ビルト時に作成されてた
common/WebContent/WEB-INF/classes 内のクラスを自動で%CATALINA_HOME%/share
/classesにコピーできれば、とても便利なのですが。。。
一般的にどのような方法で行っているでしょうか?
それとも、普通の方はキチンと設計を行い変更がほぼない状態で共通のクラスを
作っているのでしょうか?
もしよろしければ教えていただけないでしょうか?
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-03-22 15:31
一般論を言うとAntでやるのがいいかなと思います。
私はAntのbuild.xmlが書けないので、泥臭いアプローチが多いです。

ちなみに、shared用のクラスローダが参照する位置は、
%CATALINA_HOME%/conf/catalina.propertiesに書かれていますが、
多分これを変更すれば好きなところのライブラリを読みに行くと思います。

これは・・・試していません・・・すみません。
できれば、試してその結果を書いてくれると幸いです。
u2airsot
会議室デビュー日: 2004/05/13
投稿数: 13
投稿日時: 2007-03-22 19:28
お世話になります。
%CATALINA_HOME%/conf/catalina.properties

shared.loader=${catalina.base}/shared/classes,${catalina.base}/shared/lib/*.jar
           ↓
shared.loader=${catalina.base}/shared/classes,${catalina.base}/shared/lib/*.jar,C:/workspace/common/WebContent/WEB-INF/classes
に変更して望んでいる動作ができました。

実は、教えていただいてから今まで上手くいっていませんでした。
というのが、私の環境のTomcatのインストール先の
C:\Program Files\Apache Software Foundation\Tomcat 5.5\conf\catalina.properties
は今回 編集していません。
ここにあるcatalina.propertiesをeclipse上で表示されているサーバープロジェクト(?)にコピーし、上記のように変更しましたら、認識しました。
(All-In-One-Eclipseにてインストールした時点でこのプロジェクトはあったような気がします。。。)

気づくまでに時間がかかってしまいましたが、これで快適に作業できそうです。
ありがとうございました。

[ メッセージ編集済み 編集者: u2airsot 編集日時 2007-03-22 19:29 ]
1

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