質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.76%

  • Java

    13174questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Eclipse

    1607questions

    Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

  • Tomcat

    539questions

  • Struts 2

    127questions

    Apache Struts 2は、Apache Strutsプロジェクトにて開発されているオープンソースのJavaベースのWebアプリケーションフレームワークです。Sturts1に比べ、設定ファイルの削減、依存性の注入、POJO等の改善がなされています。

  • Eclipse Plugin

    72questions

    Eclipseは、IBMによって開発された統合開発環境 (IDE) の一つです。高機能ながらオープンソースであり、Javaをはじめとするいくつかの言語に対応しています。Eclipse-Pluginを使う事でIDEの拡張を行う事が可能です。

struts2-tiles-plugin-2.3.24→2.3.34 移行時のTomcat起動エラー

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 565

suesee

score 1

前提・実現したいこと

脆弱性対策のため、
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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 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出力して比較してみましたが同じでした。

    キャンセル

回答 1

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);
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/20 17:39

    ありがとうございます!
    試してみたところ、少しだけ状況が変わりました。
    jarファイルの追加(jcl-over-slf4j-1.5.8.jar、slf4j-api-1.5.8.jar)後、
    発生個所が、org/slf4j/impl/StaticLoggerBinderになりました。

    別プロジェクトで作成している共通ファイルでlog4jを使用しているので、次はそこがうまくいってないのかな・・・

    キャンセル

  • 2018/01/20 18:01

    log4j-slf4j までいれたんならそっちとバージョン競合しとるよ

    1.8.0-alpha2 に合わせてね

    キャンセル

  • 2018/01/20 18:54

    jcl-over-slf4j-1.8.0-alpha2.jar、slf4j-api-1.8.0-alpha2.jar
    に合わせることで解決できました!
    まだ別の問題がでておりますが、本エラーが解決できたので閉じさせていただきます。

    丁寧に教えてくださりありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    13174questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Eclipse

    1607questions

    Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

  • Tomcat

    539questions

  • Struts 2

    127questions

    Apache Struts 2は、Apache Strutsプロジェクトにて開発されているオープンソースのJavaベースのWebアプリケーションフレームワークです。Sturts1に比べ、設定ファイルの削減、依存性の注入、POJO等の改善がなされています。

  • Eclipse Plugin

    72questions

    Eclipseは、IBMによって開発された統合開発環境 (IDE) の一つです。高機能ながらオープンソースであり、Javaをはじめとするいくつかの言語に対応しています。Eclipse-Pluginを使う事でIDEの拡張を行う事が可能です。