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

Packaging Facelets (JSF 2.2) files in a JAR - Deployed as JBoss Modul (seperate deployment)

我的问题与 Packaging Facelets files (templates, includes, composites) in a JAR 几乎相同。 BalusC 对其进行了全面认证。

但我会说得更远一点。从 JBoass AS 7 开始,JB 中的 ClassLoading 发生了变化。现在有一个严格的 Modul-ClassLoading 并且它目前有效 ;)

我有一个 WAR 文件,其中有一个 jboss-deployment-structure.xml 加上一个 JAR 文件,其中包含一些 CDI-Bean 和 /META-INF/resources/modul 中的 xhtml 文件. 我分别部署了两个 "projects"(所以 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:无法找到或提供资源 /modul/modul.xhtml。

如果我将 JAR 打包到 WAR (WEB-INF/lib) 中,它将无法正常工作。

我在META-INF/resources

下提供了一张脸-config.xml

我是不是漏掉了什么?

雷格德

我使用 WildFly 9.0.1 Final 和提供的 J2EE 实现。

我找到了解决办法。问题是,如果 JAR 未打包在 WEB-INF/lib 中,则 JBoss 不会扫描它。

在我最初的问题中,我写了 "If I package the JAR into the WAR (WEB-INF/lib) it doesn't work ither." 那不是真的,我只是没有意识到我将我的文件放在 /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 第二步的线索。