blob: 2ef2e7db184a260a7159bbea509960655955ebe8 [file] [log] [blame]
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright 2004-2006 The Apache Software Foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<document>
<properties>
<title>Deploying Portlet to Pluto Portal</title>
<author email="zheng.at.apache.D0T.org">ZHENG Zhong</author>
<author email="ddewolf@apache.org">David DeWolf</author>
<author email="cdoremus@apache.org">Craig Doremus</author>
</properties>
<body>
<section name="Deploying Portlet to Pluto Portal">
<p>
There are 3 steps to deploy a portlet to Pluto 1.1:
<ul>
<li>
<b>Assembly</b>: All portlet applications must be run through the
pluto assembler before being deployed. The assembly process injects
pluto specific information for deployment. Specifically, a servlet
and servlet mapping are added to the deployment descriptor (web.xml).
This servlet (<code>org.apache.pluto.core.PortletServlet</code>) will be
used to dispatch portlet requests to the portlet application.
</li>
<li>
<b>Deployment</b>: After portlet applications are assembled properly
they must be deployed to the servlet engine within which the portal
application is running. The current binary distribution uses
Tomcat 5.5 as the servlet engine.
</li>
<li>
<b>Publishing</b>: All portlet applications that are to be used
within the Pluto Portal must be published to the Portal. Publishing
notifies the Portal Application that a portlet application is bound
(deployed) to a certain context within the appserver. This is done
by adding records to <code>pluto-portal-driver-config.xml</code>.
</li>
</ul>
</p>
<subsection name="Portlet Assembly and Deployment using Maven 2">
<p>
As of the second beta release of Pluto 1.1, the Maven 2 plugins for assembly and
deployment are partially completed.
Right now the maven-pluto-plugin correctly assembles the war with
the proper <code>PortletServlet</code> records to web.xml, but the
deployment plugin is not yet completed. We have created an example
<!-- TODO: Review use of the word deploys -->
Maven 2 pom.xml below that correctly assembles and deploys the portlet.
</p>
<p>
The custom Maven 2 build shown below also deploys
a Tomcat context deployment descriptor that has the same name as your
artifactId with an xml extension (e.g. HelloWorldPortlet.xml).
</p>
<p>
To properly assemble and deploy your portlet using the Maven 2 script (pom.xml) below,
your project's directory structure and artifact placement must conform to Maven's standard:
</p>
<p>
<source><![CDATA[
HelloWorldPortlet (top level directory)
|- pom.xml (the pom file)
|- src (Subdir containing main subdirectory)
|- main (Subdir containing java, resources and webapp subdirs)
|- java (java source code goes under here)
| `- com
| `- mycompany
| `- portlet
| `- HelloWorldPortlet.java (portlet source)
|- resources
| `- HelloWorldPortlet.xml (Tomcat context deployment descriptor)
|- webapp (webapp resources (jsp, css, images) go under here)
`- jsp
`- HelloWorldPortletView.jsp (for view mode)
`- HelloWorldPortletEdit.jsp (for edit mode)
`- WEB-INF
`- portlet.xml (JSR-168 deployment descriptor)
`- web.xml (This will be modified by maven-pluto-plugin)
]]></source>
</p>
<p>
This is an example of what the Tomcat context deployment descriptor will contain:
<source><![CDATA[
<Context path="HelloWorldPortlet"
docBase="../PlutoDomain/HelloWorldPortlet.war"
crossContext="true"/>
]]></source>
</p>
<p>
The Maven 2 pom file (pom.xml) is what defines the build. Our example overrides
the integration-test lifecycle phase in addition to using the maven-pluto-plugin
to assemble the war. Use this as you pom file, changing the groupId, artifactId and version
to values appropriate to your custom portlet.
<source><![CDATA[
<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">
<!-- Change this to something akin to your java package structure -->
<groupId>com.mycompany.portlet</groupId>
<modelVersion>4.0.0</modelVersion>
<!-- Version of this app -->
<version>0.1-alpha1</version>
<!-- Base name of the war file without .war ext -->
<artifactId>HelloWorldPortlet</artifactId>
<packaging>war</packaging>
<name>${pom.artifactId}</name>
<!-- Dependency Version Properties ======================================= -->
<properties>
<!-- Change this for a new Pluto version -->
<pluto.version>1.1.0-beta2</pluto.version>
<portlet-api.version>1.0</portlet-api.version>
<servlet-api.version>2.3</servlet-api.version>
<jsp-api.version>2.0</jsp-api.version>
<junit.version>3.8.1</junit.version>
</properties>
<dependencies>
<dependency>
<groupId>javax.portlet</groupId>
<artifactId>portlet-api</artifactId>
<version>${portlet-api.version}</version>
<scope>provided</scope><!-- Prevents addition to war file -->
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>${servlet-api.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.pluto</groupId>
<artifactId>pluto-util</artifactId>
<version>${pluto.version}</version>
<scope>provided</scope>
</dependency>
<!-- Any other build or deployment dependancies go here -->
</dependencies>
<build>
<finalName>${pom.name}</finalName>
<plugins>
<!-- configure maven-war-plugin to use updated web.xml -->
<plugin>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webXml>${project.build.directory}/pluto-resources/web.xml</webXml>
</configuration>
</plugin>
<!-- bind 'pluto:assemble' goal to 'process-resources' lifecycle -->
<plugin>
<groupId>org.apache.pluto</groupId>
<artifactId>maven-pluto-plugin</artifactId>
<version>${pluto.version}</version>
<executions>
<execution>
<phase>generate-resources</phase>
<goals>
<goal>assemble</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<!-- Override the 'integration-test' lifecycle phase
with a custom one that runs a simple Ant script -->
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<phase>integration-test</phase>
<configuration>
<tasks>
<!-- Set tomcat.home to CATALINA_HOME environmental variable
Use this to skip -Dpluto.home=/path/to/pluto on command line -->
<property environment="env"/>
<property name="pluto.home" value="${env.CATALINA_HOME}"/>
<echo message="pluto.home=${pluto.home}"/>
<!-- Remove former deployment because sometimes
tomcat does not fully redeploy a war -->
<delete
dir="${pluto.home}/webapps/${pom.name}"
failonerror="true"
/>
<!-- Deploy war file -->
<copy
file="${project.build.directory}/${pom.name}.war"
todir="${pluto.home}/PlutoDomain"
overwrite="true"
/>
<!-- Deploy context deployment descriptor for Tomcat -->
<copy
file="${basedir}/src/main/resources/${pom.name}.xml"
todir="${pluto.home}/conf/Catalina/localhost"
overwrite="false"
/>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
]]></source>
</p>
<p>
Run the Maven 2 pom.xml script using 'mvn integration-test -Dpluto.home=/path/to/pluto1.1install'
from the command line to create the war with web.xml modified for deployment to
Pluto-1.1 and deploy it to a local install of Pluto-1.1.
The embedded Ant script in the pom.xml was created to use the environmental variable
CATALINA_HOME as the value of pluto.home.
If you have set CATALINA_HOME to your Pluto-1.1 install, then you can just run
the command 'mvn integration-test'.
</p>
<p>
If you prefer to manually deploy the war to Tomcat, run 'mvn package' which will
create the war file in the <code>target/</code> directory. Then manually deploy
the war file and Tomcat context deployment descriptor to your Pluto-1.1 install.
</p>
</subsection>
<subsection name="Portlet Publishing">
<p>
Currently, as of Pluto-1.1-beta2, the only way to publish an application to the portal
is to manually update the Portal's configuration file <code>pluto-portal-driver-config.xml</code>
located in the WEB-INF directory of the pluto webapp.
Here's how to do it:
</p>
<p><b>Step 1: Portlet App Config</b></p>
<p>
First, add a <code>portlet-app</code> config element to
notify the Portal which portlet application is deployed to the
appserver (Tomcat). In this element, you should specify the context path of
your portlet app, as well as the names of portlets deployed. Here is
an example:
<source><![CDATA[
<portlet-app>
<context-path>/your_portlet_app_context_path</context-path>
<portlets>
<portlet name="your_portlet_1"/>
<portlet name="your_portlet_2"/>
... ...
</portlets>
</portlet-app>
]]></source>
</p>
<p><b>Step 2: Portal Page Config</b></p>
<p>
You should then configure a portal page to display your portlets.
Do this by adding a <code>page</code> element in the <code>render-config</code>
element, like this:
<source><![CDATA[
<render-config default="Test Page">
... ...
<page name="Your Portal Page Name" uri="/WEB-INF/fragments/portlet.jsp">
<portlet context="/your_portlet_app_context_path"
name="your_portlet_1"/>
<portlet context="/your_portlet_app_context_path"
name="your_portlet_2"/>
</page>
</render-config>
]]></source>
</p>
<p>
The <code>uri</code> attribute defines the theme of your portal page.
If you use <code>/WEB-INF/fragments/portlet.jsp</code> (which is the
default theme of Pluto Testsuite portlet app), your portlets will be
displayed in two columns. You can clone this file to customize your layout.
If you do so, make sure the <code>uri</code> attribute points to the new file.
</p>
</subsection>
</section>
</body>
</document>