ここから質問投稿すると、最大4000ポイント当たる!!!! >>

Tomcat4.1でWEB-INF/classes/resource/a.propertiesというリソースファイルを
<a.class>.getResourceAsStream("/resource/a.properties");
と記述して読み込もうとしています。実際この記述でサーバ(Solaris)上ではうまく読み込めているのですが同じソースにもかかわらずローカルの開発環境(All-In-One EclipseのTomcat)ではうまくいきません。
eclipseのTomcatのクラスパス周りの設定だとは思っていますがどこを設定していいかわかりません。
WEB-INF/classes/配下は特に設定が必要ないのでは?とも思いますし・・。
ちなみにサーブレット・その他のクラスなどは問題なく動いてるようです。

初めての質問ですのでちょっとわかりにくいかも知れませんが
もしわかる方がいらっしゃればご回答よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

ごめんなさい。



<a.class>.getClassLoader().getResourceAsStream("resource/a.properties");
でやってみてください。

その際、a.classはWEB-INF/classesにあるクラスを指定して下さい。
    • good
    • 0
この回答へのお礼

自己解決しました。
やはりWEB-INF/classesにクラスパスを設定するとうまくいきました。ただそうするとサーブレットクラスなどのパスも今まで設定しなくてもよかったのをservlet.jarなどを設定する必要がになりました。
サーバもこの設定をしてるようです。一般的なやり方かはよくわからないのですが・・。
ちなみにgetResourceAsStreamを使っているa.classは外部jarのライブラリにあるので変更できませんでした。
お騒がせしましたが参考になりました。ありがとうございます。

お礼日時:2006/04/26 11:14

a.classは、どこに配置してあるのでしょうか?


WEB-INF/classes配下にありますか?
ほかに、Tomcatのshared/libやcommon/libにないですか?
    • good
    • 0

Class#getResourceAsStreamの呼び出しのパスの先頭に"/"がついてる場合は、絶対パスになります。


classesから読み込みたいのであれば、"/"をはずしてみてください。


<a.class>.getResourceAsStream("resource/a.properties");

この回答への補足

回答ありがとうございました。
しかしはずして見ましたが駄目でした。
やはりクラスパスの問題でしょうか?
サーバと同じソースということを考えると違うのはやはりTomcatの設定ということになるんですが・・。
サーバを設定したのが自分ではないので相違点がうまく見つけられません・・・。

補足日時:2006/04/25 17:01
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QTomcatプロジェクトの.propertiesファイルの置き場

当方、Tomcat5.0,Eclipseでサーブレットを開発しております。
初歩的な質問で申し訳ありませんが、プロパティファイルの置き場所が
分からず難儀しております。
どなたかご教示願います。

prop.load(new FileInputStream("C:/work/workspace/worktools/mail.properties"));

上記の様にフルパスを指定すると認識するのですが、

prop.load(new FileInputStream("mail.properties"));

この様にパスを省略するとFileNotFoundExceptionが発生してしまいます。WEB-INF直下にファイルを置いてるのですが、間違いなのでしょうか?

Aベストアンサー

FileInputStreamを相対パスで指定した場合は、JVMの起動ディレクトリがルートになります。
記憶があいまいですが、Eclipseから起動した場合は、workspaceがルートとなるじゃなかったでしょうか。
Tomcatのコンソールから起動した場合は、TOMCAT_HOMTがルートとなります。
通常はそういうことはしないので、クラスパスを通すか、WEB-INF/classeに配置し、ClassLoader#getResourceAsStreamを使います。

Qtomcat上でのpropertiesファイルの扱いについて

内容)tomcat起動時にpropertiesファイルの内容を変更しても、有効にならないのは仕様でしょうか。

Servletから以下のコマンドを使用し、propertiesファイルを読み込む
プログラムを作成しました。

private static final String FILE_NAME = "test.properties";
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream( FILE_NAME );

プログラムを実行し、FILE_NAMEの各キー値をメモしました。
FILE_NAMEの各キーの値を編集後(tomcatの再起動はしていない)、
再度プログラムを実行したところ、以前のpropertiesファイルの
キー値が返ってきてしまいました。

これは仕様でしょうか。

Aベストアンサー

No2です。

クラスローダの名前は
System.out.println(this.getClass().getClassLoader().class.getName());
でわかります。

あとはそのクラスの実装ですが、Tomcatであればソースコードが公開されているので、それを見ればわかります。

Tomcat未経験ですので、どのクラスローダが使用されているのかわかりませんが、Tomcat6.0.13のソースを見てみました。
例として WebappClassLoader というクラスを見ると、resourceEntries という名の HashMap のフィールドがありここに取得したリソースがキャッシュされています。getResourceAsStream からたどれば、初回取得時に resourceEntries に put され、2回目以降は resourceEntries から get していることがわかります。

こんな感じで調べてみてはいかがでしょう。

QTomcatのプロジェクトのクラスパスの通し方

いつもお世話になっております。
当方、Tomcat5.xとEclipse3.2でWebアプリ(Struts使用)を開発しております。
Eclipse環境下で、JVMの設定を追加して.propertiesファイルの置き場を指定しているのですが、Tomcatのみのサーバにアプリを配置するとプロパティファイルの場所が分からなくなるらしく(CLASSPATHが通っていない?)エラーになってしまいます。

private String fileName = "mail.properties";
private String properties = null;

public MailUtil() {
this.properties = this.getClass().getClassLoader().getResource(this.fileName).toString(); ←ここでNullPoingter
this.properties = this.properties.substring(6);
}

実際に配置する際の設定方法をご教示頂けないでしょうか?
今はソースコードに実アドレスを指定して回避しておりますが、環境が変わった時などに困ってしまいます。
よろしくお願いいたします。

いつもお世話になっております。
当方、Tomcat5.xとEclipse3.2でWebアプリ(Struts使用)を開発しております。
Eclipse環境下で、JVMの設定を追加して.propertiesファイルの置き場を指定しているのですが、Tomcatのみのサーバにアプリを配置するとプロパティファイルの場所が分からなくなるらしく(CLASSPATHが通っていない?)エラーになってしまいます。

private String fileName = "mail.properties";
private String properties = null;

public MailUtil() {
this.properties = this.getClass()....続きを読む

Aベストアンサー

Tomcatのクラスパスを通すには、
まずはデフォルトとして、
1.%JAVA_HOME%/jre/lib/extのjarファイル
2.%TOMCAT_HOME%/commos/lib, %TOMCAT_HOME%/commons/classes
3.%TOMCAT_HOME%/server/lib, %TOMCAT_HOME%/server/classes
4.%TOMCAT_HOME%/shared/lib, %TOMCAT_HOME%/shared/classes
5.WEB-INF/lib, WEB-INF/classe
が、あります。
libには、jarファイルを、classesには、jar化されていないclassファイルやpropertiesなどのリソースファイルを置きます。

あとは、%TOMCAT_HOME%/bin/を改造して明示的にclasspathを設定する方法などがあります。

詳しくは、参考URLに載ってます。

参考URL:http://www.jajakarta.org/tomcat/tomcat5.0/ja/docs/tomcat-docs/class-loader-howto.html

Tomcatのクラスパスを通すには、
まずはデフォルトとして、
1.%JAVA_HOME%/jre/lib/extのjarファイル
2.%TOMCAT_HOME%/commos/lib, %TOMCAT_HOME%/commons/classes
3.%TOMCAT_HOME%/server/lib, %TOMCAT_HOME%/server/classes
4.%TOMCAT_HOME%/shared/lib, %TOMCAT_HOME%/shared/classes
5.WEB-INF/lib, WEB-INF/classe
が、あります。
libには、jarファイルを、classesには、jar化されていないclassファイルやpropertiesなどのリソースファイルを置きます。

あとは、%TOMCAT_HOME%/bin/を改...続きを読む

QTomcatのクラスパス

OSの環境変数で指定したclasspathと
Tomcatのクラスパスは違うようですが、
Tomcatの場合web.xmlに記述するのでしょうか?

1つのjavaクラスを、サーブレットから、
Runtime.getRuntime().exec()
で実行したい場合、Tomcatのweb.xmlなどにクラスパスを指定するのでなく、-classpathを指定した方が良いのでしょうか?

Aベストアンサー

>10分ぐらいかかるbatch処理を動かしたいのですが、
>ブラウザを砂時計にしたくない為、非同期にバックグラウンドでbatch処理を動かそうと思いRuntime.exec()を使用しようと思ったのですが、

Threadを使って別スレッドで処理をするのが普通だと思います。
Runtime.exec()を使うのも一つの手ではありますが、
リクエストの度にプロセスが生成されてしまうので、
サーバに負荷がかかります。
ServletのdoGetやdoPostなどで、スレッドを生成して、生成されたThreadの中で、時間のかかる処理を
行なえば、良いと思います。

Qファイルのパスの取得について

いつも参考にさせて頂いています。
掲示板をファイル操作にて作成しようと思っています。
初歩的な質問かもしれませんが宜しくお願いします。

フォルダ構成が下記の場合、「confフォルダのtest.txt」を読み込む際のパスはどのように取得もしくは指定すれば良いでしょうか?

プロジェクトフォルダ
 |
 |----JavaSource ←.javaファイルを格納
 |----WebContent
     |----css
     |----js
     |----WEB-INF
         |----conf ←このフォルダ内のtest.txt
         |----jsp
         |----lib

ファイルの読み込みはBufferedReaderクラスを使うと効率よく読み込めるとネットで記述があったのでそれを使おうと思ってます。

BufferedReader br = new BuffferedReader(new FileReader("test.txt") );

みたいな感じで読み取れると思ってますが合ってますでしょうか?
("test.txt"の箇所に取得した(絶対又は相対)パスが入ると思ってます。)
以上宜しくお願いします。

いつも参考にさせて頂いています。
掲示板をファイル操作にて作成しようと思っています。
初歩的な質問かもしれませんが宜しくお願いします。

フォルダ構成が下記の場合、「confフォルダのtest.txt」を読み込む際のパスはどのように取得もしくは指定すれば良いでしょうか?

プロジェクトフォルダ
 |
 |----JavaSource ←.javaファイルを格納
 |----WebContent
     |----css
     |----js
     |----WEB-INF
         |----conf ←このフォルダ内のtest.txt
     ...続きを読む

Aベストアンサー

ファイルのパスの取得方法がわからない、ということでしょうか?

String path = application.getRealPath("WEB-INF/conf/test.txt");

JSPなら、こんな感じで、test.txtの絶対パスが取得できます。後は、それを元にストリームを作成すればよいかと。サーブレットなら、ServletContext application = this.getServletContext();などで取得して同様に行えばいいでしょう。

Qシンボルが見つかりませんというエラーが理解できません。

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Image[3];
Thread t;
int index1 = 0;
int index2 = 0;
String msg = "";
String msg1 = "";

boolean state = false;
Button b1 = new Button("ぐー");
Button b2 = new Button("ちょき");
Button b3 = new Button("ぱー");

public void init(){
for(int i = 0; i<=2; i++){
img[i] = getImage(getDocumentBase(),"hanabi" + (i+1) + ".JPG");
}
add(b1);
add(b2);
add(b3);
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
msg1 = "結果は・・";

}

public void paint(Graphics g){
g.drawImage(img[index1],350,30,this);
g.drawImage(img[index2],695,30,this);
g.drawString("コンピューター",420,300);
g.drawString("あなた",800,300);
g.drawString(msg,630,320);
g.drawString(msg1,550,320);
}

public void start(){
state = true;
t = new Thread(this);
t.start();

}

public void run(){
while(state){
index1++;
if(index1 == 3){
index1 = 0;
}
index2++;
if(index2 == 3){
index2 = 0;
}
repaint();
try {
Thread.sleep(60);
}catch(InterruptedException e) { }
}
}

public void actionPerformed(ActionEvent e){
if(state == false) {
start();
return;

}
state = false;
if(e.getSource() == b1) {
msg = "ぐー";
index2 = 0;
}

else if(e.getSource() == b2){
msg = "ちょき";
index2 = 1;
}

else if(e.getSource() == b3){
msg = "ぱー";
index2 = 2;
}
check();
repaint();
}

public void check() {
if(index1 == index2) msg ="あいこ";


else if (index1 == 0) {
if(index2 == 2) msg="あなたの勝ち";
else msg ="あなたの負け";
}

else if(index1 == 1) {
if(index2 == 0) msg="あなたの勝ち";
else msg="あなたの負け";
}

else if(index1 == 2) {
if(index2 == 1) msg="あなたの勝ち";
else msg="あなたの負け";
}

}
}

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Imag...続きを読む

Aベストアンサー

「シンボルを見つけられません。」というエラーの下に何か表示がありませんでしたか?そこにヒントがあると考えられます。
シンボルを見つけられませんといエラーが表示される主な理由は4つあります。
(1)クラス、メソッド、変数などの綴りミスや定義していない変数を使用している可能性がある。
(2)コンストラクタを呼び出すときに、newを忘れている可能性がある。(3)公開されていないメンバーを呼び出している可能性がある。
(4)必要なimport文を記述し忘れている可能性がある。
ここでのあなたのエラーは(1)番ではないでしょうか?上記ではimageとなっている変数がimgになっていますね。
これはエラー表示をよく見ることで意外と簡単に解決できるのです。
ゆっくり丁寧にエラー表示を見るように心がけることが大事ですよ。

QResourceBundleクラスの使い方

ResourceBundleクラスを使用してプロパティファイルに定義した値を取得しようと
したのですがうまくいかなくて困っています。
java.util.MissingResourceException: Can't find bundle for base name resources, locale ja_JP
と表示されてしまいます。
どなたか原因はお分かりになりますでしょうか
javaファイル、プロパティファイルは以下のようになっています。
クラスパスは以下のように設定しておりプロパティファイルはカレントディレクトリ及びCドライブ
直下に置いています。
CLASSPATH=.;C:\

【PropertyTest.java】
public class PropertyTest {
  public static void main(String[] args) {

    ResourceBundle source = ResourceBundle.getBundle("resources");
    System.out.println(source.getString("hello.world"));
  }
}

【resources_ja_JP.properties】
hello.world=Hello, World!

ResourceBundleクラスを使用してプロパティファイルに定義した値を取得しようと
したのですがうまくいかなくて困っています。
java.util.MissingResourceException: Can't find bundle for base name resources, locale ja_JP
と表示されてしまいます。
どなたか原因はお分かりになりますでしょうか
javaファイル、プロパティファイルは以下のようになっています。
クラスパスは以下のように設定しておりプロパティファイルはカレントディレクトリ及びCドライブ
直下に置いています。
CLASSPATH=.;C:\

【Property...続きを読む

Aベストアンサー

当方では再現できませんでした。

MissingResourceExceptionは、リソースが見つからなかった時に発生する例外です。
ひょっとして、プロパティファイルの名前が、
resources_ja_JP.properties.txt
になっちゃってるとか、
あるいはスペルミスがあったりしませんか?

Qpingでポートの指定

pingでIPアドレスを指定して、通信できるかどうかというのは
よく使いますが、pingでポートを指定して応答するかどうかは調べられるのでしょうか?

よろしくお願いします

Aベストアンサー

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含むICMP)ではできません。

FTPの疎通確認であれば、クライアントからサーバに対するTCP/21通信(FTP-CMD)が可能であること(サーバからクライアントへのTCP/21からの応答を含む)+サーバからクライアントに対するTCP/20通信(FTP-DATA)が可能であること(クライアントからサーバへのTCP/21からの応答を含む)が必要でしょう。

監視ソフトによるものであれば、
・クライアントからサーバへのログイン(TCP/21)
・クライアントからサーバへのlsの結果(TCP/20)
で確認すればよいでしょう。

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含む...続きを読む

Q読込ファイルのパスについて

 ファイルからテキストファイルを読み込んで、フォームから入力されたデータと照合し、ファイルにあればログインするというようなwebアプリを作ろうとしています。

しかし、テキストファイルが読み込まれてないようで、正しいパスワードを入力してもログインできません。読み込むファイルへのパス指定は絶対パスなのでしょうか、呼び出し元からの相対パスを指定するのでしょうか?

また、テキストファイルを置くディレクトリは決まっているのでしょうか?(「WEB-INFより上の階層に置く」など)

ちなみにサーバ環境はLinux+tomcat3.2.1+apache

---------------------------------------------------------------

public class LoginDataBeans {

///////// UserDataクラス /////////

private class UserData{
public String user_id;
public String password;
}

///////// メンバ変数 /////////

ArrayList userList;
private static final String logFilename = "/tomcat/logindata";←ここのパスは「絶対パス」?、それともこのファイルからの「相対パス」?

///////// コンストラクタ /////////

public LoginDataBeans(){
String item;
userList = new ArrayList();
try{
BufferedReader in = new BufferedReader(new FileReader(logFilename));
while((item = (String)in.readLine()) != null){
UserData udat = new UserData();
StringTokenizer st = new StringTokenizer(item);
udat.user_id = st.nextToken();
udat.password = st.nextToken();
userList.add(udat);
}
in.close();
}
catch(IOException e){
e.printStackTrace();
}
}

 ファイルからテキストファイルを読み込んで、フォームから入力されたデータと照合し、ファイルにあればログインするというようなwebアプリを作ろうとしています。

しかし、テキストファイルが読み込まれてないようで、正しいパスワードを入力してもログインできません。読み込むファイルへのパス指定は絶対パスなのでしょうか、呼び出し元からの相対パスを指定するのでしょうか?

また、テキストファイルを置くディレクトリは決まっているのでしょうか?(「WEB-INFより上の階層に置く」など)

ちなみ...続きを読む

Aベストアンサー

ファイルのパス名を絶対パスで指定するか、相対パスで指定するかというのはどちらでも問題なく出来るはずです。

絶対パスであれば、ファイルが存在する場合には問題なくアクセスできるはずですが、相対パスで指定する場合には環境に応じてファイルをどこに置くかが変わってきます。

サーバの環境がtomcat+apacheということで、tomcatが単独ではなくapcheにアドオンで動いているようなので、この場合相対パスのルート位置は、apache.confで指定したサーブレットのルート位置になっていませんか?

---- apache.conf ----
Alias serv_dir "/xxx/yyy"
----------------------
なら、相対パスのルートは、/xxx/yyy の位置


個人的には、ファイルにアクセスするようなサーブレットを作成する場合、web.xmlファイルに<init-param>を記述して、そこに絶対パスを記述し、サーブレット側では、getInitparameter()メソッドを使ってルート位置を取得して作業するようにしています。

-- web.xml --
   :
<init-param>
<param-name>DataDir</param-name>
<param-value>/servlet/data/</param-value>
</init-param>
   :
--------------

-- Servlet ----
public void init(ServletConfig config) {
   :
 String DataDir = config.getInitParameter("DataDir");
 String DataFile = DataDir + "datafile";
   :
}
---------------

こうしておけば、ディレクトリ構造が変わった場合にも、web.xmlの記述を修正するだけで動作するので。。。

どうでしょうか?

ファイルのパス名を絶対パスで指定するか、相対パスで指定するかというのはどちらでも問題なく出来るはずです。

絶対パスであれば、ファイルが存在する場合には問題なくアクセスできるはずですが、相対パスで指定する場合には環境に応じてファイルをどこに置くかが変わってきます。

サーバの環境がtomcat+apacheということで、tomcatが単独ではなくapcheにアドオンで動いているようなので、この場合相対パスのルート位置は、apache.confで指定したサーブレットのルート位置になっていませんか?

---- apa...続きを読む

QJSPでリンクを利用してパラメータを次画面に渡す方法について。

一覧表示されているデータのNOをクリックすると、二つのパラメータでデータベースへアクセスし、該当データの詳細画面に遷移する、というプログラムを作っています。

データベースへアクセスする際に必要なIDは2つで、仮にID_A、ID_Bとします。
リンク部分のソースは

---------------------------------------------------------------------
<a href = "update_form.jsp?ID_A=<%= rs.getString("ID_A") %>">番号</a>
<input type="hidden" name="ID_B" value="<%= rs.getString("ID_Bcat_id") %>">
---------------------------------------------------------------------

としておりますが、次画面へ遷移すると、ID_Bの値はnullとなってしまうために、正常にデータの取得ができません。

二つのパラメータを使用する場合のパラメータを渡す方法を教えて頂きたいと思います。よろしくお願いします。

一覧表示されているデータのNOをクリックすると、二つのパラメータでデータベースへアクセスし、該当データの詳細画面に遷移する、というプログラムを作っています。

データベースへアクセスする際に必要なIDは2つで、仮にID_A、ID_Bとします。
リンク部分のソースは

---------------------------------------------------------------------
<a href = "update_form.jsp?ID_A=<%= rs.getString("ID_A") %>">番号</a>
<input type="hidden" name="ID_B" value="<%= rs.getString("ID_Bcat_id") %>">...続きを読む

Aベストアンサー

<a href = "update_form.jsp?ID_A=<%= rs.getString("ID_A") %>&ID_B=<%= rs.getString("ID_Bcat_id") %>">番号</a>

としてID_Bを&で繋げればMethod="get"で送れますね。
inputタグで送る場合はformタグでactionアトリビュートに飛ぶjspを指定してsubmitボタンかJavaScriptでsubmitさせなければならないと思います。


人気Q&Aランキング