在使用URLClassLoader加载的类上可靠地查找注释

我有一个代码生成器,它使用URLClassLoader来加载指定路径上的类,扫描它们以获取注释,然后在字段/方法上使用Reflection,生成DTO。

它在测试应用程序中运行良好。

当我把它放入Maven MOJO时,我突然失去了在类上看到javax.persistence.Entity注释的能力。 它加载它们,它可以看到所有字段,但实体注释不再可见。

我假设这与Classpath问题有关 – 是吗? 测试应用程序(插件本身中的main()函数)或MOJO都不是扫描类所来自的项目的一部分。 但是一个有效,另一个没有。

我有一些调试代码在检查它时打印出类上的所有注释,而在非运行版本中它找不到任何注释。

我是如何调试问题/解决它的?

问题结果很简单,虽然我不确定为什么它在一个案例中工作得很好而在另一个案例中却没有。

我的URLClassLoader创建没有指定父类加载器。 所以,我认为它找不到任何东西。 我一使用了

loader = new URLClassLoader(classUrls, Thread.currentThread().getContextClassLoader()); 

对于类加载器,它开始工作得很好。 当涉及到类加载器的来龙去脉时,我很无知,所以这并不明显。 特别是因为我跟随的例子没有指定父母。

扫描加载的类以进行注释时,您无法看到在类路径中找不到的注释。 也就是说,要阅读JPA的Entity注释,您的代码生成器应该在类路径中具有JPA API( javax.persistence:persistence-api:1.0 Maven中的javax.persistence:persistence-api:1.0 )。

但是,如果使用类加载器加载外部类并扫描它们以进行注释,则可能会遇到其他错过依赖项和执行静态初始化程序的问题。 可能是,更好的方法是使用字节码操作库(如ASM )来扫描类而不加载它们。

注释具有与之关联的持久性级别。 有些不能在编译时间内存活(即它们不会被放入.class文件中。)检查您引用的那些不是这种类型。

我假设这与Classpath问题有关

我敢打赌,persistence-api工件是用提供的范围声明的,并没有在传递给插件的类路径中列出。 你能证实一下吗?