我正在尝试使用Reflections库扫描类,如果我将Dynamic Web项目添加到另一个项目(普通Java项目),我会得到我想要的类,但是如果在@Startup
bean中运行,它是空。
这是代码:
Reflections reflections = new Reflections(
new ConfigurationBuilder().filterInputsBy(
new FilterBuilder.Include(
FilterBuilder.prefix("my.package")
)
).setUrls(
ClasspathHelper.forJavaClassPath()
).setScanners(
new SubTypesScanner(false)
)
);
Set<Class<? extends Object>> testClasses = reflections.getSubTypesOf(Object.class);
应该将电视,goopi更改为使用的任何包前缀。
testClasses
Set
为空。
如果相同的代码在引用此项目的不同项目中运行,没有其他更改,则Set
将填充程序包中的所有类。
反思的Maven依赖是:
<dependency>
<groupId>org.reflections</groupId>
<artifactId>reflections</artifactId>
<version>0.9.9-RC1</version>
</dependency>
Wildfly 8.2.0。 现在,我可以保存在外部项目中提取的文件并使用load函数,但这不应该是动态的。
答案 0 :(得分:0)
我在这个问题上挣扎了很长一段时间,它似乎是由于它的工作方式,没有获得完整的java类路径(使它非常重),你应该稍后加载反射。这主要是由于在EJB初始化阶段创建动态类,包括Startup bean。
加载完整的类路径(来自启动bean)
urls.addAll(ClasspathHelper.forJavaClassPath());
让它穿过JEE友好, 例如wild-fly,你需要从Servlet Context监听器反映出来。对我来说,正确的位置在构造函数中,但静态字段可能有效。
public class GuiceContext implements ServletContextListener
{
@Override
public void contextInitialized(ServletContextEvent servletContextEvent)
{
ClasspathHelper.forWebInfLib(servletContextEvent.getServletContext());
ClasspathHelper.forWebInfClasses(servletContextEvent.getServletContext());
}
尝试让bean在没有依赖项的情况下独立初始化。您也可以使用像Guice这样的自定义注入器来推送您的bean。在这种情况下,您将使用GuiceServletContextListener类。
您排除了Object.class的直接排除,此实例中的此启动Bean可能因此而未加载。
new SubTypesScanner(false);