You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by Apache Wiki <wi...@apache.org> on 2006/08/02 18:40:17 UTC
[Myfaces Wiki] Update of "MavenLiferayPortlet" by GregReddin
Dear Wiki user,
You have subscribed to a wiki page or wiki category on "Myfaces Wiki" for change notification.
The following page has been changed by GregReddin:
http://wiki.apache.org/myfaces/MavenLiferayPortlet
The comment on the change is:
Added Liferay and Maven 2 section
New page:
Maven makes it fairly easy to create a MyFaces portlet to deploy into Liferay. This document assumes you will be using Maven 2.0.4+ and Liferay 4.0.0+.
== Create your POM file ==
You can use the Maven [http://maven.apache.org/guides/mini/guide-webapp.html webapp archetype] to create your project. Your POM file will need to look something like this at a minimum.
{{{
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>test.myfaces</groupId>
<artifactId>myfacesportlet</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>MyFaces Portlet</name>
<url>http://maven.apache.org</url>
<repositories>
<repository>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>myfaces.staging</id>
<name>MyFaces Staging Repository</name>
<url>http://myfaces.zones.apache.org/dist/maven-repository</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.apache.myfaces.core</groupId>
<artifactId>myfaces-api</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>org.apache.myfaces.core</groupId>
<artifactId>myfaces-impl</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>org.apache.myfaces.tomahawk</groupId>
<artifactId>tomahawk</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>myfacesportlet</finalName>
</build>
</project>
}}}
== Set up your web app. ==
In src/main/webapp/WEB-INF/web.xml you'll need to set up all your MyFaces stuff the way you normally would. It seems easier to use prefix mapping for the FacesServlet:
{{{
<servlet-mapping>
<servlet-name>FacesServlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
}}}
After creating your web application it's a good idea to test it in a standalone, non-portal container to make sure everything works.
== Set up Logging ==
If you skip this step you will see the following in your Liferay Log when you try to deploy or access the portlet.
{{{
19:49:04,765 ERROR [org.apache.catalina.startup.HostConfig] Error deploying web application directory myfacesportlet
java.lang.NoSuchMethodError: org.apache.log4j.Category.log(Ljava/lang/String;Lorg/apache/log4j/Level;Ljava/lang/Object;Ljava/lang/Throwable;)V
at org.apache.commons.logging.impl.Log4JCategoryLog.error(Log4JCategoryLog.java:149)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3733)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4187)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:759)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:739)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:524)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:904)
at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:867)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:474)
at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1190)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:292)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1305)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1569)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1578)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1558)
at java.lang.Thread.run(Thread.java:613) }}}
To get rid of this exception create a commons-logging.properties file in src/main/resources and add the following to it:
{{{
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
}}}
== Create Portlet and Liferay-specific Deployment Artifacts ==
Also, in src/main/webapp/WEB-INF you'll need to create 3 portal deployment files: portlet.xml, liferay-portlet.xml, and liferay-display.xml. They will be described below.
=== portlet.xml ===
This file is the standard Portlet deployment descriptor. The most important distinction is to set the {{{MyFacesGenericPortlet}}} as your portlet-class and make sure you set a default view.
{{{
<?xml version="1.0"?>
<portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd">
<portlet>
<portlet-name>myfaces_sample_portlet</portlet-name>
<display-name>Myfaces Test</display-name>
<portlet-class>org.apache.myfaces.portlet.MyFacesGenericPortlet</portlet-class>
<expiration-cache>0</expiration-cache>
<init-param>
<name>default-view</name>
<value>/index.jsp</value>
</init-param>
<supports>
<mime-type>text/html</mime-type>
</supports>
<portlet-info>
<title>Myfaces Test</title>
<short-title>Myfaces Test</short-title>
<keywords>Myfaces Test</keywords>
</portlet-info>
<security-role-ref>
<role-name>power-user</role-name>
</security-role-ref>
<security-role-ref>
<role-name>user</role-name>
</security-role-ref>
</portlet>
</portlet-app>
}}}
=== liferay-portlet.xml ===
This is the Liferay-specific portlet deployment descriptor. There is nothing special about this file except that it is required for Liferay to see your portlet.
{{{
<?xml version="1.0"?>
<!DOCTYPE liferay-portlet-app PUBLIC "-//Liferay//DTD Portlet Application 4.0.0//EN" "http://www.liferay.com/dtd/liferay-portlet-app_4_0_0.dtd">
<liferay-portlet-app>
<portlet>
<portlet-name>myfaces_sample_portlet</portlet-name>
<instanceable>true</instanceable>
</portlet>
<role-mapper>
<role-name>administrator</role-name>
<role-link>Administrator</role-link>
</role-mapper>
<role-mapper>
<role-name>power-user</role-name>
<role-link>Power User</role-link>
</role-mapper>
<role-mapper>
<role-name>user</role-name>
<role-link>User</role-link>
</role-mapper>
</liferay-portlet-app>
}}}
=== liferay-display.xml ===
This file tells Liferay how to make your portlet show up in its "Add Content" section so you can add it to your pages.
{{{
<?xml version="1.0"?>
<!DOCTYPE display PUBLIC "-//Liferay//DTD Display 4.0.0//EN" "http://www.liferay.com/dtd/liferay-display_4_0_0.dtd">
<display>
<category name="category.test">
<portlet id="myfaces_sample_portlet" />
</category>
</display>
}}}
== Build and Test ==
Again, it's a good idea to develop, build, and test your MyFaces portlet in a standalone container like Tomcat. This will ensure maximum portability. It will allow you to deploy your components in a standard web application or in a portal. Make sure you note the portal-specific development notes listed elsewhere.
== Add Liferay Dependencies ==
You will need to add Liferay's util-jsf.jar file in the WEB-INF/lib directory of your application. This file is not available on any public Maven repository. You will either need to manually place it in a local repo or manually insert it into your WAR file.
== Deploy Liferay WAR ==
Once you have a WAR file with all the dependencies as described in the previous step you can use Liferay's deployment process to deploy the portlet into a running Liferay instance. I used the following Ant script to accomplish this task:
{{{
<project basedir="." name="target-liferay-deploy-tomcat">
<target name="deploy">
<!-- Tomcat -->
<property name="liferay.portal.home" value="${user.home}/liferay-portal-tomcat-jdk5-4"/>
<property name="app.server.dir" value="${liferay.portal.home}" />
<property name="app.server.deploy.dir" value="${app.server.dir}/webapps" />
<path id="project.classpath">
<pathelement location="${env.ANT_HOME}/lib/ant.jar" />
<fileset dir="${app.server.dir}/common/lib/ext" />
<pathelement location="${app.server.dir}/liferay/WEB-INF/lib/portal-ejb.jar" />
<pathelement location="${app.server.dir}/liferay/WEB-INF/lib/util-java.jar" />
<pathelement location="${app.server.dir}/liferay/WEB-INF/lib/dom4j.jar" />
<pathelement location="${app.server.dir}/liferay/WEB-INF/lib/concurrent.jar" />
<pathelement location="${app.server.dir}/liferay/WEB-INF/lib/trove.jar" />
<pathelement location="${app.server.dir}/common/lib/servlet-api.jar" />
</path>
<java
classname="com.liferay.portal.tools.PortletDeployer"
classpathref="project.classpath"
fork="true"
newenvironment="true">
<!-- Required Arguments -->
<jvmarg value="-Ddeployer.base.dir=./" />
<jvmarg value="-Ddeployer.dest.dir=${app.server.deploy.dir}" />
<jvmarg value="-Ddeployer.app.server.type=tomcat" />
<jvmarg value="-Ddeployer.portlet.taglib.dtd=${app.server.dir}/liferay/WEB-INF/tld/liferay-portlet.tld" />
<!-- Optional Arguments -->
<jvmarg value="-Ddeployer.unpack.war=true" />
<jvmarg value="-Ddeployer.jboss.prefix=1" />
<jvmarg value="-Ddeployer.tomcat.lib.dir=${app.server.dir}/common/lib/ext" />
<!-- Dependent Libraries -->
<arg value="${app.server.dir}/liferay/WEB-INF/lib/util-java.jar" />
<arg value="${app.server.dir}/liferay/WEB-INF/lib/util-taglib.jar" />
</java>
</target>
</project>
}}}
Move your .WAR file into the directory where this ant script lives and type "ant deploy".
Log onto Liferay and test.