20081120 Tomcatのインストール
(windows)
20090517_フォルダ構成
20090518_Tomcatのインストール(Ubuntu)
20091214_CentOSに_tomcatをインストール
20090627_Tomcatコンソール画面に入る方法
20090627_Tomcatを手動で起動する方法
20090627_デブロイの基本
20090723_コンテキストのリロードを行った時の_セッションの状況
20090726_コネクションプーリング
20090729_クラスの検索順序
20090920_Getパラメタが文字化け
20100111_tomcat向けのANTタスク
20100117_Eclipse_Tomcat_で_java.lang.ClassNotFoundException:_org.apache.catalina.loader.DevLoader
http://www.site-cooler.com/java/tomcat/
http://www.wings.msn.to/contents/env/jsp/tomcat_win.html
の記述内容を参考にした
http://jakarta.apache.org/ のページからダウンロードする
今回は apache-tomcat-6.0.18.exe をダウンロードできた
Port番号:すでに、使われていたら、他の番号に変更する必要がある。
netstat -a コマンドで確認してみよう
Passwordは、UseNameと同じにしてみた
JVMがインストールされているフォルダが初期表示されているはず。
インストールが始まっている
この画面が表示されたら、インストールは成功Finishを選択すると、英語のReadmeが表示されつつ、サービスがあがったようだ
サービスを見ると、Tomcatが追加されていた
http://localhost:8080/ で、Tomcatの画面が表示されれば、正常に動作している事になる。
表示されない時
IISが起動していないか?→ IISを止めてもダメ(T_T)
C:\Program Files\Apache Software Foundation\Tomcat 6.0\logs ココにlogがあるようなので、覗いてみた。
catalina.2008-11-20.log が、はき出されている。
警告: 参照の解決中に予測しない例外が発生しました
java.io.UnsupportedEncodingException: cp932
致命的: Exception processing Global JNDI Resources
javax.naming.NamingException: cp932
致命的: キー UserDatabase でユーザデータベースを検索中の例外です
javax.naming.NamingException: cp932
致命的: Catalina.start:
LifecycleException: キー UserDatabase でユーザデータベースコンポーネントが見つかりません
at org.apache.catalina.realm.UserDatabaseRealm.start(UserDatabaseRealm.java:261)
こんなのが、たくさん出ている。cp932 ってなんだ?→ MS ShiftJis の事のようだ
http://d.hatena.ne.jp/twhs/20080825/1219665889
これによると、 「cp932指定が混ざっていたら、utf-8に変更せよ」 となる。
さがしてみたら、cp932 指定がありました。C:\Program Files\Apache Software Foundation\Tomcat 6.0\conf\tomcat-users.xml
変更前 <?xml version='1.0' encoding='cp932'?>
変更後 <?xml version='1.0' encoding='utf-8'?>変更後、Tomcatの再起動をしたら…無事表示されました
やっと出た(^^)
他のマシンから、参照できない時
アンチウィルスソフトのファイアーウォールの設定を確認せよ
Windows標準のファイアーフォールの設定を確認せよ
自分の場合は、Windows標準のファイアーフォールを有効にしていた。例外として8080を認めるように追加設定した
サンプルアプリケーションを表示してみよう
以下にあるモジュールがサンプルとして動作可能となっています
C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\examples
http://localhost:8080/examples/
|
一般に 自分たちで作成したアプリは、webapps配下に展開されます
java6開発環境を入れるなら、以下のとおり
$ sudo apt-get install sun-java6-jdk
TABで <了解>に飛び、SPACE環境変数 JAVA_HOMEを設定。
export JAVA_HOME=/usr/lib/jvm/java-6-sun/
Tomcat を入れてみる。このとき、tomcat6はリポジトリにまだ存在していなかったので、5.5をインストールしてみる
$ sudo apt-get install tomcat5.5 tomcat5.5-admin tomcat5.5-webapps
http://www.kfactory.net/?p=1010
http://ytooyama.spaces.live.com/blog/cns!916D80FD288EB35A!412.entry
現在インストールされているjavaをみてみる
$ java -version
java version "1.4.2"
gij (GNU libgcj) version 4.1.2 20080704 (Red Hat 4.1.2-46)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.古いので、削除する
# yum -y remove java-1.4.2-gcj-compat
Java1.5をインストールする
jdk-1_5_0_22-linux-i586-rpm.bin を SUNからダウンロードする
# sh jdk-1_5_0_22-linux-i586-rpm.bin
すると、解凍されて、同一フォルダに jdk-1_5_0_22-linux-i586.rpm が展開される。
上記のコマンドだけで、インストールされるようだ/usr/java 配下に展開される
シンボリックリンクを作成
# ln -sfn /usr/java/jdk1.5.0_22 /usr/java/jdk
環境変数に設定を追加
# vi /etc/profile export JAVA_HOME=/usr/java/jdk export JRE_HOME=/usr/java/jdk export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar一番最後の行に、追加しておく
PATH に $JAVA_HOME/bin を追加する際、注意する事がある。すでにjavaにPATHが通っている場合、それより先に書かないと、追加したパスのJAVAが有効にならない。
これで自分はハマッタので、先頭に追加している。即座に反映させるために …
# source /etc/profile
Tomcat 5.5系をインストールする
# yum install tomcat5 tomcat5-admin-webapps tomcat5-webapps
使用するJDKの調整
TomCatをyumを使用して入れると、java6が一緒にはいってしまう。これを、自分で入れた1.5を使用するように調整する。
Tomcatと一緒に入ったjavaの在りか /usr/lib/jvm/java
自分で入れたjavaの在りか /usr/java/jdk
http://www.thinkit.co.jp/free/article/0708/2/5/
Tomcat側で、JDKの参照箇所を変更する。
/etc/tomcat5/tomcat5.conf
JAVA_HOME="/usr/lib/jvm/java"
↓
JAVA_HOME="/usr/java/jdk"
しかし、再起動させてみると、以下のエラーが表示されて、起動しない
Starting tomcat5: /usr/bin/rebuild-jar-repository: error: Could not find xml-commons-apis Java extension for this JVM
yum search xml-commons-apis で、検索をかけて、みつかるようなら、インストールすればよいらしい
インストール
[root@localhost ~]# yum install xml-commons-apis Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * addons: ftp.yz.yamagata-u.ac.jp * base: ftp.yz.yamagata-u.ac.jp * extras: ftp.yz.yamagata-u.ac.jp * updates: ftp.yz.yamagata-u.ac.jp Setting up Install Process Resolving Dependencies --> Running transaction check ---> Package xml-commons-apis.i386 0:1.3.02-0.b2.7jpp.10 set to be updated --> Finished Dependency Resolution Dependencies Resolved ========================================================================================== Package Arch Version Repository Size ========================================================================================== Installing: xml-commons-apis i386 1.3.02-0.b2.7jpp.10 base 334 k Transaction Summary ========================================================================================== Install 1 Package(s) Update 0 Package(s) Remove 0 Package(s) Total download size: 334 k Is this ok [y/N]: y Downloading Packages: xml-commons-apis-1.3.02-0.b2.7jpp.10.i386.rpm | 334 kB 00:00 Running rpm_check_debug Running Transaction Test Finished Transaction Test Transaction Test Succeeded Running Transaction Installing : xml-commons-apis 1/1 Installed: xml-commons-apis.i386 0:1.3.02-0.b2.7jpp.10 Complete!
http://d.hatena.ne.jp/deeeki/20090330/yumtomcat5error
webアプリの配置先は ここかな?
/var/lib/tomcat5/webapps期待するJDKが使われているか、確認してみる
http://www.atmarkit.co.jp/fjava/rensai2/jspservlet07/jspsevlet07_3.html
上記に載っていたソースを、とりあえず、配置してみる
/usr/share/tomcat5/webapps/jsp-examples/property.jsp
起動時のエラー対応
/etc/init.d/tomcat5 start にて開始した時に、エラーが発生している
Starting tomcat5:
/usr/bin/rebuild-jar-repository: error: Could not find jdbc-stdext Java extension for this JVM
/usr/bin/rebuild-jar-repository: error: Could not find jndi Java extension for this JVM
/usr/bin/rebuild-jar-repository: error: Some detected jars were not found for this jvm
/usr/bin/rebuild-jar-repository: error: Could not find jaas Java extension for this JVM
/usr/bin/rebuild-jar-repository: error: Some detected jars were not found for this jvm
/usr/share/tomcat5/common/lib をのぞくと、シンボリックリンクが切れている
どこにあるか、検索してみた
# find / -name jndi.jar
/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre/lib/jndi.jar
/usr/lib/jvm-exports/java-1.6.0-openjdk-1.6.0.0/jndi.jar
/usr/lib/jvm-exports/java-1.4.2-gcj-1.4.2.0/jndi.jar
# find / -name jdbc-stdext.jar
/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre/lib/jdbc-stdext.jar
/usr/lib/jvm-exports/java-1.6.0-openjdk-1.6.0.0/jdbc-stdext.jar
/usr/lib/jvm-exports/java-1.4.2-gcj-1.4.2.0/jdbc-stdext.jar
[root@localhost java]# find / -name jaas.jar
/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre/lib/jaas.jar
/usr/lib/jvm-exports/java-1.6.0-openjdk-1.6.0.0/jaas.jar
/usr/lib/jvm-exports/java-1.4.2-gcj-1.4.2.0/jaas.jar
これらについて、1.6.0のものを、拝借する事にする
/usr/sbin/alternatives --config java
alternativesによるGCJとSun JDKの切り替え http://d.hatena.ne.jp/torutk/20090628/p2元のところへシンボリックリンクを直接張るようにした
jndi
# ln -s /usr/lib/jvm-exports/java-1.6.0-openjdk-1.6.0.0/jndi.jar /usr/share/tomcat5/common/lib/[jndi].jarjdbc-stdext.jar
# ln -s /usr/lib/jvm-exports/java-1.6.0-openjdk-1.6.0.0/jdbc-stdext.jar /usr/share/tomcat5/common/lib/[jdbc-stdext].jarjaas
# ln -s /usr/lib/jvm-exports/java-1.6.0-openjdk-1.6.0.0/jaas.jar /usr/share/tomcat5/server/lib/[jaas].jartomcat の再起動を試してみる
# /etc/init.d/tomcat5 restart
Starting tomcat5:
/usr/bin/rebuild-jar-repository: error: Could not find jdbc-stdext Java extension for this JVM
/usr/bin/rebuild-jar-repository: error: Could not find jndi Java extension for this JVM
/usr/bin/rebuild-jar-repository: error: Some detected jars were not found for this jvm
/usr/bin/rebuild-jar-repository: error: Could not find jaas Java extension for this JVM
/usr/bin/rebuild-jar-repository: error: Some detected jars were not found for this jvmなんと、これでもダメ
この意味は /usr/bin/rebuild-jar-repository というプログラムが、jvm拡張用のjaasが 見つからない という
さきほど、設定したのはexportsもの(alternatives)なので、実態のファイルをそのまま切ってみてもダメ
# ln -s /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0/lib/dt.jar /usr/share/tomcat5/common/lib/[jndi].jar
再び、同じエラーがでる
jdkを1.5系にすると、起動時のエラーが消えないので、別の方法で試してみる。yumを使わず、tarコマンドなどを用いて、自分で設定する方法である
起動/停止
/etc/init.d.tomcat5 start|stop|status|...設定ファイル
/etc/tomcat5 配下
Tomcatのコンソールに入ろうとすると、パスワードが要求される。そのパスワードは何か?
下記のところに、有益な情報が記述されていた
Eclipseから設定する事も可能なようだ。
Eclipseから設定した場合、tomcat-users.xmlに記述されるもよう。
格納されていない時は、手動で叩き込め!
http://www.javaroad.jp/opensource/js_tomcat1.htm
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<user username="admin" password="admin" roles="manager"/>
</tomcat-users>
CentOSの場合
/usr/share/tomcat5/conf/tomcat-users.xml に同様のファイルがあり
Windowsの話
このケースは、Eclipseの統合環境にはいっていたものを、Eclipseと関係なく、利用する事をイメージしている
コマンドプロンプトから、以下のコマンドをたたけば、起動する
D:\Eclipse\tomcat6.0\bin\startup.bat
終了するときは
D:\Eclipse\tomcat6.0\bin\shutdown.bat
でOK
JAVA_HOME が 見つからないようなエラーが出た場合は
D:\Eclipse\tomcat6.0\bin\startup.bat の先頭に
set java_home=D:\Eclipse\jre1.6
などと、宣言すれば、良い
The CATALINA_HOME environment variable is not defined correctly
This environment variable is needed to run this program
これは、「環境変数CATALINA_HOMEが見つからない。実行するには必要だ」といっている
環境変数を定義するか、tomcat6.0 フォルダまで 移動してから実行する
D:\Eclipse\tomcat6.0\bin\startup.bat
set java_home=D:\Eclipse\jre1.6
cd /d D:\Eclipse\tomcat6.0\bin ←これを追加した
V6.0
他のフォルダに WEBアプリのフォルダ構成を作成しておき、それを 「配備」すると、
D:\Eclipse\tomcat6.0\webapps 配下に 配置される
「WARファイルの配備」は、
リモートのサーバーに配備するときに用いる
デブロイでエラーが表示された
FAIL - Failed to deploy application at context path /jaxrs_proto01_customer
ログに こんなエラーが表示されていた
情報: Server startup in 7706 ms
java.io.FileNotFoundException: D:\aaaDoing\20090508 ???????????μ???????????≫ ?
?????????????≫\07 JAXRS\tomcat??,????????????\jaxrs_proto01_customer (指定され たパスが見つかりません。)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:106)
at org.apache.catalina.manager.ManagerServlet.copyInternal(ManagerServle
t.java:1636)
at org.apache.catalina.manager.ManagerServlet.copy(ManagerServlet.java:1
597)
at org.apache.catalina.manager.ManagerServlet.deploy(ManagerServlet.java
:816)やっぱり、漢字を含むファイルは無理か?
漢字を含んだURLを指定すると、[配備]は失敗する
英字のみのフォルダに移してから、配備せよ
管理メニューから index.html が 表示されない
index.html は、存在していか?
web.xml の urlマッピング
<url-pattern>/*</url-pattern>
このように、記述しているので、 /index.html も サーブレットに飛んでいるのではないか?サーブレットが呼ばれるはずの、URLを打ち込んだら 表示されるか?
表示された つまり、基本的には動いている
まずは、web.xml に welcome 属性をつけてみよう
</servlet-mapping> よりも、下に付与
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>ダメ
<url-pattern>/*</url-pattern>
コッチの方が勝つ??
ならば
<url-pattern>/customer</url-pattern>
としてみよう
TOMCATでリロードを行った場合、アプリからの見た目はどうなるのか?
セッションは破棄される
スタテックなメモリもクリアされる →シングルトンインスタンスも再生成される
Tomcat Ver6.0
Eclipse 3.4
まずは、プーリングを行わないパターン
import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.Date; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ControlServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String str=""; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con = DriverManager.getConnection( "jdbc:oracle:thin:@a50:1521:XE", "system", password); Statement stmt = con.createStatement(); String sql = "SELECT 'abc' str FROM dual"; ResultSet rs = stmt.executeQuery(sql); while (rs.next()) { str = rs.getString("str"); System.out.println(str); } stmt.close(); con.close(); } catch (Exception e) { e.printStackTrace(); } resp.setContentType("Text/html"); PrintWriter out = resp.getWriter(); out.println("<html><head> "); out.println("<title>simpleHallowJava3</title> "); out.println("</head><body> "); out.println("<h1> "); out.println("simpleHallowJava3 <Br> "); out.println(new Date().toString()); out.println("</h1> "); out.println(str); out.println("</body></html>"); } }
jdbcドライバは /WEB-INF/lib配下に配置
コネクションプーリングを使用するパターン
import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Date; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.sql.DataSource; public class ControlServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String str=""; try { Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/oracle"); Connection con = ds.getConnection(); Statement stmt = con.createStatement(); String sql = "SELECT 'def' str FROM dual"; ResultSet rs = stmt.executeQuery(sql); while (rs.next()) { str = rs.getString("str"); System.out.println(str); } stmt.close(); con.close(); } catch (NamingException e) { e.printStackTrace(); } catch (SQLException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } resp.setContentType("Text/html"); PrintWriter out = resp.getWriter(); out.println("<html><head> "); out.println("<title>simpleHallowJava21</title> "); out.println("</head><body> "); out.println("<h1> "); out.println("simpleHallowJava3 <Br> "); out.println(new Date().toString()); out.println("</h1> "); out.println(str); out.println("</body></html>"); } }
アプリケーション毎に設定する場合の設定ファイル
〜\tomcat6.0\conf\Catalina\localhost\simpleHallowJava3.xml
<Context path="/simpleHallowJava3" reloadable="true" docBase="\\・・・・・\simpleHallowJava3" workDir="\\・・・・・\\simpleHallowJava3\work" > <Resource name="jdbc/oracle" auth="Container" type="javax.sql.DataSource" factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory" driverClassName="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@a50:1521:XE" username="system" password="password" /> </Context>
Tomcat全体で設定する場合
ソースファイルは同じ
〜\tomcat6.0\conf\context.xml に Resouceを追加
<?xml version='1.0' encoding='utf-8'?> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <!-- The contents of this file will be loaded for each web application --> <Context> <!-- Default set of monitored resources --> <WatchedResource>WEB-INF/web.xml</WatchedResource> <!-- Uncomment this to disable session persistence across Tomcat restarts --> <!-- <Manager pathname="" /> --> <!-- Uncomment this to enable Comet connection tacking (provides events on session expiration as well as webapp lifecycle) --> <!-- <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" /> --> <Resource name="jdbc/oracle" auth="Container" type="javax.sql.DataSource" factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory" driverClassName="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@a50:1521:XE" username="system" password="password" /> </Context>
maxActive="500"--最大接続数。
maxIdle="1"--アイドル中に残す接続数。0を指定すると無制限
maxWait="10000" --コネクションが空くまで何ミリ秒待つかの設定-1を指定すると無制限に待ちます。
jakartaの公式サイトによると以下の通りです。
クラスファイルは上から順に検索されます。
現象
日本語をパラメータで送り込む時、Postメソッドでは正しく送信されるのに、Getメソッドでは正しく送られないときがあった。
原因
Tomcat5.5系において。エンコーディングの設定優先順位が変更されたかららしい。
FORMのGETメソッドでパラメータを送信した場合、setCharacterEncodingメソッドを無視する。POSTメソッドの場合は有効。
対処
server.xmlファイルの<connector>タグのuseBodyEncodingForURI属性をtrueに指定することで、setCharacterEncodingメソッドを有効にできる。
<Connector port="8080" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" useBodyEncodingForURI="true" />
http://www.javaroad.jp/opensource/js_ant3.htm
開発用クラスローダを用いたならば、自分で zipを展開して クラスパスに配置する必要がある
../eclipse/eclipse_index.html#20100117_開発用クラスローダを使う時の注意