3

Consistently get a ClassNotFoundException on the EmptyVisitor class when trying to load the application context for a Spring 4.3.8 application. I see that spring-asm was inlined into spring-core in 3.2, but if I look at the spring-core jar, then there are several XXXVisitor classes, but no EmptyVisitor class.

The sample code is pretty simple. :-)

public static void main(String[] args)
{
    ApplicationContext context = new ClassPathXmlApplicationContext("conf/basic/applicationContext.xml");
}

with this application context:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-4.3.xsd">

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="removed" />
        <property name="url" value="<removed>" />
        <property name="username" value="<removed>" />
        <property name="password" value="<removed>" />
    </bean>

</beans>

which generates this exception:

Apr 29, 2017 12:37:47 PM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@246b179d: startup date [Sat Apr 29 12:37:47 PDT 2017]; root of context hierarchy
Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/asm/commons/EmptyVisitor
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at org.springframework.context.support.AbstractRefreshableApplicationContext.customizeBeanFactory(AbstractRefreshableApplicationContext.java:218)
    at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129)
    at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:467)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:397)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
    at greg.aws.rds.redshift.BdlisTest.main(BdlisTest.java:21)
Caused by: java.lang.ClassNotFoundException: org.springframework.asm.commons.EmptyVisitor
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 19 more

This is the maven configuration:

<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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>greg.aws.rds</groupId>
  <artifactId>greg.aws.rds</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <build>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.5.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>6.0.6</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.3.8.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>4.3.8.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.16.16</version>
    </dependency>
  </dependencies>
</project>

1 Answers1

0

Well, doing a project in Eclipse with your configuration was informative. I'm not quite sure how your getting to a point where things compile for you, given that you're missing a vital dependency:

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.3.8.RELEASE</version>
    </dependency>

Your main method shouldn't compile - both org.springframework.context.ApplicationContext and org.springframework.context.support.ClassPathXmlApplicationContext are brought in with spring-context. My guess is that you've got an old version of Spring mixed into your runtime classpath somewhere.

Eclipse Build Path Nesting Errors, which I used to solve an issue which cropped up using your pom.xml notes that your project may have been "mavenized" - started as a regular Java project then given a Maven facet. So you should also get rid of <sourceDirectory>src</sourceDirectory>.

After I resolved the above, I reached the point of failure where the MySQL datasource wouldn't instantiate which indicates I got further along than your asm error.

Here's my mvn dependency:tree:

 [INFO] test:testart:jar:0.0.1-SNAPSHOT
 [INFO] +- mysql:mysql-connector-java:jar:6.0.6:compile
 [INFO] +- org.springframework:spring-context:jar:4.3.8.RELEASE:compile
 [INFO] |  +- org.springframework:spring-aop:jar:4.3.8.RELEASE:compile
 [INFO] |  +- org.springframework:spring-beans:jar:4.3.8.RELEASE:compile
 [INFO] |  \- org.springframework:spring-expression:jar:4.3.8.RELEASE:compile
 [INFO] +- org.springframework:spring-core:jar:4.3.8.RELEASE:compile
 [INFO] |  \- commons-logging:commons-logging:jar:1.2:compile
 [INFO] +- org.springframework:spring-jdbc:jar:4.3.8.RELEASE:compile
 [INFO] |  \- org.springframework:spring-tx:jar:4.3.8.RELEASE:compile
 [INFO] \- org.projectlombok:lombok:jar:1.16.16:compile
Community
  • 1
  • 1
Jon Sampson
  • 1,473
  • 1
  • 21
  • 31
  • 1
    Thanks @Jon Sampson. Adding spring-context to the original project go the same EmptyVisitor exception, and removing the srcDirectory config from pom.xml didn't help either. Starting over with a Maven project from scratch however did not hit the same problem. Cheers! – Greg Cottman Apr 30 '17 at 23:23