HikariCP - Erreur de liaison utilisant HikariDataSource
Question
J'ai une erreur de liaison lorsque je démarre JBOSS AS 6.1 avec un HikariDataSource
.Comment résoudre cela ?
J'utilise hikariCP 1.3.3 :
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>1.3.3</version>
</dependency>
Spring 3.2, JBOSS AS 6.1, Hibernate 3.6.6 (fourni avec JBOSS).J'ai supprimé persistence.xml et configuré mon DataSource par programme en utilisant LocalContainerEntityManagerFactoryBean
approche à partir de : http://www.baeldung.com/2011/12/13/the-persistence-layer-with-spring-3-1-and-jpa/
Ma DS que j'ai configurée simplement :
@Bean
public DataSource dataSource() {
HikariDataSource ds = new HikariDataSource(); //here i get the linkageError
ds.setMaximumPoolSize(15);
ds.setDataSourceClassName("com.microsoft.sqlserver.jdbc.SQLServerDataSource");
ds.addDataSourceProperty("serverName", "localhost");
ds.addDataSourceProperty("databaseName", "dbtest");
ds.addDataSourceProperty("user", "dbtest");
ds.addDataSourceProperty("password", "dbtest");
ds.setPoolName("springHikariCp");
return ds;
}
Et la fin de stacktrace est :
Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public javax.sql.DataSource com.company.test.PersistenceJPAConfig.dataSource()] threw exception; nested exception is java.lang.ExceptionInInitializerError
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:181) [:3.2.0.RELEASE]
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:570) [:3.2.0.RELEASE]
... 135 more
Caused by: java.lang.ExceptionInInitializerError
at com.zaxxer.hikari.HikariConfig.<clinit>(HikariConfig.java:77) [:]
at com.company.test.PersistenceJPAConfig.dataSource(PersistenceJPAConfig.java:115) [:]
at com.company.test.PersistenceJPAConfig$$EnhancerByCGLIB$$2cad8762.CGLIB$dataSource$3(<generated>) [:]
at com.company.test.PersistenceJPAConfig$$EnhancerByCGLIB$$2cad8762$$FastClassByCGLIB$$7a8bcfa3.invoke(<generated>) [:]
at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) [:3.2.0.RELEASE]
at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:285) [:3.2.0.RELEASE]
at com.company.test.PersistenceJPAConfig$$EnhancerByCGLIB$$2cad8762.dataSource(<generated>) [:]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [:1.7.0_11]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [:1.7.0_11]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [:1.7.0_11]
at java.lang.reflect.Method.invoke(Method.java:601) [:1.7.0_11]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:160) [:3.2.0.RELEASE]
... 136 more
Caused by: java.lang.RuntimeException: javassist.CannotCompileException: by java.lang.LinkageError: loader (instance of org/jboss/classloader/spi/base/BaseClassLoader): attempted duplicate class definition for name: "com/zaxxer/hikari/proxy/ProxyFactory"
at com.zaxxer.hikari.proxy.JavassistProxyFactory.<clinit>(JavassistProxyFactory.java:58) [:]
... 148 more
Caused by: javassist.CannotCompileException: by java.lang.LinkageError: loader (instance of org/jboss/classloader/spi/base/BaseClassLoader): attempted duplicate class definition for name: "com/zaxxer/hikari/proxy/ProxyFactory"
at javassist.ClassPool.toClass(ClassPool.java:1099) [:6.1.0.Final]
at javassist.CtClass.toClass(CtClass.java:1265) [:6.1.0.Final]
at com.zaxxer.hikari.proxy.JavassistProxyFactory.modifyProxyFactory(JavassistProxyFactory.java:131) [:]
at com.zaxxer.hikari.proxy.JavassistProxyFactory.<clinit>(JavassistProxyFactory.java:54) [:]
... 148 more
Caused by: java.lang.LinkageError: loader (instance of org/jboss/classloader/spi/base/BaseClassLoader): attempted duplicate class definition for name: "com/zaxxer/hikari/proxy/ProxyFactory"
at java.lang.ClassLoader.defineClass1(Native Method) [:1.7.0_11]
at java.lang.ClassLoader.defineClass(ClassLoader.java:791) [:1.7.0_11]
at java.lang.ClassLoader.defineClass(ClassLoader.java:634) [:1.7.0_11]
at sun.reflect.GeneratedMethodAccessor131.invoke(Unknown Source) [:1.7.0_11]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [:1.7.0_11]
at java.lang.reflect.Method.invoke(Method.java:601) [:1.7.0_11]
at javassist.ClassPool.toClass2(ClassPool.java:1112) [:6.1.0.Final]
at javassist.ClassPool.toClass(ClassPool.java:1093) [:6.1.0.Final]
... 151 more
La solution 2
Sur JBOSS AS 6.1, la solution à ce problème consistait pour moi à mettre HikariCP-1.3.5.jar \server\app\lib et dans pom.xml à le définir comme provided
.Lorsque j'ai migré l'application vers WildFly 8, Hikari fonctionne comme compile
.
Autres conseils
Je suggérerais deux choses.Tout d'abord, je suggère de mettre à niveau HikariCP vers la dernière version, 1.3.5.
Deuxièmement, l'erreur semble être liée au chargeur de classe, l'exception java.lang.ExceptionInInitializerError
indique que l'initialisation de la classe statique pour HikariConfig
est exécuté deux fois d'une manière ou d'une autre.Cela ne devrait être possible que s'il existe deux chargeurs de classe faisant référence au même fichier jar HikariCP.Assurez-vous que le fichier jar HikariCP ne se trouve pas dans le répertoire de la bibliothèque globale de JBoss, mais plutôt dans le répertoire de la bibliothèque du conteneur de l'application.S'il existe plusieurs conteneurs d'application, le pot HikariCP doit être placé individuellement dans chacun d'eux.