Skip to content
Advertisement

java.lang.IllegalArgumentException referenced from a method is not visible from class loader

I obtained an exception when generated a stub for a WS service by wsimport in /target/class/….. and run a spring boot application with devtools.

Caused by: java.lang.IllegalArgumentException: com….Service referenced from a method is not visible from class loader

I found that an issue with spring devtools class loader, RestartClassLoader, because of two different references to a Class (RestartClassLoader and AppClassLoader)

private static void ensureVisible(ClassLoader ld, Class<?> c) {
    Class<?> type = null;
    try {
        type = Class.forName(c.getName(), false, ld);
    } catch (ClassNotFoundException e) {
        if (type != c) {
            throw new IllegalArgumentException(c.getName() +
                    " referenced from a method is not visible from class loader");
        }
    }
}

I was trying to add a reference to a jar file in spring-devtools.properties to restart.include=/…..jar

Spring Boot 2.0.0.RELEASE Java 9

Advertisement

Answer

Since they are generated classes you have to exclude them from Spring Devtools “restart” classloader.

  1. Create a /src/main/resources/META-INF/spring-devtools.properties file
  2. Add properties like restart.exclude.* to exclude classes from restart classloader (example, you can use restart.exclude.mygeneratedclasses=/*[generated]*.class to exclude all classes with generated word as part of package or class name)

  3. Done. Now you can use devtools and have no issues with WS generated classes.

Reference:

[1] https://github.com/spring-projects/spring-boot/issues/4529

[2] https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html#using-boot-devtools-customizing-classload

User contributions licensed under: CC BY-SA
4 People found this is helpful
Advertisement