WildFly - 从 WAR 获取资源

Nik*_*dun 5 java jboss getresource wildfly-8

我使用以下方法从 WildFly 的 WAR 文件中获取资源:

this.getClass().getResource(relativePath)
Run Code Online (Sandbox Code Playgroud)

当应用程序部署为爆炸式 WAR 时,它会起作用。它曾经也适用于压缩的 WAR。昨天,我在 Eclipse 中对项目进行了清理和重建,但它刚刚停止工作。

当我检查资源根目录时:

logger.info(this.getClass().getResource("/").toExternalForm());
Run Code Online (Sandbox Code Playgroud)

我明白了:

file:/C:/JBoss/wildfly8.1.0.CR1/modules/system/layers/base/org/jboss/as/ejb3/main/timers/
Run Code Online (Sandbox Code Playgroud)

所以,难怪它不起作用。它可能与 JBoss 模块加载有关,但我不知道这是错误还是正常行为。

我在 StackOverflow 上发现了各种类似的问题,但没有适用的解决方案。建议之一是像这样使用 ServletContext:

@Resource
private WebServiceContext wsContext;
...
ServletContext servletContext = (ServletContext)this.wsContext.getMessageContext()
        .get(MessageContext.SERVLET_CONTEXT);
servletContext.getResource(resourcePath);
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试以这种方式获取 MessageContext 时,我得到了一个 IllegalStateException。所以我基本上被卡住了。有任何想法吗?

Nik*_*dun 1

我最终放弃了,并将我的资源文件放入新的 JBoss 模块中,如此链接中所述。

https://community.jboss.org/wiki/HowToPutAnExternalFileInTheClasspath

它可以工作,但缺点是有两个部署目标,因此事情更加复杂。从好的方面来说,WAR 文件的大小减小了,并且如果只有部分资源发生了更改,我不必重新部署应用程序。