Even after adding only JSF 1.1 jars on compile classpath of wlappc the generated java classes are not running correctly on Weblogic 12c. There seems to be problem with classpath of wlappc which is not respecting filtering classloader of weblogic.xml descriptor.
Problem can be solved by adding precompile to
Weblogic appc
http://docs.oracle.com/cd/E24329_01/web.1211/e24973/appc_ejbc.htm
Add option to check class loading
http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/java.html
JSP page
Compile using MyFaces libs in WEB-INF/lib
Alternative ant script
Compile using JSF 1.2 deployable library
Difference between MyFaces and JSF 1.2 compilation
Check from where are classed loaded
weblogic.appc
myfaces
Extract appc class
Disassemble class files using javap
Problem can be solved by adding precompile to
jsp-descriptor
element of weblogic.xml precompile | When set to true, WebLogic Server automatically precompiles all modified JSPs when the Web application is deployed or re-deployed or when starting WebLogic Server |
precompile-continueWhen set to true, WebLogic Server continues precompiling all modified JSPs even if some of those JSPs fail during compilation. Only takes effect when precompile is set to true. |
Weblogic appc
http://docs.oracle.com/cd/E24329_01/web.1211/e24973/appc_ejbc.htm
Add option to check class loading
http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/java.html
- -verbose:class
- Display information about each class loaded.
JSP page
<%@ page language="java" contentType="text/html;charset=UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<f:view>
<f:loadBundle basename="resources.application" var="msg"/>
<html>
<head>
<title><h:outputText value="#{msg.welcomeTitle}" /></title>
</head>
<body>
<h3><h:outputText value="#{msg.welcomeHeading}" /></h3>
<p><h:outputText value="#{msg.welcomeMessage}" /></p>
</body>
</html>
</f:view>
Compile using MyFaces libs in WEB-INF/lib
[dave@dave config]$ java weblogic.appc -verboseJavac -verbose ~/workspace/testFSF11/WebContent/
[JspcInvoker]Checking web app for compliance.
<Feb 6, 2013 11:39:24 PM CET> <Info> <HTTP> <BEA-101047> <[ComplianceChecker] Validating the servlet element with servlet-name named "Faces Servlet".>
<Feb 6, 2013 11:39:24 PM CET> <Info> <HTTP> <BEA-101047> <[ComplianceChecker] Checking servlet-mapping for servlet name : "Faces Servlet".>
[jspc] -webapp specified, searching . for JSPs
[jspc] Compiling /index.jsp
<Feb 6, 2013 11:39:29 PM CET> <Info> <J2EE> <BEA-160220> <Compilation completed successfully.>
Alternative ant script
<project name="Appc" default="appc" basedir="./">
<property environment="env"/>
<target name="appc" description="Packages the WAR file">
<!-- Precompile JSP pages using appc -->
<echo message="Precompile JSP pages using appc in WebContent" />
<path id="wlappc.classpath">
<fileset dir="${env.WL_HOME}/server/lib">
<include name="weblogic.jar" />
</fileset>
</path>
<path id="compile.classpath">
<fileset dir="WebContent/WEB-INF/lib">
<include name="*.jar" />
</fileset>
</path>
<echo message="${toString:wlappc.classpath}" />
<echo message="${toString:compile.classpath}" />
<taskdef name="wlappc" classname="weblogic.ant.taskdefs.j2ee.Appc"
classpathref="wlappc.classpath" />
<wlappc verbose="true" keepGenerated="true" source="WebContent"
verboseJavac="true"
classpathref="compile.classpath">
</wlappc>
</target>
[dave@dave testFSF11]$ ant
Buildfile: build.xml
appc:
[echo] Precompile JSP pages using appc in WebContent
[echo] /opt/weblogic/wlserver_12.1/server/lib/weblogic.jar
[echo] /home/dave/workspace/testFSF11/WebContent/WEB-INF/lib/commons-beanutils-1.7.0.jar:/home/dave/workspace/testFSF11/WebContent/WEB-INF/lib/commons-collections-3.1.jar:/home/dave/workspace/testFSF11/WebContent/WEB-INF/lib/commons-digester-1.8.jar:/home/dave/workspace/testFSF11/WebContent/WEB-INF/lib/commons-el-1.0.jar:/home/dave/workspace/testFSF11/WebContent/WEB-INF/lib/commons-lang-2.1.jar:/home/dave/workspace/testFSF11/WebContent/WEB-INF/lib/commons-logging-1.1.1.jar:/home/dave/workspace/testFSF11/WebContent/WEB-INF/lib/jstl-1.1.0.jar:/home/dave/workspace/testFSF11/WebContent/WEB-INF/lib/myfaces-api-1.1.10.jar:/home/dave/workspace/testFSF11/WebContent/WEB-INF/lib/myfaces-impl-1.1.10.jar
[wlappc] [JspcInvoker]Checking web app for compliance.
[wlappc] <Feb 6, 2013 11:51:12 PM CET> <Info> <HTTP> <BEA-101047> <[ComplianceChecker] Validating the servlet element with servlet-name named "Faces Servlet".>
[wlappc] <Feb 6, 2013 11:51:12 PM CET> <Info> <HTTP> <BEA-101047> <[ComplianceChecker] Checking servlet-mapping for servlet name : "Faces Servlet".>
[wlappc] [jspc] Overriding descriptor option 'keepgenerated' with value specified on command-line 'true'
[wlappc] [jspc] -webapp specified, searching . for JSPs
[wlappc] [jspc] Compiling /index.jsp
[wlappc] <Feb 6, 2013 11:51:18 PM CET> <Info> <J2EE> <BEA-160220> <Compilation completed successfully.>
BUILD SUCCESSFUL
Total time: 10 seconds
Compile using JSF 1.2 deployable library
[dave@dave testJSF1]$ java weblogic.appc -keepGenerated -verboseJavac -verbose -library /opt/weblogic/wlserver_12.1/common/deployable-libraries/jsf-1.2.war WebContent/
<Feb 7, 2013 12:52:28 AM CET> <Info> <J2EE> <BEA-160151> <Registered library Extension-Name: jsf, Specification-Version: 1.2, Implementation-Version: 1.2.9.0 (WAR).>
Unresolved WebApp library references defined in weblogic.xml, of module 'WebContent' [Extension-Name: jstl, Specification-Version: 1.2, exact-match: true]
[dave@dave testJSF1]$ java weblogic.appc -keepGenerated -verboseJavac -verbose -library /opt/weblogic/wlserver_12.1/common/deployable-libraries/jsf-1.2.war,/opt/weblogic/wlserver_12.1/common/deployable-libraries/jstl-1.2.war WebContent/
<Feb 7, 2013 12:53:07 AM CET> <Info> <J2EE> <BEA-160151> <Registered library Extension-Name: jsf, Specification-Version: 1.2, Implementation-Version: 1.2.9.0 (WAR).>
<Feb 7, 2013 12:53:07 AM CET> <Info> <J2EE> <BEA-160151> <Registered library Extension-Name: jstl, Specification-Version: 1.2, Implementation-Version: 1.2.0.2 (WAR).>
[JspcInvoker]Checking web app for compliance.
<Feb 7, 2013 12:53:10 AM CET> <Info> <HTTP> <BEA-101047> <[ComplianceChecker] Validating the servlet element with servlet-name named "Faces Servlet".>
<Feb 7, 2013 12:53:10 AM CET> <Info> <HTTP> <BEA-101047> <[ComplianceChecker] Checking servlet-mapping for servlet name : "Faces Servlet".>
[jspc] Overriding descriptor option 'keepgenerated' with value specified on command-line 'true'
[jspc] -webapp specified, searching . for JSPs
[jspc] Compiling /index.jsp
<Feb 7, 2013 12:53:14 AM CET> <Info> <J2EE> <BEA-160220> <Compilation completed successfully.>
Difference between MyFaces and JSF 1.2 compilation
[dave@dave workspace]$ diff testJSF1/WebContent/WEB-INF/classes/jsp_servlet/__index.java testFSF11/WebContent/WEB-INF/classes/jsp_servlet/__index.java
32c32
< if (sci.isResourceStale("/index.jsp", 1359883373000L ,"12.1.1.0","Europe/Bratislava")) return true;
---
> if (sci.isResourceStale("/index.jsp", 1359886357000L ,"12.1.1.0","Europe/Bratislava")) return true;
105c105
< com.sun.faces.taglib.jsf_core.ViewTag __tag0 = null ;
---
> org.apache.myfaces.taglib.core.ViewTag __tag0 = null ;
109c109
< __tag0 = new com.sun.faces.taglib.jsf_core.ViewTag ();
---
> __tag0 = new org.apache.myfaces.taglib.core.ViewTag ();
116d115
< __tag0.setJspId("id0");
165c164
< private boolean _jsp__tag1(javax.servlet.ServletRequest request, javax.servlet.ServletResponse response, javax.servlet.jsp.PageContext pageContext, javax.servlet.jsp.tagext.JspTag activeTag, com.sun.faces.taglib.jsf_core.ViewTag parent) throws java.lang.Throwable
---
> private boolean _jsp__tag1(javax.servlet.ServletRequest request, javax.servlet.ServletResponse response, javax.servlet.jsp.PageContext pageContext, javax.servlet.jsp.tagext.JspTag activeTag, org.apache.myfaces.taglib.core.ViewTag parent) throws java.lang.Throwable
170c169
< com.sun.faces.taglib.jsf_core.LoadBundleTag __tag1 = null ;
---
> org.apache.myfaces.taglib.core.LoadBundleTag __tag1 = null ;
174c173
< __tag1 = new com.sun.faces.taglib.jsf_core.LoadBundleTag ();
---
> __tag1 = new org.apache.myfaces.taglib.core.LoadBundleTag ();
179c178
< __tag1.setBasename( weblogic.servlet.jsp.ELHelper.createValueExpression("resources.application",java.lang.String.class,pageContext,_jspx_fnmap));
---
> __tag1.setBasename(( java.lang.String) weblogic.jsp.internal.jsp.utils.JspRuntimeUtils.convertType("resources.application", java.lang.String.class,"basename"));
186c185
< throw new javax.servlet.jsp.JspTagException("Since tag class com.sun.faces.taglib.jsf_core.LoadBundleTag does not implement BodyTag, it cannot return BodyTag.EVAL_BODY_BUFFERED");
---
> throw new javax.servlet.jsp.JspTagException("Since tag class org.apache.myfaces.taglib.core.LoadBundleTag does not implement BodyTag, it cannot return BodyTag.EVAL_BODY_BUFFERED");
200c199
< private boolean _jsp__tag2(javax.servlet.ServletRequest request, javax.servlet.ServletResponse response, javax.servlet.jsp.PageContext pageContext, javax.servlet.jsp.tagext.JspTag activeTag, com.sun.faces.taglib.jsf_core.ViewTag parent) throws java.lang.Throwable
---
> private boolean _jsp__tag2(javax.servlet.ServletRequest request, javax.servlet.ServletResponse response, javax.servlet.jsp.PageContext pageContext, javax.servlet.jsp.tagext.JspTag activeTag, org.apache.myfaces.taglib.core.ViewTag parent) throws java.lang.Throwable
205c204
< com.sun.faces.taglib.html_basic.OutputTextTag __tag2 = null ;
---
> org.apache.myfaces.taglib.html.HtmlOutputTextTag __tag2 = null ;
209c208
< __tag2 = new com.sun.faces.taglib.html_basic.OutputTextTag ();
---
> __tag2 = new org.apache.myfaces.taglib.html.HtmlOutputTextTag ();
214,215c213
< __tag2.setJspId("id2");
< __tag2.setValue( weblogic.servlet.jsp.ELHelper.createValueExpression("#{msg.welcomeTitle}",java.lang.Object.class,pageContext,_jspx_fnmap));
---
> __tag2.setValue(( java.lang.String) weblogic.jsp.internal.jsp.utils.JspRuntimeUtils.convertType("#{msg.welcomeTitle}", java.lang.String.class,"value"));
220a219
> throw new javax.servlet.jsp.JspTagException("Since tag class org.apache.myfaces.taglib.html.HtmlOutputTextTag does not implement BodyTag, it cannot return BodyTag.EVAL_BODY_BUFFERED");
234c233
< private boolean _jsp__tag3(javax.servlet.ServletRequest request, javax.servlet.ServletResponse response, javax.servlet.jsp.PageContext pageContext, javax.servlet.jsp.tagext.JspTag activeTag, com.sun.faces.taglib.jsf_core.ViewTag parent) throws java.lang.Throwable
---
> private boolean _jsp__tag3(javax.servlet.ServletRequest request, javax.servlet.ServletResponse response, javax.servlet.jsp.PageContext pageContext, javax.servlet.jsp.tagext.JspTag activeTag, org.apache.myfaces.taglib.core.ViewTag parent) throws java.lang.Throwable
239c238
< com.sun.faces.taglib.html_basic.OutputTextTag __tag3 = null ;
---
> org.apache.myfaces.taglib.html.HtmlOutputTextTag __tag3 = null ;
243c242
< __tag3 = new com.sun.faces.taglib.html_basic.OutputTextTag ();
---
> __tag3 = new org.apache.myfaces.taglib.html.HtmlOutputTextTag ();
248,249c247
< __tag3.setJspId("id3");
< __tag3.setValue( weblogic.servlet.jsp.ELHelper.createValueExpression("#{msg.welcomeHeading}",java.lang.Object.class,pageContext,_jspx_fnmap));
---
> __tag3.setValue(( java.lang.String) weblogic.jsp.internal.jsp.utils.JspRuntimeUtils.convertType("#{msg.welcomeHeading}", java.lang.String.class,"value"));
254a253
> throw new javax.servlet.jsp.JspTagException("Since tag class org.apache.myfaces.taglib.html.HtmlOutputTextTag does not implement BodyTag, it cannot return BodyTag.EVAL_BODY_BUFFERED");
268c267
< private boolean _jsp__tag4(javax.servlet.ServletRequest request, javax.servlet.ServletResponse response, javax.servlet.jsp.PageContext pageContext, javax.servlet.jsp.tagext.JspTag activeTag, com.sun.faces.taglib.jsf_core.ViewTag parent) throws java.lang.Throwable
---
> private boolean _jsp__tag4(javax.servlet.ServletRequest request, javax.servlet.ServletResponse response, javax.servlet.jsp.PageContext pageContext, javax.servlet.jsp.tagext.JspTag activeTag, org.apache.myfaces.taglib.core.ViewTag parent) throws java.lang.Throwable
273c272
< com.sun.faces.taglib.html_basic.OutputTextTag __tag4 = null ;
---
> org.apache.myfaces.taglib.html.HtmlOutputTextTag __tag4 = null ;
277c276
< __tag4 = new com.sun.faces.taglib.html_basic.OutputTextTag ();
---
> __tag4 = new org.apache.myfaces.taglib.html.HtmlOutputTextTag ();
282,283c281
< __tag4.setJspId("id4");
< __tag4.setValue( weblogic.servlet.jsp.ELHelper.createValueExpression("#{msg.welcomeMessage}",java.lang.Object.class,pageContext,_jspx_fnmap));
---
> __tag4.setValue(( java.lang.String) weblogic.jsp.internal.jsp.utils.JspRuntimeUtils.convertType("#{msg.welcomeMessage}", java.lang.String.class,"value"));
288a287
> throw new javax.servlet.jsp.JspTagException("Since tag class org.apache.myfaces.taglib.html.HtmlOutputTextTag does not implement BodyTag, it cannot return BodyTag.EVAL_BODY_BUFFERED");
Check from where are classed loaded
[dave@dave jsf-blank-myfaces]$ java -verbose:class weblogic.appc -keepGenerated -verboseJavac -verbose -library /opt/weblogic/wlserver_12.1/common/deployable-libraries/jsf-1.2.war,/opt/weblogic/wlserver_12.1/common/deployable-libraries/jstl-1.2.war WebContent/ > classloader.log
weblogic.appc
[dave@dave jsf-blank-myfaces]$ grep appc classloader.log
[Loaded weblogic.appc from file:/opt/weblogic/wlserver_12.1/server/lib/weblogic.jar]
myfaces
[Loaded javax.faces.webapp.FacesServlet from file:/home/dave/app/jsf-blank-myfaces/WebContent/WEB-INF/lib/myfaces-api-1.1.5.jar]
Extract appc class
[dave@dave jsf-blank-myfaces]$ jar tvf /opt/weblogic/wlserver_12.1/server/lib/weblogic.jar |grep -i appc
2091 Wed Dec 07 08:42:12 CET 2011 weblogic/management/configuration/WebAppContainerMBean.class
19320 Wed Dec 07 08:45:18 CET 2011 weblogic/management/configuration/WebAppContainerMBeanImpl.class
13336 Wed Dec 07 08:45:18 CET 2011 weblogic/management/configuration/WebAppContainerMBeanImpl$Helper.class
9673 Wed Dec 07 08:47:18 CET 2011 weblogic/ant/taskdefs/j2ee/Appc.class
479 Wed Dec 07 08:43:08 CET 2011 weblogic/appc.class
[dave@dave jsf-blank-myfaces]$ jar xvf /opt/weblogic/wlserver_12.1/server/lib/weblogic.jar weblogic/ant/taskdefs/j2ee/Appc.class
inflated: weblogic/ant/taskdefs/j2ee/Appc.class
Disassemble class files using javap
[dave@dave jsf-blank-myfaces]$ javap weblogic/ant/taskdefs/j2ee/Appc.class
Compiled from "Appc.java"
public class weblogic.ant.taskdefs.j2ee.Appc extends weblogic.ant.taskdefs.j2ee.CompilerTask {
public weblogic.ant.taskdefs.j2ee.Appc();
public void setClasspath(java.lang.String);
public void setSource(java.lang.String);
public void setOutput(java.lang.String);
public void setForceGeneration(boolean);
public void setLineNumbers(boolean);
public void setBasicClientJar(boolean);
public void setContinueCompilation(boolean);
public void setVerbose(boolean);
public void setEnableHotCodeGen(boolean);
public void setIiopDirectory(java.lang.String);
public void setIdlDirectory(java.lang.String);
public void setIdl(boolean);
public void setIdlOverwrite(boolean);
public void setIdlVerbose(boolean);
public void setIdlNoValueTypes(boolean);
public void setIdlNoAbstractInterfaces(boolean);
public void setIdlFactories(boolean);
public void setIdlVisibroker(boolean);
public void setIdlOrbix(boolean);
public void setIiop(boolean);
public void setIdlMethodSignatures(java.lang.String);
public void setlibraryDir(java.lang.String);
public void setPlan(java.lang.String);
public void setClientJarOutputDir(java.lang.String);
public void addConfiguredLibrary(weblogic.ant.taskdefs.utils.LibraryElement);
public void execute();
}