2016年7月15日金曜日

Tomcatインストール先の謎

今回の一連の不具合の起点は、Tomcatのインストール先を "C:\Program Files\..." にしたために起こった(と考えている。しかし、確証はない)。では、なぜ "C:\Program Files\..."だと不都合なのか?いろいろ調べてみたが明快な回答は見つからなかった。曰く
デフォルトでは、パス名に空白が入ります。ほか製品との連携時などに発生するかもしれない問題を未然に防ぐ観点では、スペースを含まないパス名(たとえば、"E:\Apache\Tomcat")にしておくようにお勧めします
どういう問題が発生するのかについては触れていません。一方で、普通に "C:\Program Files\..."へインストールしているサイトもたくさん見られます。本当のところはどうなのでしょう?もう一度Tomcatを "C:\Program Files\..."へ再インストールする勇気があれば解明できるかもしれませんが・・・・。

コンテキストの謎

Sさんからメールが届き、コンテキストの謎が解明されました。それによると、前回の記事で書いた「コンテキスト定義を更新」すると、eclipseで、「ウインドウ」→「設定」→「Tomcat」の中の「コンテキスト宣言モード」 で指定したコンテキスト・ディレクトリに、 コンテキスト定義の出力場所が変わるということです。

コンテキスト・ディレクトリの設定画面

ここで、コンテキスト・ディレクトリに「C:\Tomcat 8.0\conf\Catalina\localhost」を設定しておくと、「コンテキスト定義を更新」によって、ここにコンテキスト定義ファイル(emrs.xml)が出力されるということです。


作成されたコンテキストファイル


 「コンテキスト定義を更新」してしまった今となっては、ここにコンテキスト定義ファイルがあったのかどうかは定かではありませんが、おそらくそういうカラクリなのでしょう(参考:コンテキストの設定)。


2016年7月13日水曜日

動いた!

動いた、動いた!パッケージ・エクスプローラでプロジェクト(この場合はemrs)を右ボタンクリックして[Tomcatプロジェクト]を選択し、[コンテキスト定義を更新]をクリックしてから、再度ブラウザでWEB電子カルテを起動すると動いた!

Tomcatプロジェクトでコンテキスト定義を更新

WEB電子カルテシステムの諸画面

ところで、この[コンテキスト定義を更新]って何をしているのだろう?このサイトにいろいろ書いてあるが、どうもよくわからない。ただ、この操作を行うことによって「コンテキスト(=Webアプリケーション?)」が追加され、動くようになったものと思われます。でも、追加するって、どこへ?
%TOMCAT_HOME%\webappsを見たけれど、中には相変わらずemrsはない。
では、ログを見てみよう。これは、stderrの中身。

13-Jul-2016 14:21:17.565 INFO [main] org.apache.catalina.startup.Catalina.load Initialization processed in 410 ms
13-Jul-2016 14:21:17.583 INFO [main] org.apache.catalina.core.StandardService.startInternal サービス Catalina を起動します
13-Jul-2016 14:21:17.583 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet Engine: Apache Tomcat/8.0.35
13-Jul-2016 14:21:17.591 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDescriptor 設定記述子 C:\Tomcat 8.0\conf\Catalina\localhost\emrs.xml を配備します
13-Jul-2016 14:21:18.346 INFO [localhost-startStop-1] org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory.getObjectInstance Name = emrsdb Ignoring unknown property: value of "Postgre Datasource" for "description" property
13-Jul-2016 14:21:18.456 INFO [localhost-startStop-1] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
13-Jul-2016 14:21:19.472 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDescriptor Deployment of configuration descriptor C:\Tomcat 8.0\conf\Catalina\localhost\emrs.xml has finished in 1,880 ms
13-Jul-2016 14:21:19.473 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Webアプリケーションディレクトリ C:\Tomcat 8.0\webapps\docs を配備します
13-Jul-2016 14:21:19.489 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory C:\Tomcat 8.0\webapps\docs has finished in 15 ms
13-Jul-2016 14:21:19.489 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Webアプリケーションディレクトリ C:\Tomcat 8.0\webapps\manager を配備します
13-Jul-2016 14:21:19.514 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory C:\Tomcat 8.0\webapps\manager has finished in 25 ms
13-Jul-2016 14:21:19.514 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Webアプリケーションディレクトリ C:\Tomcat 8.0\webapps\ROOT を配備します
13-Jul-2016 14:21:19.529 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory C:\Tomcat 8.0\webapps\ROOT has finished in 15 ms
13-Jul-2016 14:21:19.530 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
13-Jul-2016 14:21:19.535 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-8009"]
13-Jul-2016 14:21:19.536 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 1971 ms
ここで4行目に注目。C:\Tomcat 8.0\conf\Catalina\localhost\emrs.xmlって何でしょう?中身を見るとこのようになっていました。
<Context path="/emrs" reloadable="true" docBase="C:\pleiades\workspace\emrs" workDir="C:\pleiades\workspace\emrs\work" />

これは、まさにeclipseのworkspace上にあるWEB電子カルテのコンテキストそのものです。つまりこういうことでしょうか。eclipseは、このショートカットのような役目を持ったemrs.xmlをconf\Catalina\localhostの中に書いてやると、Tomcatはそれを配備するという・・・。いずれにせよ、これで問題は解決。このときのTomcat Managerの画面はこうなっていました。


確かに/emrsというパスを持ったアプリケーションが加わっていますね。

WEB電子カルテが404 Not Foundで動かない!

eclipseのTomcatプロジェクトで開発したWEB電子カルテが404 Not Foundで動きません!

WEB電子カルテ 404 Not Found

ログを見るとこんなメッセージが出ていた。

13-Jul-2016 13:01:15.894 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet Engine: Apache Tomcat/8.0.35
13-Jul-2016 13:01:15.899 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Webアプリケーションディレクトリ C:\Tomcat 8.0\webapps\docs を配備します
13-Jul-2016 13:01:16.090 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory C:\Tomcat 8.0\webapps\docs has finished in 190 ms
13-Jul-2016 13:01:16.090 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Webアプリケーションディレクトリ C:\Tomcat 8.0\webapps\manager を配備します
13-Jul-2016 13:01:16.120 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory C:\Tomcat 8.0\webapps\manager has finished in 29 ms
13-Jul-2016 13:01:16.120 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Webアプリケーションディレクトリ C:\Tomcat 8.0\webapps\ROOT を配備します
13-Jul-2016 13:01:16.135 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory C:\Tomcat 8.0\webapps\ROOT has finished in 15 ms
13-Jul-2016 13:01:16.136 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
13-Jul-2016 13:01:16.142 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-8009"]
13-Jul-2016 13:01:16.143 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 266 ms
また、アクセスログを見るとこうなっている。

0:0:0:0:0:0:0:1 - - [13/Jul/2016:13:02:31 +0900] "GET /emrs/jsp/Login.jsp HTTP/1.1" 404 1055

/emrs/jsp/Login.jspがないということだが、確かにC:\Tomcat 8.0\webappsの中にはemrsはない。では、どこにあるのか? それはC:\pleiades\workspaceにあった。つまり、eclipseで開発中のTomcatプロジェクトはC:\Tomcat 8.0\webappsには配備されず、eclipse内のサンドバッグ内に配備されていることになる。これでは404 Not Foundになるのも当たり前だ。
では、一体、どうすればいいのだろうか? これは想像だけれど、eclipseでTomcatプロジェクトを作るとき、本来webappsに置くべきファイル類(アプリケーション一式)をどこへ置くかを指定できるのではないだろうか?eclipseでデバッグしている間はそこにファイル一式を保存し、デバッグし終えたら削除するとか・・・。

Apache Tomcat Manager はどうやって起動すればいい?

Tomcat MangerはTomcat上で稼働するアプリケーションの管理(起動、停止、配備、配備解除)やサーバの状態確認を行うためのWebツールです。ブラウザから以下のURLを入力して利用します。

http://127.0.0.1:8080/manager/html

しかし、これを利用するにはユーザとパスワードを登録しなければなりません。登録はTomcatのconf/tomcat-users.xmlに以下のように登録します。

<tomcat-users>
  <role rolename="manager-gui"/>
  <user username="ユーザーID" password="パスワード" roles="manager-gui"/>
</tomcat-users>

これでTomcat Managerが起動します。

Tomcat Manager

2016年7月12日火曜日

ハマってしまいました

Tomcatインストールディレクトリを変更したら・・・

eclipseは本当に良くわかりません。加えてTomcatプロジェクトは難儀です。Tomcatプロジェクトで作成したWEB電子カルテを、単品のTomcatを起動してからブラウザにURLを入力して実行したところ、404 Not Foundが出て動きません。単品のTomcatをProgram Filesにインストールしていることに原因がありそうだと踏んで、Cドライブ直下へインストールし直しました。すると、今度は、今まで動いていたプロジェクトが動かなくなったではありませんか。Tomcatディレクトリが変わったことによる不整合です。eclipseの設定をあちこち触り、ほぼ2コマかけて、やっとの思いで不整合部分の設定を変更しました。おかげでこれまで動いていたプロジェクトが動くようになりました。これで、WEB電子カルテも動くだろう・・・とやってみたところやはりダメでした。この2コマはいったい何だったんだろう・・・。

eclipseのしくみがわからない・・・


eclipseでWebアプリを開発するとき、動的WebプロジェクトとTomcatプロジェクトがあることは以前にも書きました。加えてTomcatサーバも単品とeclipseに組み込まれたのがあるらしい・・・。動的Wwbプロジェクトはeclipseから起動したTomcatサーバ上で動く(というかデバッグできる)。一方、Tomcatプロジェクトで開発したWebアプリは動かない。単品TomcatをConfigure Tomcatを使って起動しないとダメ。
さらに不思議なことに、eclipseで開発したプログラム群はworkspace上にあるらしい。 Tomcat 8.0\webapps内のプロジェクト名のフォルダじゃなかったの?この辺り、一度きちんとさせた方がいいみたいです。このまま進んで行っても混乱が増すばかりです。時間を取って確認していきたいと思います。

第11,12回 WEB電子カルテのインストール(その3)

前回に引き続いてWEB電子カルテのインストールを行います。前回は、Tomcatプロジェクトで開発したWEB電子カルテが起動しないので苦労しました。原因はeclipseからはTomcatプロジェクトを起動できない(らしい)ことにあったようですが、そのからくりは正直なところよくわかりません。もっと腰を落ち着けて、じっくりと考える必要があるとは思いますが、講義回数もあと5回と残り少なくなってきたので、とりあえず先に進むこととします。

もっとも大切なこと、それはログファイルを見ること


いよいよWEB電子カルテがTomcat上で作動し始めたら、様々なエラーに遭遇します。たとえば次のようなエラーです。



 このエラーを解決するためにデバッグ作業を行います。しかし、このエラーメッセージを見てもどこから手を付ければよいのかわかりません。そんなときに役立つのがログです。いえ、ログにしか解決のためのヒントは存在しません。ですから、何はともあれ、まず、ログを見る習慣を身につけましょう。




ログは、Tomcatをインストールしたフォルダ内のlogsというフォルダにあります。たくさんの種類がありますが、エラーはtomcat8-stderr.YYYY-MM-DD.logに吐き出されます。 大量の情報が出力されていますが、その中からこのエラーを直接引き起こした原因を探ります。この場合は
log4j:ERROR setFile(null,true) call failed.
java.io.FileNotFoundException: e:\webkarte_log\webKarte.log (指定されたパスが見つかりません。)
というメッセージです。ファイルe:\webkarte_log\webKarte.logがないと言っています。

Tomcatのセキュリティポリシーファイル conf/catalina.policy


Tomcatにはセキュリティのためのしくみ「セキュリティマネージャ」というのがあるようです。
「セキュリティマネージャ」(java.lang.SecurityManagerクラスが使われる)とは、信頼されていないコードを実行することでローカルファイルシステム上にあるファイルへとアクセスしたり、Javaアプレットのダウンロード元のホスト以外と通信して情報を送受信したりといったことができないように、Javaアプレットがサンドボックス内で実行できるようにする機構です。
とのことです(参照)。要するに勝手にアプリケーションが通信をしたり、ある特定のファイルにアクセスしたりできないようにする仕組みのようです。WEB電子カルテはORCAサーバやPostgreSQLサーバと通信したり、ログファイル(webKarte_log/webkarte.log)にアクセスしたりするため、これらを利用できるように許可(Permission)を与えなければならないようです。それをしているのがW教授の虎の巻「開発用Window設定」のP10の18)です。これをセキュリティポリシーというそうです。 下記がその設定例です。
grant{
 permission java.util.PropertyPermission "org.apache.commons.logging.LogFactory.HashtableImpl", "read";
 permission java.util.PropertyPermission "org.seasar.framework.container.factory.config", "read";
 permission java.util.PropertyPermission "org.seasar.framework.container.factory.S2ContainerFactory", "read";
 permission java.lang.RuntimePermission "setContextClassLoader", "read";
 permission java.lang.RuntimePermission "*", "read";
 permission java.lang.reflect.ReflectPermission "suppressAccessChecks", "read";
 permission java.io.FilePermission "c:/webKarte_log/webkarte.log","read, write";
 permission java.net.SocketPermission "struts.apache.org:80","connect, resolve";
 permission java.net.SocketPermission "172.16.111.123:8000","connect,resolve";
 permission java.net.SocketPermission "172.16.111.123:8001","connect,resolve";
 permission java.net.SocketPermission "172.16.111.123:5432","connect,resolve";
 permission java.net.SocketPermission "172.16.111.123:5432","connect,resolve";
};
ポリシファイルの書式については、例えばこのサイトを参考にしてください。以下にgrantエントリの書式を示します。そして、このgrantエントリを複数並べてポリシーを校正するそうです。
 
 
// Example policy file entry

grant [signedBy ,] [codeBase ] {
  permission  <パーミッションクラスの完全修飾名> <ターゲット>, <アクション>;
};
signedByは署名者の情報(誰が署名したクラスに対するパーミッションなのか)、codeBaseはWebアプリケーションのホームディレクトリをURL形式で書きますが、省略するとすべてが対象になるようです。 上の例でいえば、例えば2行目は、"org.apache.commons.logging.LogFactory.HashtableImpl"プロパティに対する読み取り権、5行目は"setContextClassLoader"を使用するための権限を付与し、8行目は、"c:/webKarte_log/webkarte.log"というファイルに読み書きのアクセス権を付与しています。
ところで、このファイル名、どこに設定してあるのでしょうか? ログを辿って調べてみると、web.karte.common.Log.javaに
private static final String LOG4J_XML = "log4j.xml";
のように定義されていました。つまり、log4j.xmlを見ろと。で、そのlog4j.xmlはどこに? srcディレクトリ内にありました。内容は以下の通りです。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

   <appender name="Appender1" class="org.apache.log4j.RollingFileAppender">
      <param name="File" value="c:\\webkarte_log\\webKarte.log" />
      <param name="MaxFileSize" value="1MB" />
      <param name="MaxBackupIndex" value="5" />
      <layout class="org.apache.log4j.PatternLayout">
         <param name="ConversionPattern" value="%d %-5p %x:%m%n"/>
      </layout>
   </appender>

  <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern"
        value="%d %-5p %x:%m%n"/>
    </layout>
  </appender>

 <!-- level(DEBUG < INFO < WARN < ERROR < FATAL) -->
 <root>
  <level value="INFO" />
  <appender-ref ref="Appender1" />
  <appender-ref ref="STDOUT" />
 </root>
</log4j:configuration>
6行目にちゃんと定義してありますね。