Spring + Spring Data + Log4J2のスタックを機能させようとしています。残念ながら、アーティファクトをMy Glassfish 4.1サーバーにデプロイすると、次のエラーが発生します。
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class com.canal.config.spring.ContextConfig: Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public javax.persistence.EntityManagerFactory com.canal.config.spring.ContextConfig.entityManagerFactory()] threw exception; nested exception is Java.lang.NoSuchMethodError: org.jboss.logging.Logger.debugf(Ljava/lang/String;I)V
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.Java:601)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.Java:1113)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.Java:1008)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.Java:505)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.Java:476)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.Java:302)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.Java:229)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.Java:298)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.Java:193)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.Java:725)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.Java:757)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.Java:480)
at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.Java:663)
at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.Java:535)
at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.Java:489)
at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.Java:136)
at javax.servlet.GenericServlet.init(GenericServlet.Java:244)
at org.Apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.Java:1583)
at org.Apache.catalina.core.StandardWrapper.load(StandardWrapper.Java:1382)
at org.Apache.catalina.core.StandardContext.loadOnStartup(StandardContext.Java:5704)
at org.Apache.catalina.core.StandardContext.start(StandardContext.Java:5946)
at com.Sun.enterprise.web.WebModule.start(WebModule.Java:691)
at org.Apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.Java:1041)
at org.Apache.catalina.core.ContainerBase.addChild(ContainerBase.Java:1024)
at org.Apache.catalina.core.StandardHost.addChild(StandardHost.Java:747)
at com.Sun.enterprise.web.WebContainer.loadWebModule(WebContainer.Java:2286)
at com.Sun.enterprise.web.WebContainer.loadWebModule(WebContainer.Java:1932)
at com.Sun.enterprise.web.WebApplication.start(WebApplication.Java:139)
at org.glassfish.internal.data.EngineRef.start(EngineRef.Java:122)
Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public javax.persistence.EntityManagerFactory com.canal.config.spring.ContextConfig.entityManagerFactory()] threw exception; nested exception is Java.lang.NoSuchMethodError: org.jboss.logging.Logger.debugf(Ljava/lang/String;I)V
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.Java:188)
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.Java:590)
... 69 more
Caused by: Java.lang.NoSuchMethodError: org.jboss.logging.Logger.debugf(Ljava/lang/String;I)V
at org.hibernate.internal.NamedQueryRepository.checkNamedQueries(NamedQueryRepository.Java:149)
at org.hibernate.internal.SessionFactoryImpl.checkNamedQueries(SessionFactoryImpl.Java:764)
at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.Java:495)
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.Java:444)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.Java:802)
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.Java:60)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.Java:343)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.Java:318)
at com.canal.config.spring.ContextConfig.entityManagerFactory(ContextConfig.Java:52)
at com.canal.config.spring.ContextConfig$$EnhancerBySpringCGLIB$$db0b8696.CGLIB$entityManagerFactory$0()
at com.canal.config.spring.ContextConfig$$EnhancerBySpringCGLIB$$db0b8696$$FastClassBySpringCGLIB$$bca83b68.invoke()
at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.Java:228)
at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.Java:312)
at com.canal.config.spring.ContextConfig$$EnhancerBySpringCGLIB$$db0b8696.entityManagerFactory()
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:62)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
at Java.lang.reflect.Method.invoke(Method.Java:497)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.Java:166)
... 70 more
私のpom.xmlは:
<project xmlns="http://maven.Apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.springapp</groupId>
<artifactId>advance</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>advance</name>
<properties>
<Java.version>1.8</Java.version>
<springframework.version>4.2.1.RELEASE</springframework.version>
<log4j.version>2.4</log4j.version>
<javaee.version>7.0</javaee.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${springframework.version}</version>
<exclusions>
<!-- Utilise Log4J à la place du logger par défaut -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${springframework.version}</version>
<exclusions>
<!-- Utilise Log4J à la place du logger par défaut -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${springframework.version}</version>
<exclusions>
<!-- Utilise Log4J à la place du logger par défaut -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Log4J2 Dependance -->
<dependency>
<groupId>org.Apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.Apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.4</version>
</dependency>
<!-- Bridge Log Spring vers Log4J -->
<dependency>
<groupId>org.Apache.logging.log4j</groupId>
<artifactId>log4j-jcl</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>3.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>3.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>1.9.0.RELEASE</version>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>${javaee.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.0.1.Final</version>
</dependency>
</dependencies>
<build>
<finalName>${artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>${Java.version}</source>
<target>${Java.version}</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
誰かが手がかりを持っていますか?
hibernate-entitymanagerは依存関係としてjboss-loggingを導入しましたが、これは最新バージョンではなく、そのメソッドは実装されていません。 jboss-loggingは必要ないようですので、除外してみてください。
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.0.1.Final</version>
<exclusions>
<exclusion>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
または、休止状態にjboss-loggingが必要であることが判明した場合は、追加の依存関係としてjboss-loggingの新しいバージョンを追加します。
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
<version>3.3.0.Final</version>
</dependency>
同様の問題がありましたが、glassfish-web.xml
ディレクトリにWEB-INF
ファイルを作成することで修正できました。ファイルの内容を以下に示します。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
<glassfish-web-app>
<class-loader delegate="false"/>
</glassfish-web-app>
これにより、glassfishは内部ライブラリではなく、プロジェクトのライブラリをロードします。
メソッドorg.jboss.logging.Logger.debugf
はjboss-loggingバージョン3.3.0でのみ使用可能です。プロジェクトにこの依存関係がある場合は、GlassFishサーバーにも同じバージョンがあることを確認する必要があります。同じエラーメッセージが表示され、Glassfishインストールフォルダーのjboss-logging.jarを置き換えて解決しました。これは、このjarが以前のバージョンであり、必要なメソッドがないためです。たとえば、次のパスにjarがあります。
C:\Program Files\glassfish-4.1.1\glassfish\modules\jboss-logging.jar
古いjarを削除し、同じ名前でバージョン3.3.0の新しいjarを配置しました。 GlassFishサーバーを再起動するだけで、新しいjarバージョンが使用されます。これですべてです。
この問題は、JBossモジュールjarの競合が原因で発生しました。ファイルjboss-logging
を最新バージョンに置き換えると、問題が解決しました。ファイルはフォルダmodules\system\layers\base\org\jboss\logging\main
にあります
また、ファイルmodule.xml
内のjarの名前を新しいjar名に置き換える必要があります。ファイルは同じフォルダにあります。
Glassfishジャージを使用している場合は、Bean-validatorが依存関係として提供され、Tomcatは確かにそこからLoggerクラスをロードしようとします。
Bean-validatorクラスには、同じパッケージにLoggerクラスも含まれています。
Jarファイルを除外すると問題が解決するはずです
<dependency>
<groupId>org.glassfish.jersey.ext</groupId>
<artifactId>jersey-spring3</artifactId>
<version>2.24.1</version>
<exclusions>
<exclusion>
<artifactId>spring-aop</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>bean-validator</artifactId>
<groupId>org.glassfish.hk2.external</groupId>
</exclusion>
</exclusions>
</dependency>
この記事の手順は、エラーの解決に役立つことがわかりました。 http://sanjayingole.blogspot.in/2015/10/caused-by-javalangnosuchmethoderror.html
簡単に実行する手順(Eclipseを使用している場合)-
Pom.xmlの依存関係階層でALL "jboss-logging" sub-dependenciesを確認し、それらの依存関係をすべて除外します。
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.version}</version>
<exclusions>
<exclusion>
<artifactId>jboss-logging</artifactId>
<groupId>org.jboss.logging</groupId>
</exclusion>
</exclusions>
</dependency>
メソッドを持っているjboss-loggingバージョンを使用します。リンクで示唆されているように、3.2.0.Finalはそうします。
<dependency>
<artifactId>jboss-logging</artifactId>
<groupId>org.jboss.logging</groupId>
<version>3.2.0.Final</version>
</dependency>