我正在使用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。
如何使模块能够访问部署中的类?
答案 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())