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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Eclipse Plugin

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

Java

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

Struts 2

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

Eclipse

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

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

Q&A

解決済

1回答

1980閲覧

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

suesee

総合スコア7

Eclipse Plugin

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

Java

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

Struts 2

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

Eclipse

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

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

0グッド

0クリップ

投稿2018/01/20 02:04

編集2018/01/20 08:30

###前提・実現したいこと
脆弱性対策のため、
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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/01/20 02:55

WEB.XML 等の定義ファイルがない時点で回答は難しいかと
退会済みユーザー

退会済みユーザー

2018/01/20 02:56

あと「commons-beanutils」は最新版 1.9.* (たしか3だったかな)にしましょう
suesee

2018/01/20 03:17

すみません。web.xmlとtiles.xmlの内容を追記しました。「commons-beanutils」の1.9.3を入れてみます。
退会済みユーザー

退会済みユーザー

2018/01/20 03:28

あと一つ確認だけど java.util.zip.zipexception invalid loc header (bad signature) が出てないかい?
suesee

2018/01/20 03:39

出ていませんね。。。コンソールに出るエラーは、java.lang.NoClassDefFoundError: org/apache/tiles/web/startup/AbstractTilesListener のみです。
退会済みユーザー

退会済みユーザー

2018/01/20 04:22

(移行ガイドを確認)うーむ・・ 2.3.24 てその系統のラストリリースか ・・・ 2.3.20 → 2.3.24→ 2.3.20 → 2.3.28 → 2.3.28.1 → 2.3.29...
退会済みユーザー

退会済みユーザー

2018/01/20 04:23

プロジェクト上のWEB-INF じゃなく webapps/コンテキスト名/WEB-INF/lib や war ファイル内を確認したんだよね?
suesee

2018/01/20 04:41

今は、コンテキストパスやdocBaseをプロジェクト配下にしているのでプロジェクト上のWEB-INFを確認しました。念のため、war出力して比較してみましたが同じでした。
guest

回答1

0

ベストアンサー

ちょっとうちもきになって本腰を入れて調べた結果

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 07:11

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

suesee

2018/01/20 08:39

ありがとうございます! 試してみたところ、少しだけ状況が変わりました。 jarファイルの追加(jcl-over-slf4j-1.5.8.jar、slf4j-api-1.5.8.jar)後、 発生個所が、org/slf4j/impl/StaticLoggerBinderになりました。 別プロジェクトで作成している共通ファイルでlog4jを使用しているので、次はそこがうまくいってないのかな・・・
退会済みユーザー

退会済みユーザー

2018/01/20 09:01

log4j-slf4j までいれたんならそっちとバージョン競合しとるよ 1.8.0-alpha2 に合わせてね
suesee

2018/01/20 09:54

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問