前提・実現したいこと
脆弱性対策のため、
Struts2 2.3.24 で作成されたWebアプリを、
Struts2 2.3.34にアップデートを行っております。
その際に、他のPluginのバージョンアップは問題なく済んだのですが、
struts2-tiles-pluginのみエラーが解消しなくて、
Tomcat起動時に、java.lang.NoClassDefFoundErrorが発生してアプリが起動しません。
情報を色々集めたのですが、手詰まりになったのでここに質問させてもらいました。
発生している問題・エラーメッセージ
10:42:53.979 [localhost-startStop-1] ERROR org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/test] - クラス org.apache.struts2.tiles.StrutsTilesListener のアプリケーションリスナの設定中にエラーが発生しました
java.lang.NoClassDefFoundError: org/apache/tiles/web/startup/AbstractTilesListener
at java.lang.ClassLoader.defineClass1(Native Method) ~[?:1.8.0_40]
at java.lang.ClassLoader.defineClass(ClassLoader.java:760) ~[?:1.8.0_40]
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) ~[?:1.8.0_40]
at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2472) ~[catalina.jar:8.0.20]
at org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:854) ~[catalina.jar:8.0.20]
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1274) ~[catalina.jar:8.0.20]
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1157) ~[catalina.jar:8.0.20]
at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:520) ~[catalina.jar:8.0.20]
at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:501) ~[catalina.jar:8.0.20]
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:120) ~[catalina.jar:8.0.20]
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4650) [catalina.jar:8.0.20]
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5162) [catalina.jar:8.0.20]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [catalina.jar:8.0.20]
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725) [catalina.jar:8.0.20]
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701) [catalina.jar:8.0.20]
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717) [catalina.jar:8.0.20]
at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:581) [catalina.jar:8.0.20]
at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1683) [catalina.jar:8.0.20]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_40]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_40]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [?:1.8.0_40]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [?:1.8.0_40]
at java.lang.Thread.run(Thread.java:745) [?:1.8.0_40]
Caused by: java.lang.ClassNotFoundException: org.apache.tiles.web.startup.AbstractTilesListener
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1305) ~[catalina.jar:8.0.20]
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1157) ~[catalina.jar:8.0.20]
... 23 more
10:42:53.988 [localhost-startStop-1] ERROR org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/test] - 前のエラーのためにアプリケーションリスナのインストールをスキップします
10:42:53.989 [localhost-startStop-1] ERROR org.apache.catalina.core.StandardContext - Error listenerStart
10:42:54.024 [localhost-startStop-1] ERROR org.apache.catalina.core.StandardContext - 以前のエラーのためにコンテキストの起動が失敗しました [/test]
WEB-INF/libの内容
asm-3.3.jar
asm-commons-3.3.jar
asm-tree-3.3.jar
commons-beanutils-1.8.0.jar
commons-collections-3.2.2.jar
commons-digester-2.0.jar
commons-fileupload-1.3.2.jar
commons-io-2.2.jar
commons-lang3-3.2.jar
commons-logging-1.1.3.jar
doma-2.4.1.jar
doma-gen-2.4.1.jar
freemarker-2.3.22.jar
javassist-3.11.0.GA.jar
log4j-api-2.10.0.jar
log4j-core-2.10.0.jar
log4j-jcl-2.10.0.jar
log4j-jul-2.10.0.jar
ognl-3.0.21.jar
struts2-codebehind-plugin-2.3.34.jar
struts2-config-browser-plugin-2.3.34.jar
struts2-convention-plugin-2.3.34.jar
struts2-core-2.3.34.jar
struts2-dojo-plugin-2.3.34.jar
struts2-json-plugin-2.3.34.jar
struts2-tiles-plugin-2.3.34.jar
super-csv-2.4.0.jar
super-csv-annotation-1.1.jar
tiles-api-2.2.2.jar
tiles-core-2.2.2.jar
tiles-freemarker-2.2.2.jar
tiles-jsp-2.2.2.jar
xwork-core-2.3.34.jar
web.xmlの内容
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>test</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>actionPackages</param-name>
<param-value>test.web.action</param-value>
</init-param>
</filter>
<listener>
<listener-class>org.apache.struts2.tiles.StrutsTilesListener</listener-class>
<listener-class>com.test.web.settings.AppSettingsListener</listener-class>
</listener>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
</web-app>
tiles.xmlの内容
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd ">
<tiles-definitions>
~~
</tiles-definitions>
試したこと
・~-2.3.24のプラグインを~-2.3.34のプラグインにバージョンアップ
それに関係するプラグインもバージョンアップ
・mavenを参考にして依存関係の確認
・NoClassDefFoundError自体は、classpathの問題であることが多いとあったので、
.classpathが全て通っているか確認
・tilesに関係しそうなpluginを以下の旧バージョンに戻したところ、エラー無く起動した。
struts2-tiles-plugin-2.3.24.jar
tiles-core-2.0.6.jar
tiles-freemarker-2.0.6.jar
tiles-jsp-2.0.6.jar
回答を試した
jcl-over-slf4j-1.5.8.jar
slf4j-api-1.5.8.jar
を追加。
結果、エラーの内容が少し変わった。
アプリ共通ファイルが参照しているlog4jと今回追加したslf4jがうまくいってない感じ・・?
17:16:32.535 [localhost-startStop-1] ERROR org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/test] - クラス org.apache.struts2.tiles.StrutsTilesListener のアプリケーションリスナの設定中にエラーが発生しました
java.lang.NoClassDefFoundError: org/slf4j/impl/StaticLoggerBinder
at org.slf4j.LoggerFactory.getSingleton(LoggerFactory.java:223) ~[slf4j-api-1.5.8.jar:1.5.8]
at org.slf4j.LoggerFactory.bind(LoggerFactory.java:120) ~[slf4j-api-1.5.8.jar:1.5.8]
at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:111) ~[slf4j-api-1.5.8.jar:1.5.8]
at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:269) ~[slf4j-api-1.5.8.jar:1.5.8]
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:242) ~[slf4j-api-1.5.8.jar:1.5.8]
at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:155) ~[jcl-over-slf4j-1.5.8.jar:1.1.3]
at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:131) ~[jcl-over-slf4j-1.5.8.jar:1.1.3]
at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:657) ~[commons-logging-1.1.3.jar:1.1.3]
at com.opensymphony.xwork2.util.logging.commons.CommonsLoggerFactory.getLoggerImpl(CommonsLoggerFactory.java:29) ~[xwork-core-2.3.34.jar:2.3.34]
at com.opensymphony.xwork2.util.logging.LoggerFactory.getLogger(LoggerFactory.java:56) ~[xwork-core-2.3.34.jar:2.3.34]
at org.apache.struts2.tiles.StrutsTilesListener.<clinit>(StrutsTilesListener.java:34) ~[struts2-tiles-plugin-2.3.34.jar:2.3.34]
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:1.8.0_40]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[?:1.8.0_40]
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:1.8.0_40]
at java.lang.reflect.Constructor.newInstance(Constructor.java:422) ~[?:1.8.0_40]
at java.lang.Class.newInstance(Class.java:442) ~[?:1.8.0_40]
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:121) ~[catalina.jar:8.0.20]
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4650) [catalina.jar:8.0.20]
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5162) [catalina.jar:8.0.20]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [catalina.jar:8.0.20]
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725) [catalina.jar:8.0.20]
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701) [catalina.jar:8.0.20]
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717) [catalina.jar:8.0.20]
at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:581) [catalina.jar:8.0.20]
at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1683) [catalina.jar:8.0.20]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_40]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_40]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [?:1.8.0_40]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [?:1.8.0_40]
at java.lang.Thread.run(Thread.java:745) [?:1.8.0_40]
Caused by: java.lang.ClassNotFoundException: org.slf4j.impl.StaticLoggerBinder
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1305) ~[catalina.jar:8.0.20]
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1157) ~[catalina.jar:8.0.20]
... 30 more
補足情報(言語/FW/ツール等のバージョンなど)
java8
tomcat8
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
ちょっとうちもきになって本腰を入れて調べた結果
org.slf4j.Logger が必須になってるのでライブラリを追加してください
https://mvnrepository.com/artifact/org.apache.tiles/tiles-core/2.2.2
/*
* $Id: AbstractTilesInitializer.java 797540 2009-07-24 15:42:00Z apetrelli $
*
* 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.
*/
package org.apache.tiles.startup;
import org.apache.tiles.TilesApplicationContext;
import org.apache.tiles.TilesContainer;
import org.apache.tiles.TilesException;
import org.apache.tiles.access.TilesAccess;
import org.apache.tiles.factory.AbstractTilesContainerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Default Tiles initialization delegate implementation under a servlet
* environment. It uses init parameters to create the
* {@link TilesApplicationContext} and the {@link TilesContainer}.
*
* @version $Rev: 797540 $ $Date: 2009-07-24 17:42:00 +0200 (ven, 24 lug 2009) $
* @since 2.2.0
*/
public abstract class AbstractTilesInitializer implements TilesInitializer {
/**
* The logging object.
*/
private Logger log = LoggerFactory.getLogger(getClass());
/**
* Init parameter to define the key under which the container will be
* stored.
*
* @since 2.1.2
*/
public static final String CONTAINER_KEY_INIT_PARAMETER =
"org.apache.tiles.startup.AbstractTilesInitializer.CONTAINER_KEY";
/**
* The initialized application context.
*/
private TilesApplicationContext applicationContext;
/**
* The initialized container.
*/
private TilesContainer container;
/** {@inheritDoc} */
public void initialize(TilesApplicationContext applicationContext) {
this.applicationContext = createTilesApplicationContext(applicationContext);
String key = getContainerKey(this.applicationContext);
container = createContainer(this.applicationContext);
TilesAccess.setContainer(this.applicationContext, container, key);
}
/** {@inheritDoc} */
public void destroy() {
try {
TilesAccess.setContainer(applicationContext, null,
getContainerKey(applicationContext));
} catch (TilesException e) {
log.warn("Unable to remove tiles container from service.", e);
}
}
/**
* Creates the Tiles application context, to be used across all the
* Tiles-based application. If you override this class, please override this
* method or
* {@link #createAndInitializeTilesApplicationContextFactory(TilesApplicationContext)}
* .<br>
* This implementation returns the preliminary context passed as a parameter
*
* @param preliminaryContext The preliminary application context to use.
* @return The Tiles application context.
* @since 2.2.0
*/
protected TilesApplicationContext createTilesApplicationContext(
TilesApplicationContext preliminaryContext) {
return preliminaryContext;
}
/**
* Returns the container key under which the container will be stored.
* This implementation returns <code>null</code> so that the container will
* be the default one.
*
* @param applicationContext The Tiles application context to use.
* @return The container key.
* @since 2.2.0
*/
protected String getContainerKey(TilesApplicationContext applicationContext) {
return null;
}
/**
* Creates a Tiles container. If you override this class, please override
* this method or {@link #createContainerFactory(TilesApplicationContext)}.
*
* @param context The servlet context to use.
* @return The created container.
* @since 2.2.0
*/
protected TilesContainer createContainer(TilesApplicationContext context) {
AbstractTilesContainerFactory factory = createContainerFactory(context);
return factory.createContainer(context);
}
/**
* Creates a Tiles container factory. If you override this class, please
* override this method or {@link #createContainer(TilesApplicationContext)}.
*
* @param context The servlet context to use.
* @return The created container factory.
* @since 2.2.0
*/
protected abstract AbstractTilesContainerFactory createContainerFactory(
TilesApplicationContext context);
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.23%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
asahina1979
2018/01/20 11:55
WEB.XML 等の定義ファイルがない時点で回答は難しいかと
asahina1979
2018/01/20 11:56
あと「commons-beanutils」は最新版 1.9.* (たしか3だったかな)にしましょう
suesee
2018/01/20 12:17
すみません。web.xmlとtiles.xmlの内容を追記しました。「commons-beanutils」の1.9.3を入れてみます。
asahina1979
2018/01/20 12:28
あと一つ確認だけど java.util.zip.zipexception invalid loc header (bad signature) が出てないかい?
suesee
2018/01/20 12:39
出ていませんね。。。コンソールに出るエラーは、java.lang.NoClassDefFoundError: org/apache/tiles/web/startup/AbstractTilesListener のみです。
asahina1979
2018/01/20 13:22
(移行ガイドを確認)うーむ・・ 2.3.24 てその系統のラストリリースか ・・・ 2.3.20 → 2.3.24→ 2.3.20 → 2.3.28 → 2.3.28.1 → 2.3.29...
asahina1979
2018/01/20 13:23
プロジェクト上のWEB-INF じゃなく webapps/コンテキスト名/WEB-INF/lib や war ファイル内を確認したんだよね?
suesee
2018/01/20 13:41
今は、コンテキストパスやdocBaseをプロジェクト配下にしているのでプロジェクト上のWEB-INFを確認しました。念のため、war出力して比較してみましたが同じでした。