Wildfly 8.0.2内的反射库

时间:2015-03-14 05:28:32

标签: java reflection wildfly-8

我正在尝试使用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函数,但这不应该是动态的。

1 个答案:

答案 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);

可以在https://github.com/GedMarc/GuiceInjection

找到包含org.reflections和guice的完整库。