我的问题与Packaging Facelets files (templates, includes, composites) in a JAR差不多。在BalusC的帮助下,Wich完全满意。
但我会走得更远。自JBoass AS 7以来,JB中的ClassLoading已经发生了变化。现在有一个严格的Modul-ClassLoading,它到目前为止工作;)
我有一个带有jboss-deployment-structure.xml的WAR文件,以及一个带有/ META-INF / resources / modul中的CDI-Beans和xhtml文件的JAR文件。 我单独部署了两个“项目”(因此JAR没有打包到WAR中,而是在JBOSS_HOME / standalone / deployment中复制)。
WAR通过jboss-deployment-structure.xml将JAR引用为模块。
我可以从JAR中注入CDI-Beans但是我无法访问/ META-INF / resources / modul /中的xhtml文件。每当我尝试加载CONTEXT_ROOT / modul / modul.xhtml时,我都会收到JB的警告:
[javax.enterprise.resource.webcontainer.jsf.application](默认任务-5)JSF1064:无法找到或提供Ressource /modul/modul.xhtml。
如果我将JAR打包到WAR(WEB-INF / lib)中,它就不会工作了。
我在META-INF / resources
下提供了faces-config.xml我是否想念一些想法?
reggards
我使用WildFly 9.0.1 Final和提供的J2EE实现。
答案 0 :(得分:0)
我找到了解决方案。问题是,如果JBAR没有打包在WEB-INF / lib中,JBoss不会扫描JAR。
在我最初的问题中,我写了#34;如果我将JAR打包到WAR(WEB-INF / lib)中,它就不会工作了。"这不是真的我只是没有认识到我把我的文件放在/ META-INF / modul而不是/ META-INF / resources / modul。我移动了文件,如果我将JAR放在WEB-INF / lib中,它就会开始工作。
但单独部署的问题仍然存在。
现在我使用自定义ResourceHandler(JSF 2.2方式),它就像魅力一样。
我所有的模块都必须实现一个接口。通过这种方式,我能够通过CDI注入所有这些实例。现在我迭代所有模块并寻找我的资源。 ResourceHandler放在WAR中而不是单个JAR中。以这种方式,我只需要实现它一次。
这是我的代码示例:
public class ExternalResourceHandler extends ResourceHandler {
@Inject
@Any
Instance<ModulDescriptor> moduls;
private ResourceHandler parent;
private String basePath = "META-INF/resources";
public ExternalResourceHandler() {
}
public ExternalResourceHandler(ResourceHandler parent) {
this.parent = parent;
}
@Override
public ViewResource createViewResource(FacesContext context, String resourceName) {
System.out.println("Invoked for: " + resourceName);
ViewResource resource = parent.createViewResource(context, resourceName);
if (resource == null) {
System.out.println("Parent failed");
if (moduls != null) {
for (ModulDescriptor mod : moduls) {
URL url = mod.getClass().getClassLoader().getResource(basePath + resourceName);
if (url != null) {
return new ViewResource() {
@Override
public URL getURL() {
return url;
}
};
}
}
} else {
System.out.println("INJECTION IS NULL");
}
}
return resource;
}
//followed by all other overriden methods wich return null ;)
}
感谢@BalusC为这个awnser做了第二步的线索。