在JAR中打包Facelets(JSF 2.2)文件 - 部署为JBoss Modul(单独部署)

时间:2015-12-17 21:28:23

标签: jsf deployment jboss

我的问题与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实现。

1 个答案:

答案 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做了第二步的线索。