【问题标题】:Packaging Facelets (JSF 2.2) files in a JAR - Deployed as JBoss Modul (seperate deployment)在 JAR 中打包 Facelets (JSF 2.2) 文件 - 部署为 JBoss Modul(单独部署)
【发布时间】:2016-03-24 12:15:05
【问题描述】:

我的问题与Packaging Facelets files (templates, includes, composites) in a JAR 几乎相同。 Wich 完全符合 BalusC 的要求。

但我会走得更远一点。自 JBoass AS 7 以来,JB 中的 ClassLoading 发生了变化。现在有一个严格的 Modul-ClassLoading 并且到目前为止它可以工作;)

我有一个带有 jboss-deployment-structure.xml 的 WAR 文件,以及一个带有一些 CDI-Bean 和 xhtml 文件的 JAR 文件,位于 /META-INF/resources/modul。 我分别部署这两个“项目”(因此 JAR 没有打包到 WAR 中,两者都复制到 JBOSS_HOME/standalone/deployment 中)。

WAR 通过 jboss-deployment-structure.xml 将 JAR 引用为 Modul。

我能够从 JAR 中注入 CDI-Bean,但无法访问 /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 下提供了 faces-config.xml

我错过了什么吗?

问候

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

【问题讨论】:

  • @MahendranAyyarsamyKandiar 感谢您的评论。不幸的是,这不是解决方案。但我找到了一个,我很快就会遮阳篷。

标签: jsf deployment jboss


【解决方案1】:

我找到了解决方案。问题是,如果 JBoss 没有打包在 WEB-INF/lib 中,JBoss 不会扫描 JAR。

在我最初的问题中,我写过“如果我将 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,它在第二步中提供了线索。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    相关资源
    最近更新 更多