Version 1

    As Stan Silvert described in his article 'Design of AS7 multi-JSF feature' : Currently, AS7 ships with two JSF implementations, a JSF 2.1 implementation and a JSF 1.2 implementation. But AS7 didn't ship with myfaces jsf implementation.


    In this article, I will show you how to hack jboss as 7 (7.2.0.Final) to add myfaces-2.1.12 as default jsf implementation. It works for me. The steps are as follows:


    Summary:

        hack to add myfaces-2.1 as default jsf implementation
    ---
     build/build.xml                                    | 17 ++++++++
     .../resources/configuration/subsystems/jsf.xml     |  2 +-
     .../base/com/sun/jsf-impl/myfaces-2.1/module.xml   | 47 ++++++++++++++++++++++
     .../base/javax/faces/api/myfaces-2.1/module.xml    | 37 +++++++++++++++++
     .../org/apache/commons/digester/main/module.xml    | 40 ++++++++++++++++++
     .../jboss/as/jsf-injection/myfaces-2.1/module.xml  | 42 +++++++++++++++++++
     jsf/injection/pom.xml                              |  5 +++
     .../as/jsf/deployment/JSFModuleIdFactory.java      |  8 ++++
     .../jboss/as/jsf/deployment/JsfVersionMarker.java  |  4 ++
     pom.xml                                            | 10 ++++-
     11 files changed, 214 insertions(+), 5 deletions(-)
    


    Details:

    1. new file build/src/main/resources/modules/system/layers/base/javax/faces/api/myfaces-2.1/module.xml

     

    <?xml version="1.0" encoding="UTF-8"?>
    
    <module xmlns="urn:jboss:module:1.1" name="javax.faces.api" slot="myfaces-2.1">
        <dependencies>
            <module name="javax.el.api" export="true"/>
            <module name="javax.servlet.api" export="true"/>
            <module name="javax.servlet.jsp.api" export="true"/>
            <module name="javax.servlet.jstl.api" export="true"/>
            <module name="javax.validation.api" export="true"/>
        </dependencies>
    
        <resources>
            <!-- Insert resources here -->
        </resources>
    </module>
    
    

     

    2. new file build/src/main/resources/modules/system/layers/base/com/sun/jsf-impl/myfaces-2.1/module.xml

     

    <?xml version="1.0" encoding="UTF-8"?>
    
    <module xmlns="urn:jboss:module:1.1" name="com.sun.jsf-impl" slot="myfaces-2.1">
        <properties>
            <property name="jboss.api" value="private"/>
        </properties>
    
        <dependencies>
            <module name="javax.faces.api" slot="myfaces-2.1"/>
            <module name="javaee.api"/>
            <module name="javax.servlet.jstl.api"/>
            <module name="org.apache.xerces" services="import"/>
            <module name="org.apache.xalan" services="import"/>
    
            <!-- extra dependencies for MyFaces -->
            <module name="org.apache.commons.collections"/>
            <module name="org.apache.commons.codec"/>
            <module name="org.apache.commons.beanutils"/>
            <module name="org.apache.commons.digester"/>
        </dependencies>
    
        <resources>
            <!-- Insert resources here -->
        </resources>
    </module>
    

     

    3. new file build/src/main/resources/modules/system/layers/base/org/apache/commons/digester/main/module.xml

     

    <?xml version="1.0" encoding="UTF-8"?>
    
    <module xmlns="urn:jboss:module:1.1" name="org.apache.commons.digester">
        <properties>
            <property name="jboss.api" value="private"/>
        </properties>
    
        <resources>
            <!-- Insert resources here -->
        </resources>
    
        <dependencies>
            <module name="javax.api"/>
            <module name="org.apache.commons.collections"/>
            <module name="org.apache.commons.logging"/>
            <module name="org.apache.commons.beanutils"/>
        </dependencies>
    </module>
    

     

    4. new file build/src/main/resources/modules/system/layers/base/org/jboss/as/jsf-injection/myfaces-2.1/module.xml

     

    <?xml version="1.0" encoding="UTF-8"?>
    
    <module xmlns="urn:jboss:module:1.1" name="org.jboss.as.jsf-injection" slot="myfaces-2.1">
        <properties>
            <property name="jboss.api" value="private"/>
        </properties>
    
        <resources>
            <!-- Insert resources here -->
        </resources>
    
        <dependencies>
            <module name="com.sun.jsf-impl" slot="myfaces-2.1"/>
            <module name="javax.api"/>
            <module name="org.jboss.as.web"/>
            <module name="javax.servlet.api"/>
            <module name="org.jboss.logging"/>
            <module name="javax.faces.api" slot="myfaces-2.1"/>
        </dependencies>
    </module>
    

     

    5. modify build/build.xml to add model-def of myfaces:

     

            <module-def name="javax.faces.api" slot="myfaces-2.1">
                <maven-resource group="org.apache.myfaces.core" artifact="myfaces-api"/>
            </module-def>
    
            <module-def name="com.sun.jsf-impl" slot="myfaces-2.1">
                <maven-resource group="org.apache.myfaces.core" artifact="myfaces-impl"/>
                <maven-resource group="org.apache.myfaces.core" artifact="myfaces-bundle"/>
            </module-def>
    
            <module-def name="org.apache.commons.digester">
                <maven-resource group="commons-digester" artifact="commons-digester"/>
            </module-def>
    
            <module-def name="org.jboss.as.jsf-injection" slot="myfaces-2.1">
                <maven-resource group="org.jboss.as" artifact="jboss-as-jsf-injection" />
            </module-def>
    

     

    6. make myfaces as default: modify build/src/main/resources/configuration/subsystems/jsf.xml to add "default-jsf-impl-slot" attribute. It will be reflected in standalone.xml.

     

    <subsystem xmlns="urn:jboss:domain:jsf:1.0" default-jsf-impl-slot="myfaces-2.1"/>
    

     

    7. modify code jsf/subsystem/src/main/java/org/jboss/as/jsf/deployment/JsfVersionMarker.java

     

    diff --git a/jsf/subsystem/src/main/java/org/jboss/as/jsf/deployment/JsfVersionMarker.java b/jsf/subsystem/src/main/java/org/jboss/as/jsf/deployment/JsfVers~
    index 23823ee..b668e19 100644
    --- a/jsf/subsystem/src/main/java/org/jboss/as/jsf/deployment/JsfVersionMarker.java
    +++ b/jsf/subsystem/src/main/java/org/jboss/as/jsf/deployment/JsfVersionMarker.java
    @@ -31,6 +31,10 @@ public class JsfVersionMarker {
    
         public static final String JSF_1_2 = "Mojarra-1.2";
         public static final String JSF_2_0 = "Mojarra-2.0";
    +
    +    // Yaguo Zhou
    +    public static final String JSF_2_1 = "myfaces-2.1";
    +
         public static final String WAR_BUNDLES_JSF_IMPL = "WAR_BUNDLES_JSF_IMPL";
    

     

    8. modify code jsf/subsystem/src/main/java/org/jboss/as/jsf/deployment/JSFModuleIdFactory.java

     

    diff --git a/jsf/subsystem/src/main/java/org/jboss/as/jsf/deployment/JSFModuleIdFactory.java b/jsf/subsystem/src/main/java/org/jboss/as/jsf/deployment/JSFMo~
    index 74011b2..fcb337e 100644
    --- a/jsf/subsystem/src/main/java/org/jboss/as/jsf/deployment/JSFModuleIdFactory.java
    +++ b/jsf/subsystem/src/main/java/org/jboss/as/jsf/deployment/JSFModuleIdFactory.java
    @@ -99,11 +99,17 @@ public class JSFModuleIdFactory {
             apiIds.put("1.2", ModuleIdentifier.create(API_MODULE, "1.2"));
             injectionIds.put("1.2", ModuleIdentifier.create(INJECTION_MODULE, "1.2"));
    
    +        implIds.put("myfaces-2.1", ModuleIdentifier.create(IMPL_MODULE, "myfaces-2.1"));
    +        apiIds.put("myfaces-2.1", ModuleIdentifier.create(API_MODULE, "myfaces-2.1"));
    +        injectionIds.put("myfaces-2.1", ModuleIdentifier.create(INJECTION_MODULE, "myfaces-2.1"));
    +
             allVersions.add("main");
             allVersions.add("1.2");
    +        allVersions.add("myfaces-2.1");
    
             activeVersions.add("main");
             activeVersions.add("1.2");
    +        activeVersions.add("myfaces-2.1");
         }
    
         private void loadIdsFromModulePath(String modulePath) {
    @@ -169,6 +175,8 @@ public class JSFModuleIdFactory {
             if (jsfVersion == null) return defaultSlot;
             if (JsfVersionMarker.JSF_2_0.equals(jsfVersion)) return defaultSlot;
             if (JsfVersionMarker.JSF_1_2.equals(jsfVersion)) return "1.2";
    +        // Yaguo Zhou
    +        if (JsfVersionMarker.JSF_2_1.equals(jsfVersion)) return "myfaces-2.1";
             return jsfVersion;
         }
    

     

    9. modify jsf/injection/pom.xml

     

    diff --git a/jsf/injection/pom.xml b/jsf/injection/pom.xml
    index c671da4..81f3624 100644
    --- a/jsf/injection/pom.xml
    +++ b/jsf/injection/pom.xml
    @@ -53,6 +53,11 @@
                 <groupId>org.apache.myfaces.core</groupId>
                 <artifactId>myfaces-impl</artifactId>
             </dependency>
    +        
    +        <dependency>
    +            <groupId>org.apache.myfaces.core</groupId>
    +            <artifactId>myfaces-bundle</artifactId>
    +        </dependency>
    
         </dependencies>
    

     

    10. modify pom.xml

     

    diff --git a/pom.xml b/pom.xml
    index fed62ad..3a1fdbc 100644
    --- a/pom.xml
    +++ b/pom.xml
    @@ -123,7 +123,7 @@
             <version.org.apache.maven>3.0.4</version.org.apache.maven>
             <version.org.apache.maven.wagon>2.2</version.org.apache.maven.wagon>
             <version.org.apache.maven.wagon.http-lightweight>2.2</version.org.apache.maven.wagon.http-lightweight>
    -        <version.org.apache.myfaces.core>2.1.8</version.org.apache.myfaces.core>
    +        <version.org.apache.myfaces.core>2.1.12</version.org.apache.myfaces.core>
             <version.org.apache.neethi>3.0.2</version.org.apache.neethi>
             <version.org.apache.openjpa>2.1.1</version.org.apache.openjpa>
             <version.org.apache.santuario>1.5.3</version.org.apache.santuario>
    @@ -3113,6 +3113,7 @@
                            <groupId>commons-beanutils</groupId>
                            <artifactId>commons-beanutils</artifactId>
                        </exclusion>
    +                   <!--
                        <exclusion>
                            <groupId>commons-digester</groupId>
                            <artifactId>commons-digester</artifactId>
    @@ -3121,12 +3122,19 @@
                            <groupId>org.apache.myfaces.core</groupId>
                            <artifactId>myfaces-api</artifactId>
                        </exclusion>
    +                   -->
                        <exclusion>
                            <groupId>javax.servlet</groupId>
                            <artifactId>servlet-api</artifactId>
                        </exclusion>
                     </exclusions>
                 </dependency>
    +            
    +            <dependency>
    +                <groupId>org.apache.myfaces.core</groupId>
    +                <artifactId>myfaces-bundle</artifactId>
    +                <version>${version.org.apache.myfaces.core}</version>
    +            </dependency>
    
                 <dependency>
                     <groupId>org.apache.maven.wagon</groupId>
    

     

    After hacking, you need build JBoss AS7 by yourself.