You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@maven.apache.org by Petar Tahchiev <pa...@gmail.com> on 2015/02/11 10:03:54 UTC

Classloader issues

Hi there,

I have the following maven project setup:

master
    |----> module1
        |----> class ClassA (has annotation @Annotation)
    |----> module2
        |----> class ClassB (also has annotation @Annotation)

and I'm building it with maven, and I use an AbstractProcessor during
compilation to find all types annotated with @Annotation. When I build it
from the module1 level it all works fine. The problem appears when I build
it from master level. Then, what happens is I get an exception that class B
cannot be found.

Caused by: org.reflections.ReflectionsException: could not get type
for name ClassB
    at org.reflections.ReflectionUtils.forName(ReflectionUtils.java:389)
    at org.reflections.ReflectionUtils.forNames(ReflectionUtils.java:398)
    at org.reflections.Reflections.getTypesAnnotatedWith(Reflections.java:385)
    at org.reflections.Reflections.getTypesAnnotatedWith(Reflections.java:370)

Here's how I find the types annotated with @Annotation:

 final Reflections reflections =
                        new Reflections(new
ConfigurationBuilder().setUrls(ClasspathHelper.forClassLoader(ClasspathHelper.staticClassLoader())).setScanners(
                                        new TypeAnnotationsScanner(),
new SubTypesScanner()));
        return reflections.getTypesAnnotatedWith(Annotation.class);

What happens is that the classloader will find all the jars in my pom.xml
AND also the following url:

/home/petar/workspace/master/./

and then it will be given to Reflections (method scan on line 235 in
Reflections class ) where it will be treated as a SystemDir so reflections
will recursively go thorough all the subfolders and add all the classes it
finds (which also includes module2/target/classes/ClassB.class). Then it
will try to load it and it will produce the error I pasted above. Now i'm
not sure who's passing the master folder to the classpath, but I checked
the maven classpath with -X and I don't see this folder coming from maven.

Any idea who's adding this folder in the classpath, and also how can I
disable adding it?

Thanks a lot.

-- 
Regards, Petar!
Karlovo, Bulgaria.
---
Public PGP Key at:
https://keyserver1.pgp.com/vkd/DownloadKey.event?keyid=0x19658550C3110611
Key Fingerprint: A369 A7EE 61BC 93A3 CDFF  55A5 1965 8550 C311 0611