Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ClassCastException: AnnotationDAGNode cannot be cast to InterfaceDAGNode #38

Closed
moldowan opened this issue Jan 4, 2016 · 21 comments
Closed

Comments

@moldowan
Copy link

moldowan commented Jan 4, 2016

This is a regression since 1.9.12, probably caused by #30:

java.lang.ClassCastException: io.github.lukehutch.fastclasspathscanner.classgraph.AnnotationDAGNode cannot be cast to io.github.lukehutch.fastclasspathscanner.classgraph.InterfaceDAGNode
        at io.github.lukehutch.fastclasspathscanner.classgraph.StandardClassDAGNode.connect(StandardClassDAGNode.java:66)
        at io.github.lukehutch.fastclasspathscanner.classgraph.ClassGraphBuilder.<init>(ClassGraphBuilder.java:72)
        at io.github.lukehutch.fastclasspathscanner.FastClasspathScanner.scan(FastClasspathScanner.java:1284)

I suppose this happens when an annotation class is encountered (or "matched"?).

Possible hint: Class.isInterface() also returns true for annotations not just for regular interfaces!

@lukehutch
Copy link
Member

I ran the unit tests on the latest release (1.9.13), and I don't see this exception. You're right to point out that Class.isInterface() also returns true for annotations not just for regular interfaces -- I did run into that at one point, and introduced the following change, which should cause annotations not to be treated as interfaces:

https://github.com/lukehutch/fast-classpath-scanner/blob/master/src/main/java/io/github/lukehutch/fastclasspathscanner/classgraph/ClassfileBinaryParser.java#L263

This was committed in 1.9.10 though, so if you're using a version more recent than that, there must be another problem triggering this.

Can you please try to create a minimal testcase that triggers this exception?

@moldowan
Copy link
Author

moldowan commented Jan 5, 2016

My first attempts to extract a minimal testcase failed. This seems to be a tough one!
I will try to debug...

@moldowan
Copy link
Author

moldowan commented Jan 6, 2016

I found the problem:
We have some classes implementing annotations and fast-classpath-scanner seems to treat everything as an interface which comes after implements.

See attached showcase:
fast-classpath-scanner-issue-38-showcase.zip

PS: See the JavaDoc of javax.enterprise.util.AnnotationLiteral for more info why we implement annotations at all.

@lukehutch
Copy link
Member

Thanks for figuring this out, and for the testcase, but ugh! I didn't know
this was even possible.

I guess I need to make annotations and interfaces share an
AnnorationOrInterface superclass or something...
On Jan 6, 2016 1:39 AM, "moldowan" notifications@github.com wrote:

I found the problem:
We have some classes implementing annotations and fast-classpath-scanner
seems to treat everything as an interface which comes after implements.

See attached showcase:
fast-classpath-scanner-issue-38-showcase.zip
https://github.com/lukehutch/fast-classpath-scanner/files/79600/fast-classpath-scanner-issue-38-showcase.zip

PS: See the JavaDoc of javax.enterprise.util.AnnotationLiteral for more
info why we implement annotations at all.


Reply to this email directly or view it on GitHub
#38 (comment)
.

@lukehutch
Copy link
Member

Fixed, and I incorporated your test directly -- thanks for reporting this, and for providing the minimal testcase.

@moldowan
Copy link
Author

moldowan commented Jan 7, 2016

Fix confirmed, thanks!

@erikhakansson
Copy link

@lukehutch
Copy link
Member

Thanks for the report, Erik -- could you please provide the minimal code necessary to reproduce this?

@lukehutch lukehutch reopened this Mar 11, 2016
@lukehutch
Copy link
Member

@erikhakansson This is fixed in 1.9.18, please let me know if you have further issues. Thanks for the report.

@kdeng
Copy link

kdeng commented May 14, 2016

In 1.9.18, I still get the error as below.
The specific error message is: java.lang.ClassCastException:io.github.lukehutch.fastclasspathscanner.classgraph.StandardClassDAGNode cannot be cast to io.github.lukehutch.fastclasspathscanner.classgraph.InterfaceDAGNode.

Code is really simple.

new FastClasspathScanner().matchFilenamePattern("base.properties$", new FileMatchProcessor() { public void processMatch(String relativePath, InputStream inputStream, int lengthBytes) throws IOException { log.debug("Found {}", relativePath); } }).scan();

@lukehutch
Copy link
Member

lukehutch commented May 14, 2016

Thanks, reopening. Can you please run after calling .verbose(), and paste the output here, or even better, run it in a debugger and let me know which class is being processed when the error occurs? I need to figure out which class in your classpath is causing this. Thanks!

@lukehutch lukehutch reopened this May 14, 2016
lukehutch added a commit that referenced this issue May 15, 2016
@lukehutch
Copy link
Member

I tried your exact code, and could not reproduce. You must have something funky in your classpath. I just committed some changes that will report more useful errors in this case. Can you please check out the latest git head version, and paste the full stack trace here, along with the output of the run using .verbose()? That will help me fix the problem. Thank you!

@kdeng
Copy link

kdeng commented May 15, 2016

Yes. Will do it shortly.

@kdeng
Copy link

kdeng commented May 15, 2016

java.lang.RuntimeException: Expected DAGNode for class org.apache.log4j.spi.ErrorHandler to be of type io.github.lukehutch.fastclasspathscanner.classgraph.InterfaceDAGNode but got type io.github.lukehutch.fastclasspathscanner.classgraph.StandardClassDAGNode
    at io.github.lukehutch.fastclasspathscanner.classgraph.DAGNode.getDAGNodeOfType(DAGNode.java:93)
    at io.github.lukehutch.fastclasspathscanner.classgraph.StandardClassDAGNode.connect(StandardClassDAGNode.java:75)
    at io.github.lukehutch.fastclasspathscanner.classgraph.ClassGraphBuilder.<init>(ClassGraphBuilder.java:144)
    at io.github.lukehutch.fastclasspathscanner.FastClasspathScanner.scan(FastClasspathScanner.java:1422)
    at io.osnz.westore.jawr.JawrConfig$GeneratedEvaluationClass.invoke(JawrConfig.java:53)
    at io.osnz.westore.jawr.JawrConfig.<init>(JawrConfig.java:26)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
    at java.lang.Class.newInstance(Class.java:442)
    at net.jawr.web.resource.bundle.factory.util.ClassLoaderResourceUtils.buildObjectInstance(ClassLoaderResourceUtils.java:260)
    at net.jawr.web.resource.bundle.factory.util.ClassLoaderResourceUtils.buildObjectInstance(ClassLoaderResourceUtils.java:246)
    at net.jawr.web.servlet.JawrRequestHandler.initConfigPropertiesSource(JawrRequestHandler.java:419)
    at net.jawr.web.servlet.JawrRequestHandler.initRequestHandler(JawrRequestHandler.java:273)
    at net.jawr.web.servlet.JawrRequestHandler.<init>(JawrRequestHandler.java:236)
    at net.jawr.web.servlet.JawrBinaryResourceRequestHandler.<init>(JawrBinaryResourceRequestHandler.java:129)
    at net.jawr.web.servlet.JawrSpringController.afterPropertiesSet(JawrSpringController.java:242)
    at io.osnz.westore.jawr.JawrBinaryController.afterPropertiesSet(JawrBinaryController.java:49)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:354)
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:305)
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:133)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:408)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1570)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
    at org.springframework.boot.context.embedded.ServletContextInitializerBeans.getOrderedBeansOfType(ServletContextInitializerBeans.java:233)
    at org.springframework.boot.context.embedded.ServletContextInitializerBeans.addAsRegistrationBean(ServletContextInitializerBeans.java:181)
    at org.springframework.boot.context.embedded.ServletContextInitializerBeans.addAdaptableBeans(ServletContextInitializerBeans.java:162)
    at org.springframework.boot.context.embedded.ServletContextInitializerBeans.<init>(ServletContextInitializerBeans.java:79)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.getServletContextInitializerBeans(EmbeddedWebApplicationContext.java:237)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.selfInitialize(EmbeddedWebApplicationContext.java:224)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.access$000(EmbeddedWebApplicationContext.java:85)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext$1.onStartup(EmbeddedWebApplicationContext.java:209)
    at org.springframework.boot.context.embedded.jetty.ServletContextInitializerConfiguration$Initializer.callInitializers(ServletContextInitializerConfiguration.java:83)
    at org.springframework.boot.context.embedded.jetty.ServletContextInitializerConfiguration$Initializer.doStart(ServletContextInitializerConfiguration.java:72)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:106)
    at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61)
    at org.eclipse.jetty.server.handler.ScopedHandler.doStart(ScopedHandler.java:120)
    at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:784)
    at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:294)
    at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1349)
    at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1342)
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:741)
    at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:505)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132)
    at org.eclipse.jetty.server.Server.start(Server.java:387)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114)
    at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61)
    at org.eclipse.jetty.server.Server.doStart(Server.java:354)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at org.springframework.boot.context.embedded.jetty.JettyEmbeddedServletContainer.initialize(JettyEmbeddedServletContainer.java:85)
    at org.springframework.boot.context.embedded.jetty.JettyEmbeddedServletContainer.<init>(JettyEmbeddedServletContainer.java:74)
    at org.springframework.boot.context.embedded.jetty.JettyEmbeddedServletContainerFactory.getJettyEmbeddedServletContainer(JettyEmbeddedServletContainerFactory.java:472)
    at org.springframework.boot.context.embedded.jetty.JettyEmbeddedServletContainerFactory.getEmbeddedServletContainer(JettyEmbeddedServletContainerFactory.java:163)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:160)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:130)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:532)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:766)
    at org.springframework.boot.SpringApplication.createAndRefreshContext(SpringApplication.java:361)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:307)

@lukehutch
Copy link
Member

lukehutch commented May 15, 2016

Thanks, can you please let me know which version and distribution channel
(Maven etc.) that you're using for log4j, so I can test with the the same
version?

Is it possible you're pulling in two different versions of log4j based on
transitive Maven dependencies? It looks like you may have one version
where org.apache.log4j.spi.ErrorHandler is an interface, and another
version (maybe an older version) where org.apache.log4j.spi.ErrorHandler is
a class.

I may need to support this case anyway, because I have come across one
build system that produces stripped-down jar files where concrete classes
are turned into interfaces.
On May 15, 2016 4:31 AM, "Kefeng Deng" notifications@github.com wrote:

java.lang.RuntimeException: Expected DAGNode for class
org.apache.log4j.spi.ErrorHandler to be of type
io.github.lukehutch.fastclasspathscanner.classgraph.InterfaceDAGNode but
got type
io.github.lukehutch.fastclasspathscanner.classgraph.StandardClassDAGNode
at
io.github.lukehutch.fastclasspathscanner.classgraph.DAGNode.getDAGNodeOfType(DAGNode.java:93)
at
io.github.lukehutch.fastclasspathscanner.classgraph.StandardClassDAGNode.connect(StandardClassDAGNode.java:75)
at
io.github.lukehutch.fastclasspathscanner.classgraph.ClassGraphBuilder.(ClassGraphBuilder.java:144)
at
io.github.lukehutch.fastclasspathscanner.FastClasspathScanner.scan(FastClasspathScanner.java:1422)
at
io.osnz.westore.jawr.JawrConfig$GeneratedEvaluationClass.invoke(JawrConfig.java:53)
at io.osnz.westore.jawr.JawrConfig.(JawrConfig.java:26)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at java.lang.Class.newInstance(Class.java:442)
at
net.jawr.web.resource.bundle.factory.util.ClassLoaderResourceUtils.buildObjectInstance(ClassLoaderResourceUtils.java:260)
at
net.jawr.web.resource.bundle.factory.util.ClassLoaderResourceUtils.buildObjectInstance(ClassLoaderResourceUtils.java:246)
at
net.jawr.web.servlet.JawrRequestHandler.initConfigPropertiesSource(JawrRequestHandler.java:419)
at
net.jawr.web.servlet.JawrRequestHandler.initRequestHandler(JawrRequestHandler.java:273)
at
net.jawr.web.servlet.JawrRequestHandler.(JawrRequestHandler.java:236)
at
net.jawr.web.servlet.JawrBinaryResourceRequestHandler.(JawrBinaryResourceRequestHandler.java:129)
at
net.jawr.web.servlet.JawrSpringController.afterPropertiesSet(JawrSpringController.java:242)
at
io.osnz.westore.jawr.JawrBinaryController.afterPropertiesSet(JawrBinaryController.java:49)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at
org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:354)
at
org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:305)
at
org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:133)
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:408)
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1570)
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
at
org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
at
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
at
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
at
org.springframework.boot.context.embedded.ServletContextInitializerBeans.getOrderedBeansOfType(ServletContextInitializerBeans.java:233)
at
org.springframework.boot.context.embedded.ServletContextInitializerBeans.addAsRegistrationBean(ServletContextInitializerBeans.java:181)
at
org.springframework.boot.context.embedded.ServletContextInitializerBeans.addAdaptableBeans(ServletContextInitializerBeans.java:162)
at
org.springframework.boot.context.embedded.ServletContextInitializerBeans.(ServletContextInitializerBeans.java:79)
at
org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.getServletContextInitializerBeans(EmbeddedWebApplicationContext.java:237)
at
org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.selfInitialize(EmbeddedWebApplicationContext.java:224)
at
org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.access$000(EmbeddedWebApplicationContext.java:85)
at
org.springframework.boot.context.embedded.EmbeddedWebApplicationContext$1.onStartup(EmbeddedWebApplicationContext.java:209)
at
org.springframework.boot.context.embedded.jetty.ServletContextInitializerConfiguration$Initializer.callInitializers(ServletContextInitializerConfiguration.java:83)
at
org.springframework.boot.context.embedded.jetty.ServletContextInitializerConfiguration$Initializer.doStart(ServletContextInitializerConfiguration.java:72)
at
org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
at
org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132)
at
org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:106)
at
org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61)
at
org.eclipse.jetty.server.handler.ScopedHandler.doStart(ScopedHandler.java:120)
at
org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:784)
at
org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:294)
at
org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1349)
at
org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1342)
at
org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:741)
at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:505)
at
org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
at
org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132)
at org.eclipse.jetty.server.Server.start(Server.java:387)
at
org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114)
at
org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61)
at org.eclipse.jetty.server.Server.doStart(Server.java:354)
at
org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
at
org.springframework.boot.context.embedded.jetty.JettyEmbeddedServletContainer.initialize(JettyEmbeddedServletContainer.java:85)
at
org.springframework.boot.context.embedded.jetty.JettyEmbeddedServletContainer.(JettyEmbeddedServletContainer.java:74)
at
org.springframework.boot.context.embedded.jetty.JettyEmbeddedServletContainerFactory.getJettyEmbeddedServletContainer(JettyEmbeddedServletContainerFactory.java:472)
at
org.springframework.boot.context.embedded.jetty.JettyEmbeddedServletContainerFactory.getEmbeddedServletContainer(JettyEmbeddedServletContainerFactory.java:163)
at
org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:160)
at
org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:130)
at
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:532)
at
org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
at
org.springframework.boot.SpringApplication.refresh(SpringApplication.java:766)
at
org.springframework.boot.SpringApplication.createAndRefreshContext(SpringApplication.java:361)
at
org.springframework.boot.SpringApplication.run(SpringApplication.java:307)


You are receiving this because you modified the open/close state.
Reply to this email directly or view it on GitHub
#38 (comment)

@kdeng
Copy link

kdeng commented May 16, 2016

Yes. You are right.

I just re-checked my dependency tree, and find it loads both log4j-over-slf4j and slf4j-log4j12. I have excluded "slf4j-log4j12", and now it works fine under version 1.9.18.

Many thanks for your supports.

@lukehutch
Copy link
Member

Great, thanks for checking. I'm making the scanner resilient to this sort of situation, the changes will be in the next release. Thanks for your report!

@kdeng
Copy link

kdeng commented May 16, 2016

That's great...thanks alot.

@lukehutch
Copy link
Member

Fixed for good in 1.9.19 (the way the class graph is built is a lot more flexible now, and this shouldn't happen again).

@kdeng
Copy link

kdeng commented Jun 8, 2016

That's great, and many thanks for your work.

@lukehutch
Copy link
Member

No problem, I rely on reports from people like yourselves to make
FastClasspathScanner better, so thank you too.
On Jun 8, 2016 2:15 PM, "Kefeng Deng" notifications@github.com wrote:

That's great, and many thanks for your work.


You are receiving this because you modified the open/close state.
Reply to this email directly, view it on GitHub
#38 (comment),
or mute the thread
https://github.com/notifications/unsubscribe/AAxhKXKEliAvmTliYnUWw7cadI61l8Rmks5qJzDXgaJpZM4G-DJA
.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants