在 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 第二步的线索。
我的问题与 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 第二步的线索。