Wildfly如何使用自定义模块中的部署类

时间:2019-12-26 11:59:37

标签: java jboss wildfly wildfly-10

我正在使用undertow子系统,并为我的自定义过滤器创建了一个模块。

注册为:

module add --name=example.com.handler --resources=/home/owner/module/jbossModule.jar

在standalone.xml中添加了过滤器

<filter name="my-filter" module="example.com.handler" class-name="example.com.handler.ExampleHandler"/>

我与TestClass展开了战争。

在我的自定义过滤器ExampleHandler.java中,我正在从外部配置中读取类名,并使用Class.forName(...)创建新实例。

为了简化:

public class ExampleHandler implements HttpHandler {


    public ExampleHandler () {
    }

    @Override
    public void handleRequest(HttpServerExchange exchange) throws Exception {
          final String className = "TestClass"
          Class.forName(className).newInstance();
    }
}

但是在ExampleHandler中,找不到类TestClass并引发了ClassNotFoundException。

如何使模块能够访问部署中的类?

2 个答案:

答案 0 :(得分:0)

要使TestClass.class在war文件中可见,您必须通过jboss-deployment-structure.xml文件添加对war文件的模块依赖性。 jboss-deployment-structure.xml看起来像war文件:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<deployment>
     <dependencies>  
          <module name="example.com.handler" />       
    </dependencies>  

 </deployment>
</jboss-deployment-structure>

将此文件放在WEB-INF目录下。浏览documentation,以获取有关wildfly类加载的更多详细信息。

答案 1 :(得分:0)

Wildfly似乎将部署的classLoader放入线程contextClassLoader中。

当然,这不是一个优雅的解决方案,而是更多的技巧。但是,如果您没有任何选择:

final String className = "TestClass"
Class.forName(className, true, Thread.currentThread().getContextClassLoader())