【トラブル】【Eclips】【Tomcat】Eclipse + Tomcatのトラブルシューティング ~その2~


■「NoClassDefFoundError: org/apache/juli/logging/LogFactory」が表示される

詳細

http://www.atmarkit.co.jp/ait/articles/1106/24/news113_2.html
で「org.apache.catalina.startup.Tomcatクラス」のサンプルを実行しようとすると
以下のエラーが表示されてしまう

エラー内容

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory
	at org.apache.catalina.util.LifecycleBase.<clinit>(LifecycleBase.java:37)
	at org.apache.catalina.startup.Tomcat.getHost(Tomcat.java:440)
	at org.apache.catalina.startup.Tomcat.addContext(Tomcat.java:239)
	at com.sample.tomcat.EmbeddedTomcat.main(EmbeddedTomcat.java:13)
Caused by: java.lang.ClassNotFoundException: org.apache.juli.logging.LogFactory
	at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	... 4 more

解決方法

 * TomcatのBin配下の「tomcat-juli.jar」をインポートする

補足

 * 実際に行ったソースは以下の関連記事を参照のこと
http://blogs.yahoo.co.jp/dk521123/34689533.html

参考文献

http://stackoverflow.com/questions/7955442/java-lang-noclassdeffounderror-org-apache-juli-logging-logfactory

■「LifecycleException: Failed to start component」が表示される

詳細

http://www.atmarkit.co.jp/ait/articles/1106/24/news113_2.html
で「org.apache.catalina.startup.Tomcatクラス」のサンプルを実行しようとすると
以下のエラーが表示されてしまう

エラー内容

・・・
情報: Starting Servlet Engine: Apache Tomcat/8.0.14
3 14, 2015 3:23:28 午後 org.apache.catalina.core.ContainerBase startInternal
重大: A child container failed during start
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].StandardContext[/]]
	at java.util.concurrent.FutureTask.report(FutureTask.java:122)
	at java.util.concurrent.FutureTask.get(FutureTask.java:192)
	at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:916)
	at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:868)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1408)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:744)
・・・略・・・
Caused by: java.lang.IllegalArgumentException: The main resource set specified [C:\workspace\SampleService\tomcat.8080\webapps\.] is not valid
	at org.apache.catalina.webresources.StandardRoot.startInternal(StandardRoot.java:665)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
	... 9 more

原因

 上記のエラーで注目すべきは、以下の部分。
~~~
Caused by: java.lang.IllegalArgumentException: The main resource set specified [C:\workspace\SampleService\tomcat.8080\webapps\.] is not valid
~~~
上記のいうと「C:\workspace\SampleService\tomcat.8080」配下にフォルダ「webapps」がなかったため

解決方法

上記のいうと「C:\workspace\SampleService\tomcat.8080」配下にフォルダ「webapps」を作成し
再度起動する

補足

 * 実際に行ったソースは以下の関連記事を参照のこと
http://blogs.yahoo.co.jp/dk521123/34689533.html

参考文献

http://stackoverflow.com/questions/25944975/severe-a-child-container-failed-during-start-tomcat8

ServletでJARをインポートされている状態で実行したら、例外「ClassNotFoundException」になる

詳細

 * ServletでJARをインポートされており、ビルドも通っている状態でいざ実行したら、
   JARで定義している処理で、例外「ClassNotFoundException」になった

解決方法

 * WebContent/WEB-INF/lib に、JARを入れて、インポートし直す

Servlet で、NotFound になってしまう

詳細

 * Servletでファイルを削除したり、追加していたりしてたら、いつの間にNotFound になってしまった 

原因

 *  web.xml に、該当の Servlet クラスが定義されていなかった

解決方法

 * web.xml を見直して、Servlet クラスの記述に漏れがあった場合、定義を追加する
 (うまくいかなかったら、web.xmlをバックアップをとっといた後に、作り直すのもありかも。)

Tomcat起動時にエラー「Several ports ... are already in use.」が表示する

詳細

Servlet作成時に処理が重かったので、Eclipseを無理やり落として、
Servlet修正後、再度、実行したら、以下の【エラー内容】が表示される

エラー内容

Several ports (8005, 8080, 8009) required by TomcatX are already in use.
The server may already be running in another process, or a system process may be using the port.
To start this server you will need to stop the other process or change the port number(s).

原因

 * ポート (8005, 8080, 8009)が使用されているから、Tomcatの起動ができない
 => 今回の場合、裏でTomcatのプロセスが生きてて、既にTomcatが起動して状態になっている
  (英語のエラー内容を読めば分かる)

解決方法

 [0] 環境変数「CATALINA_HOME」を設定しておくこと(例「CATALINA_HOME=C:\tomcat\tomcat7」)
 [1] コマンドプロンプト(管理者)を開き、「【CATALINA_HOME】\bin」まで移動する
 [2] shutdown.batを入力しEnterキーで実行すると、Tomcatのプロセスが落ちる

■「import javax.servlet.xxxxx」でビルドエラーする

詳細

Eclipseで、SVNからソースをインポート後に、「import javax.servlet.xxxxx」でビルドエラーになる

解決方法

 [1] 対象のプロジェクト名を右クリックし、[Properties]-[Targeted Runtimes]で「New」ボタン押下
 [2] (Tomcat8の場合)[Apache]-[Apache Tomcat v8.0]で「Finish」ボタン押下
 [3] 「Apply」ボタン押下し、「OK」ボタン押下

■ 「警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context}」が表示される

警告表示

10 12, 2014 5:08:28 午後 org.apache.tomcat.util.digester.SetPropertiesRule begin
警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context}
 Setting property 'source' to 'org.eclipse.jst.jee.server:Xxxxxx' did not find a matching property.

対処法

[1] Eclipseで[Window]-[Show View]-[Other...]-[Server]-[Servers]を選択
[2] Eclipseの「Servers」ビューで、「Tomcat vX.0 Server at localhost」をダブルクリック
[3] Eclipseの「Server Options」の「Publish module contexts to separate XML files」にチェックを入れる
[4] Ctrl + Sキーなどで保存する

補足

 * この警告を対応すると、以下の警告が表示される

10 12, 2014 6:03:55 午後 org.apache.catalina.startup.SetContextPropertiesRule begin
警告: [SetContextPropertiesRule]{Context}
 Setting property 'source' to 'org.eclipse.jst.jee.server:Xxxxxx' did not find a matching property.

参考文献

http://sookibizviz.blog81.fc2.com/blog-entry-366.html
http://d.hatena.ne.jp/r_ikeda/20090429/tomcat