web-dev-qa-db-ja.com

NoSuchMethodError:org.jboss.logging.Logger.debugf

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>

誰かが手がかりを持っていますか?

6
Florian Tavares

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>
7
LucasP

同様の問題がありましたが、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は内部ライブラリではなく、プロジェクトのライブラリをロードします。

6
Goke Obasa

メソッド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バージョンが使用されます。これですべてです。

6
AngelAvila

この問題は、JBossモジュールjarの競合が原因で発生しました。ファイルjboss-loggingを最新バージョンに置き換えると、問題が解決しました。ファイルはフォルダmodules\system\layers\base\org\jboss\logging\mainにあります

また、ファイルmodule.xml内のjarの名前を新しいjar名に置き換える必要があります。ファイルは同じフォルダにあります。

2
Ahmed Tawila

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>
1
Randhir Singh

この記事の手順は、エラーの解決に役立つことがわかりました。 http://sanjayingole.blogspot.in/2015/10/caused-by-javalangnosuchmethoderror.html

簡単に実行する手順(Eclipseを使用している場合)-

  1. 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>
    
  2. メソッドを持っているjboss-loggingバージョンを使用します。リンクで示唆されているように、3.2.0.Finalはそうします。

     <dependency>
                <artifactId>jboss-logging</artifactId>
                <groupId>org.jboss.logging</groupId>            
                <version>3.2.0.Final</version>
     </dependency>
    
1
Keshav