Question

I have a Linkage Error when i start JBOSS AS 6.1 with a HikariDataSource. How to solve this?

I use 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 (bundled with JBOSS). I removed persistence.xml and confgiure my DataSource programatically using LocalContainerEntityManagerFactoryBean approach from: http://www.baeldung.com/2011/12/13/the-persistence-layer-with-spring-3-1-and-jpa/

My DS i configured simply:

   @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;
   }

And the end of stacktrace is:

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
Was it helpful?

Solution 2

On JBOSS AS 6.1 the solution to this problem was for me putting HikariCP-1.3.5.jar \server\app\lib and in pom.xml set it as provided. When i migrated the application to WildFly 8 Hikari works as compile.

OTHER TIPS

I would suggest two things. First, I suggest upgrading HikariCP to the latest version, 1.3.5.

Second, the error appears to be classloader related, the exception java.lang.ExceptionInInitializerError indicates that the static class initialization for HikariConfig is being executed twice somehow. This should only be possible if there are two classloaders referencing the same HikariCP jar. Ensure that the HikariCP jar is not located in the global library directory for JBoss, but is instead located in the container library directory of the application. If there are multiple application containers, the HikariCP jar should be located in each of them individually.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top