jpa not started with websphere - NoClassDefFoundError: CandidateComponentsIndexLoader?

jpa not started with websphere - NoClassDefFoundError: CandidateComponentsIndexLoader?

有spring4.3.0应用+jpa+jaxb

所以,我需要在 websphere 服务器上启动这个应用程序。 我的应用程序包括主要 class - WebApplicationInitializer 有 3 层 - 网络(带有 WebConfig 的控制器)、服务(ServiceConfig)和持久性(PersistenceConfig)

我在应用程序中添加 PersistenceConfig 后 - WAS 服务器上出现错误消息(tomcat 服务器上没有此类问题)

我的 PersisntenceConfig:

import org.hibernate.jpa.HibernatePersistenceProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.annotation.Resource;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
import java.util.Properties;

@Configuration
@EnableTransactionManagement
@EnableJpaAuditing
@EnableJpaRepositories(basePackages = {"data.persistence"})
@PropertySource("classpath:application.properties")
@ComponentScan(basePackages = {"data.persistence"})
public class PersistenceConfig {
    private static final String PROP_DATABASE_DRIVER = "db.driver";
    private static final String PROP_DATABASE_URL = "db.url";
    private static final String PROP_DATABASE_USERNAME = "db.username";
    private static final String PROP_DATABASE_PASSWORD = "db.password";
    private static final String PROP_HIBERNATE_DIALECT = "db.hibernate.dialect";
    private static final String PROP_HIBERNATE_SHOW_SQL = "db.hibernate.show_sql";
    private static final String PACKAGE_WITH_JPA_ENTITIES = "ru.sbrf.risks.services.data.persistence";
    private static final String PROP_HIBERNATE_HBM2DDL_AUTO = "db.hibernate.hbm2ddl.auto";
    private static final String DO_NOT_AUDIT_LOCKING_FIELD = "org.hibernate.envers.do_not_audit_optimistic_locking_field";

    @Resource
    private Environment env;

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(env.getRequiredProperty(PROP_DATABASE_DRIVER));
        dataSource.setUrl(env.getRequiredProperty(PROP_DATABASE_URL));
        dataSource.setUsername(env.getRequiredProperty(PROP_DATABASE_USERNAME));
        dataSource.setPassword(env.getRequiredProperty(PROP_DATABASE_PASSWORD));
        return dataSource;
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean entityManager = new LocalContainerEntityManagerFactoryBean();
        entityManager.setDataSource(dataSource());
        entityManager.setPackagesToScan(PACKAGE_WITH_JPA_ENTITIES);
        entityManager.setPersistenceProviderClass(HibernatePersistenceProvider.class);
        entityManager.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
        entityManager.setJpaProperties(getHibernateProperties());
        return entityManager;
    }

    @Bean
    public JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactory);
        return transactionManager;
    }

    //Set properties hibernate
    private Properties getHibernateProperties() {
        Properties properties = new Properties();
        properties.put("hibernate.dialect", env.getRequiredProperty(PROP_HIBERNATE_DIALECT));
        properties.put("hibernate.show_sql", env.getRequiredProperty(PROP_HIBERNATE_SHOW_SQL));
        properties.put("hibernate.hbm2ddl.auto", env.getRequiredProperty(PROP_HIBERNATE_HBM2DDL_AUTO));
        properties.put("org.hibernate.envers.do_not_audit_optimistic_locking_field",
                env.getRequiredProperty(DO_NOT_AUDIT_LOCKING_FIELD));

        properties.put("verifyServerCertificate", false);
        properties.put("useSSL", false);
        properties.put("requireSSL", false);
        properties.put("useLegacyDatetimeCode", false);
        properties.put("useUnicode", "yes");
        properties.put("characterEncoding", "UTF-8");
        properties.put("serverTimezone", "UTC");
        properties.put("useJDBCCompliantTimezoneShift", true);
        return properties;
    }
}

错误信息是:

Caused by: java.lang.NoClassDefFoundError: org.springframework.context.index.CandidateComponentsIndexLoader at org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.setResourceLoader(DefaultPersistenceUnitManager.java:431) at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.setResourceLoader(LocalContainerEntityManagerFactoryBean.java:320) at org.springframework.context.support.ApplicationContextAwareProcessor.invokeAwareInterfaces(ApplicationContextAwareProcessor.java:112) at org.springframework.context.support.ApplicationContextAwareProcessor.postProcessBeforeInitialization(ApplicationContextAwareProcessor.java:97) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:408) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1570) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545) ... 113 more Caused by: java.lang.ClassNotFoundException: org.springframework.context.index.CandidateComponentsIndexLoader at java.net.URLClassLoader.findClass(URLClassLoader.java:609) at com.ibm.ws.bootstrap.ExtClassLoader.findClass(ExtClassLoader.java:243) at java.lang.ClassLoader.loadClassHelper(ClassLoader.java:924) at java.lang.ClassLoader.loadClass(ClassLoader.java:869) at com.ibm.ws.bootstrap.ExtClassLoader.loadClass(ExtClassLoader.java:134) at java.lang.ClassLoader.loadClass(ClassLoader.java:852) at com.ibm.ws.classloader.ProtectionClassLoader.loadClass(ProtectionClassLoader.java:62) at com.ibm.ws.classloader.ProtectionClassLoader.loadClass(ProtectionClassLoader.java:58) at com.ibm.ws.classloader.CompoundClassLoader.loadClass(CompoundClassLoader.java:586) at java.lang.ClassLoader.loadClass(ClassLoader.java:852) at com.ibm.ws.classloader.CompoundClassLoader.loadClass(CompoundClassLoader.java:586) at java.lang.ClassLoader.loadClass(ClassLoader.java:852) ... 120 more

[12/11/18 14:10:06:443 MSK] 00000079 webapp I com.ibm.ws.webcontainer.webapp.WebApp log SRVE0292I: Servlet Message - [MyApp_war#MyApp.war]:.Closing Spring root WebApplicationContext [12/11/18 14:10:06:445 MSK] 00000079 webapp E com.ibm.ws.webcontainer.webapp.WebGroupImpl WebGroup SRVE0015E: Failure to initialize Web application MyApp.war [12/11/18 14:10:06:447 MSK] 00000079 DeployedAppli W WSVR0206E: Module, MyApp.war, of application, MyApp_war.ear/deployments/MyApp_war, failed to start [12/11/18 14:10:06:448 MSK] 00000079 ApplicationMg W WSVR0101W: An error occurred starting, MyApp_war [12/11/18 14:10:06:448 MSK] 00000079 ApplicationMg A WSVR0217I: Stopping application: MyApp_war [12/11/18 14:10:06:455 MSK] 00000079 ApplicationMg A WSVR0220I: Application stopped: MyApp_war [12/11/18 14:10:06:457 MSK] 00000079 CompositionUn E WSVR0194E: Composition unit WebSphere:cuname=MyApp_war in BLA WebSphere:blaname=MyApp_war failed to start. [12/11/18 14:10:06:461 MSK] 00000079 MBeanHelper E Could not invoke an operation on object: WebSphere:name=ApplicationManager,process=server1,platform=proxy,node=pega-wasNode01,version=8.5.5.13,type=ApplicationManager,mbeanIdentifier=ApplicationManager,cell=pega-wasNode01Cell,spec=1.0 because of an mbean exception: com.ibm.ws.exception.RuntimeWarning: com.ibm.ws.webcontainer.exception.WebAppNotLoadedException: Failed to load webapp: Failed to load webapp: Error creating bean with name 'entityManagerFactory' defined in data.persistence.PersistenceConfig: Initialization of bean failed&#59; nested exception is java.lang.NoClassDefFoundError: org.springframework.context.index.CandidateComponentsIndexLoader

class org.springframework.context.index.CandidateComponentsIndexLoader 是在 Spring Framework 5.0 中引入的。您声明您正在使用 Spring Framework 4.3。

合乎逻辑的结论是您正在混合来自不同版本 Spring 的罐子。根据经验,永远不要混合来自不同版本框架的罐子。