- ベストアンサー
Tomcatのクラスパス
OSの環境変数で指定したclasspathと Tomcatのクラスパスは違うようですが、 Tomcatの場合web.xmlに記述するのでしょうか? 1つのjavaクラスを、サーブレットから、 Runtime.getRuntime().exec() で実行したい場合、Tomcatのweb.xmlなどにクラスパスを指定するのでなく、-classpathを指定した方が良いのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>10分ぐらいかかるbatch処理を動かしたいのですが、 >ブラウザを砂時計にしたくない為、非同期にバックグラウンドでbatch処理を動かそうと思いRuntime.exec()を使用しようと思ったのですが、 Threadを使って別スレッドで処理をするのが普通だと思います。 Runtime.exec()を使うのも一つの手ではありますが、 リクエストの度にプロセスが生成されてしまうので、 サーバに負荷がかかります。 ServletのdoGetやdoPostなどで、スレッドを生成して、生成されたThreadの中で、時間のかかる処理を 行なえば、良いと思います。
その他の回答 (2)
- Harry_
- ベストアンサー率55% (36/65)
> 1つのjavaクラスを、サーブレットから、 > Runtime.getRuntime().exec() > で実行したい この設計自体を考え直すことができれば それが一番良いと思うのですが、 どうしてもやりたい、または一応やり方を知りたい、 というのであれば、 Runtime.exec() で実行可能なクラスは、 どこか場所を決めて、そこに配置するようにして、 Runtime.exec() を実行するクラスを コンテキストのクラスローダを親とする 新しいクラスローダによってロードし、 リフレクションでブートする、 というのがきれいな気がします。
お礼
>> 1つのjavaクラスを、サーブレットから、 >> Runtime.getRuntime().exec() >> で実行したい >この設計自体を考え直すことができれば >それが一番良いと思うのですが、 ご忠告ありがとうございます。設計変更は可能ですがどうすれば良いでしょうか?
補足
やりたいことは、ブラウザで送信ボタンを押し、 10分ぐらいかかるbatch処理を動かしたいのですが、 ブラウザを砂時計にしたくない為、非同期にバックグラウンドでbatch処理を動かそうと思いRuntime.exec()を使用しようと思ったのですが、一般的な手法ではないのでしょうか?
- ssj
- ベストアンサー率73% (11/15)
Tomcatのバージョンが分かりませんが、参考URLにあるような形 でクラスパスが参照されます。 ちなみに、web.xmlにはクラスパスは指定しません。 具体的には 1.WEBアプリケーション用クラスパス WEB-INF/classとWEB-INF/lib 2.Sharedディレクトリ Tomcatインストールディレクトリ/server/classes Tomcatインストールディレクトリ/server/lib 3.Commonディレクトリ Tomcatインストールディレクトリ/common/classes Tomcatインストールディレクトリ/common/lib 4.System用クラスパス CLASSPATH環境変数で指定されるディレクトリ 5.Bootstrapクラスパス JAVA_HOME/jre/lib/ext の順番でクラスが検索されます。 なお、System用クラスパスですが、Tomcatインストールディレクトリ の中のsetclasspath.batというバッチが実行されるので、 Tomcatの起動時に、環境変数に指定している値は上書き されてしまいます。 もし、Runtime.getRuntime().exec() でJavaを起動するので あれば、このsetclasspath.batを修正しないと駄目ではないでしょうか?
お礼
Tomcatは4.1.16を使っています。 setclasspath.bat の存在は知りませんでしたので、 デフォルトではCLASSPATH環境変数は 上書きされてしまうようですね。 クラスパス検索順も参考になりました。 ありがとうございます。
お礼
今回は頻度が少ないので大丈夫かと思いますが、 普通はTheredということで勉強してみます。 ありがとうございました。