7 Replies Latest reply on Mar 11, 2005 2:51 PM by karanmg

    Multiple portlets, 1 war

      FOA, congratulations on getting the beta version out.

      I have a SunSamples.war, which is a war file I downloaded from Sun One/JSR168 website and Im trying to deploy this in jBossAS/Portal.

      The structure of this directory is:
      deploy/Portlets/SunSamples.war/ -- this dir holds some jsps.
      deploy/Portlets/SunSamples.war/WEB-INF

      jboss-portlet.xml:

      <portlet-app>
       <app-name>SunSamples</app-name>
       <portlet>
       <portlet-name>JSPPortlet</portlet-name>
       </portlet>
       <portlet>
       <portlet-name>NotepadPortlet</portlet-name>
       </portlet>
       <portlet>
       <portlet-name>BookmarkPortlet</portlet-name>
       </portlet>
       <portlet>
       <portlet-name>WeatherPortlet</portlet-name>
       </portlet>
      </portlet-app>
      


      portlet.xml
      <?xml version="1.0" encoding="UTF-8"?>
      <portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd /opt/SUNWps/dtd/portlet.xsd" version="1.0">
      
       <portlet>
       <portlet-name>JSPPortlet</portlet-name>
       <portlet-class>com.sun.portal.portlet.samples.jspportlet.JSPPortlet</portlet-class>
       <supported-locale>en</supported-locale>
       <resource-bundle>Resource</resource-bundle>
       <expiration-cache>0</expiration-cache>
       <supports>
       <mime-type>text/html</mime-type>
       <portlet-mode>EDIT</portlet-mode>
       <portlet-mode>HELP</portlet-mode>
       </supports>
       <supports>
       <mime-type>text/wml</mime-type>
       <portlet-mode>EDIT</portlet-mode>
       <portlet-mode>HELP</portlet-mode>
       </supports>
       <resource-bundle>ShowTimePortletRB</resource-bundle>
       <portlet-info>
       <title>ShowTime Portlet</title>
       <keywords>jsp, clock, test</keywords>
       </portlet-info>
       <portlet-preferences>
       <preference>
       <name>contentPage</name>
       <value>/jspportlet/content.jsp</value>
       </preference>
       <preference>
       <name>editPage</name>
       <value>/jspportlet/edit.jsp</value>
       </preference>
       <preference>
       <name>helpPage</name>
       <value>/jspportlet/help.jsp</value>
       </preference>
       <preference>
       <name>timezone</name>
       <value></value>
       </preference>
       </portlet-preferences>
       </portlet>
      
       <portlet>
       <portlet-name>NotepadPortlet</portlet-name>
       <portlet-class>com.sun.portal.portlet.samples.notepad.NotepadPortlet</portlet-class>
       <supported-locale>en</supported-locale>
       <resource-bundle>Resource</resource-bundle>
       <expiration-cache>0</expiration-cache>
       <supports>
       <mime-type>text/html</mime-type>
       <portlet-mode>EDIT</portlet-mode>
       <portlet-mode>HELP</portlet-mode>
       </supports>
       <supports>
       <mime-type>text/wml</mime-type>
       <portlet-mode>EDIT</portlet-mode>
       <portlet-mode>HELP</portlet-mode>
       </supports>
       <resource-bundle>NotepadPortletRB</resource-bundle>
       <portlet-info>
       <title>Notepad Portlet</title>
       <keywords>note, notepad, sample, test</keywords>
       </portlet-info>
       <portlet-preferences>
       <preference>
       <name>contentPage</name>
       <value>/notepad/content.jsp</value>
       </preference>
       <preference>
       <name>editPage</name>
       <value>/notepad/edit.jsp</value>
       </preference>
       <preference>
       <name>helpPage</name>
       <value>/notepad/help.jsp</value>
       </preference>
       <preference>
       <name>categories</name>
       </preference>
       <preference>
       <name>displayMax</name>
       <value>5</value>
       </preference>
       </portlet-preferences>
       </portlet>
      
       <portlet>
       <portlet-name>BookmarkPortlet</portlet-name>
       <portlet-class>com.sun.portal.portlet.samples.bookmarkportlet.BookmarkPortlet</portlet-class>
       <supported-locale>en</supported-locale>
       <resource-bundle>Resource</resource-bundle>
       <expiration-cache>0</expiration-cache>
       <supports>
       <mime-type>text/html</mime-type>
       <portlet-mode>EDIT</portlet-mode>
       <portlet-mode>HELP</portlet-mode>
       </supports>
       <supports>
       <mime-type>text/wml</mime-type>
       <portlet-mode>EDIT</portlet-mode>
       <portlet-mode>HELP</portlet-mode>
       </supports>
       <resource-bundle>BookmarkPortletRB</resource-bundle>
       <portlet-info>
       <title>BookmarkPortlet</title>
       </portlet-info>
       <portlet-preferences>
       <preference>
       <name>bookmarkContentPage</name>
       <value>/bookmarkportlet/content.jsp</value>
       </preference>
       <preference>
       <name>bookmarkEditPage</name>
       <value>/bookmarkportlet/edit.jsp</value>
       </preference>
       <preference>
       <name>bookmarkHelpPage</name>
       <value>/bookmarkportlet/help.jsp</value>
       </preference>
       <preference>
       <name>targets</name>
       <value>Sun home page=http://www.sun.com</value>
       <value>Oracle home page=http://www.oracle.com</value>
       <value>AOL home page=http://www.aol.com</value>
       </preference>
       <preference>
       <name>windowPref</name>
       <value>all_new</value>
       </preference>
       </portlet-preferences>
       </portlet>
      
       <portlet>
       <portlet-name>WeatherPortlet</portlet-name>
       <portlet-class>com.sun.portal.portlet.samples.weatherportlet.WeatherPortlet</portlet-class>
       <supported-locale>en</supported-locale>
       <resource-bundle>Resource</resource-bundle>
       <init-param>
       <name>weather.url</name>
       <value>http://services.xmethods.net:80/soap/servlet/rpcrouter</value>
       </init-param>
       <expiration-cache>3600</expiration-cache>
       <supports>
       <mime-type>text/html</mime-type>
       <portlet-mode>EDIT</portlet-mode>
       <portlet-mode>HELP</portlet-mode>
       </supports>
       <resource-bundle>WeatherPortletRB</resource-bundle>
       <portlet-info>
       <title>WeatherPortlet</title>
       </portlet-info>
       <portlet-preferences>
       <preference>
       <name>zip</name>
       <value>95054</value>
       </preference>
       <preference>
       <name>unit</name>
       <value>F</value>
       </preference>
       <preference>
       <name>contentPage</name>
       <value>/weather/weatherView.jsp</value>
       </preference>
       <preference>
       <name>editPage</name>
       <value>/weather/weatherEdit.jsp</value>
       </preference>
       <preference>
       <name>helpPage</name>
       <value>/weather/weatherHelp.jsp</value>
       </preference>
       <preferences-validator>com.sun.portal.portlet.samples.weatherportlet.WeatherValidator</preferences-validator>
       </portlet-preferences>
       </portlet>
       <user-attribute>
       <description>Preferred TimeZone</description>
       <name>timezone</name>
       </user-attribute>
       <user-attribute>
       <description>Preferred Locale</description>
       <name>locale</name>
       </user-attribute>
      </portlet-app>
      


      portlet-instances.xml
      <?xml version="1.0" standalone="yes"?>
      <instances>
       <instance>
       <instance-name>JSPPortletInstance</instance-name>
       <component-name>JSPPortlet</component-name>
       </instance>
       <instance>
       <instance-name>NotepadPortletInstance</instance-name>
       <component-name>NotepadPortlet</component-name>
       </instance>
       <instance>
       <instance-name>BookmarkPortletInstance</instance-name>
       <component-name>BookmarkPortlet</component-name>
       </instance>
       <instance>
       <instance-name>WeatherPortletInstance</instance-name>
       <component-name>WeatherPortlet</component-name>
       </instance>
      </instances>
      


      I made 4 "-pages.xml" files to define the pages for the diff portlets:
      eg.:
      samplenotepad-pages.xml
      <pages>
       <portal-name>default</portal-name>
       <page>
       <page-name>samplenotepad</page-name>
       <window>
       <window-name>NotepadPortletWindow</window-name>
       <instance-ref>SunSamples.NotepadPortlet.NotepadPortletInstance</instance-ref>
       <default>true</default>
       <region>left</region>
       <height>0</height>
       </window>
       </page>
      </pages>
      

      The other files are samplebookmark-pages.xml, samplejsp-pages.xml, sampleweather-pages.xml.

      Thats the scenario I have. Can you tell me whats wrong with it? I get the following error when jBossAS starts up:
      .
      .
      15:36:08,693 INFO [Window] Started
      15:36:08,694 INFO [HelloWorldPortletWindow] started
      15:36:10,080 INFO [TomcatDeployer] deploy, ctxPath=/jmx-console, warUrl=file:/usr/local/jboss-4.0.1sp1/server/default/deploy/jmx-console.war/
      15:36:12,678 INFO [TomcatDeployer] deploy, ctxPath=/web-console, warUrl=file:/usr/local/jboss-4.0.1sp1/server/default/deploy/management/web-console.war/
      15:36:16,607 INFO [TomcatDeployer] deploy, ctxPath=/SunSamples, warUrl=file:/usr/local/jboss-4.0.1sp1/server/default/deploy/myPortlets/SunSamples.war/
      15:36:17,784 ERROR [WebAppAdapter] Cannot handle the intercepted deployment
      java.lang.IllegalArgumentException: Too many children
       at org.jboss.portal.common.util.XML.getSingleChild(XML.java:186)
       at org.jboss.portal.portlet.deployment.builder.PortletBuilder.buildPortletMetaData(PortletBuilder.java:229)
       at org.jboss.portal.portlet.deployment.builder.PortletBuilder.build(PortletBuilder.java:150)
       at org.jboss.portal.core.deployment.builder.CorePortletBuilder.build(CorePortletBuilder.java:42)
       at org.jboss.portal.server.deployment.SimpleDeploymentReactor.build(SimpleDeploymentReactor.java:127)
       at org.jboss.portal.server.deployment.SimpleDeploymentReactor.build(SimpleDeploymentReactor.java:134)
       at org.jboss.portal.server.deployment.SimpleDeploymentReactor.build(SimpleDeploymentReactor.java:134)
       at org.jboss.portal.server.deployment.SimpleDeploymentReactor.process(SimpleDeploymentReactor.java:101)
       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
       at java.lang.reflect.Method.invoke(Method.java:324)
       at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:144)
       at org.jboss.mx.server.Invocation.dispatch(Invocation.java:80)
       at org.jboss.mx.interceptor.AbstractInterceptor.invoke(AbstractInterceptor.java:122)
       at org.jboss.mx.server.Invocation.invoke(Invocation.java:74)
       at org.jboss.mx.interceptor.ModelMBeanOperationInterceptor.invoke(ModelMBeanOperationInterceptor.java:131)
       at org.jboss.mx.server.Invocation.invoke(Invocation.java:74)
       at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:249)
       at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:642)
       at org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:177)
       at $Proxy35.process(Unknown Source)
       at org.jboss.portal.server.deployment.WebAppAdapter.deploy(WebAppAdapter.java:49)
       at org.jboss.portal.server.deployment.WebAppIntercepter.handleNotification(WebAppIntercepter.java:137)
       at org.jboss.mx.modelmbean.XMBean.handleNotification(XMBean.java:485)
       at sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
       at java.lang.reflect.Method.invoke(Method.java:324)
       at org.jboss.mx.notification.NotificationListenerProxy.invoke(NotificationListenerProxy.java:138)
       at $Proxy49.handleNotification(Unknown Source)
       at org.jboss.mx.util.JBossNotificationBroadcasterSupport.handleNotification(JBossNotificationBroadcasterSupport.java:112)
       at org.jboss.mx.util.JBossNotificationBroadcasterSupport.sendNotification(JBossNotificationBroadcasterSupport.java:93)
       at org.jboss.deployment.SubDeployerSupport.start(SubDeployerSupport.java:218)
       at org.jboss.web.AbstractWebContainer.start(AbstractWebContainer.java:376)
       at org.jboss.deployment.MainDeployer.start(MainDeployer.java:964)
       at org.jboss.deployment.MainDeployer.deploy(MainDeployer.java:775)
       at org.jboss.deployment.MainDeployer.deploy(MainDeployer.java:738)
       at sun.reflect.GeneratedMethodAccessor67.invoke(Unknown Source)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
       at java.lang.reflect.Method.invoke(Method.java:324)
       at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:144)
       at org.jboss.mx.server.Invocation.dispatch(Invocation.java:80)
       at org.jboss.mx.interceptor.AbstractInterceptor.invoke(AbstractInterceptor.java:122)
       at org.jboss.mx.server.Invocation.invoke(Invocation.java:74)
       at org.jboss.mx.interceptor.ModelMBeanOperationInterceptor.invoke(ModelMBeanOperationInterceptor.java:131)
       at org.jboss.mx.server.Invocation.invoke(Invocation.java:74)
       at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:249)
       at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:642)
       at org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:177)
       at $Proxy8.deploy(Unknown Source)
       at org.jboss.deployment.scanner.URLDeploymentScanner.deploy(URLDeploymentScanner.java:305)
       at org.jboss.deployment.scanner.URLDeploymentScanner.scan(URLDeploymentScanner.java:481)
       at org.jboss.deployment.scanner.AbstractDeploymentScanner$ScannerThread.doScan(AbstractDeploymentScanner.java:204)
       at org.jboss.deployment.scanner.AbstractDeploymentScanner.startService(AbstractDeploymentScanner.java:277)
       at org.jboss.system.ServiceMBeanSupport.jbossInternalStart(ServiceMBeanSupport.java:272)
       at org.jboss.system.ServiceMBeanSupport.jbossInternalLifecycle(ServiceMBeanSupport.java:222)
       at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
       at java.lang.reflect.Method.invoke(Method.java:324)
       at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:144)
       at org.jboss.mx.server.Invocation.dispatch(Invocation.java:80)
       at org.jboss.mx.server.Invocation.invoke(Invocation.java:72)
       at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:249)
       at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:642)
       at org.jboss.system.ServiceController$ServiceProxy.invoke(ServiceController.java:891)
       at $Proxy0.start(Unknown Source)
       at org.jboss.system.ServiceController.start(ServiceController.java:416)
       at sun.reflect.GeneratedMethodAccessor10.invoke(Unknown Source)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
       at java.lang.reflect.Method.invoke(Method.java:324)
       at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:144)
       at org.jboss.mx.server.Invocation.dispatch(Invocation.java:80)
       at org.jboss.mx.server.Invocation.invoke(Invocation.java:72)
       at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:249)
       at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:642)
       at org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:177)
       at $Proxy4.start(Unknown Source)
       at org.jboss.deployment.SARDeployer.start(SARDeployer.java:261)
       at org.jboss.deployment.MainDeployer.start(MainDeployer.java:964)
       at org.jboss.deployment.MainDeployer.deploy(MainDeployer.java:775)
       at org.jboss.deployment.MainDeployer.deploy(MainDeployer.java:738)
       at org.jboss.deployment.MainDeployer.deploy(MainDeployer.java:722)
       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
       at java.lang.reflect.Method.invoke(Method.java:324)
       at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:144)
       at org.jboss.mx.server.Invocation.dispatch(Invocation.java:80)
       at org.jboss.mx.interceptor.AbstractInterceptor.invoke(AbstractInterceptor.java:122)
       at org.jboss.mx.server.Invocation.invoke(Invocation.java:74)
       at org.jboss.mx.interceptor.ModelMBeanOperationInterceptor.invoke(ModelMBeanOperationInterceptor.java:131)
       at org.jboss.mx.server.Invocation.invoke(Invocation.java:74)
       at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:249)
       at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:642)
       at org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:177)
       at $Proxy5.deploy(Unknown Source)
       at org.jboss.system.server.ServerImpl.doStart(ServerImpl.java:413)
       at org.jboss.system.server.ServerImpl.start(ServerImpl.java:310)
       at org.jboss.Main.boot(Main.java:162)
       at org.jboss.Main$1.run(Main.java:423)
       at java.lang.Thread.run(Thread.java:534)
      .
      .
      .
      


      I looked at the ref-guide and there is a "*-portal.xml" descriptor. I think it has something to do with multiple portlets in one war file. But a few questions about that:

      1. What should be the complete name of the -portal.xml file? Is it appname-portal.xml?

      2. For something like abc-pages.xml, does the page-name inside have to be: <page-name>abc</page-name>

      3. In 2, how do I know the name "abc"? Is it anythign I want?

      4. If my portlets are in ABC.war, and so jboss-portlet.xml is in ABC/WEB-INF/ then in jboss-portlet.xml does the app-name have to be: <app-name>ABC</app-name> or it can be anythign I want?

      5. If I use "-portal.xml", then I don't need to define any "*-pages.xml" files? Does it mean there is only 1 "-portal.xml" file in one war directory?

      Thanks in advance,
      Karan



        • 1. Re: Multiple portlets, 1 war

          Another thing:

          In *-portal.xml, I define the portlet-name only once, but I can define multiple pages. How does that work? Does one portlet have multiple pages (i.e. like the Portal itself)? So for multiple portlets on the same page, I can have multiple -portal.xml files?

          Can someone clear up these doubts for me please?

          TIA,
          Karan

          • 2. Re: Multiple portlets, 1 war
            theute

            1) Anyname you want, it does not matter, as a rule you should call it [portalname]-portal.xml

            2) i don't think it's a requirement

            3) yes, anything you want

            4) no, it can be anything you want

            5) You can define different portals in 1 war

            Extra question) you define the portal-name once, you can define N pages per portal. I don't understand the end of your question.

            • 3. Re: Multiple portlets, 1 war

              Ok, that last post was a little ambigious.
              Here's an explanation:
              I want to put multiple portlets on the same portal html page. I understand I can define their locations (left, right) in the portlet.xml file. I can put their different classes in the same war.

              I don't clearly understand the concept of -pages.xml. It defines the url suffix which is used to access a particular portlet? Then why will 1 portlet have many different pages (when does a portlet require -portal.xml)?

              Now I want to make one application (one war), which is based on many different portlets showing up at different times on the user's screen. So for makign this application I will be making many different portlets. What I basically want to understand is how to show multiple portlets on one html screen. The ultimate goal is to transfer my web-application which is based on Freemarker, Struts and Hibernate to portlets.

              I know some questions might seem silly, or too easy, but its because I'm very new to jboss, portlets and portals. I have gone over a couple of JSR168 tutorials and have dissected a few portlets to get a better understanding. The ref guide clearly explained how to get one portlet to work in jboss portal and I can manage that easily now. Any suggestions on what to read are most welcome.

              • 4. Re: Multiple portlets, 1 war
                theute

                -pages.xml concept is to display multiple portlets on the same portal html page (your goal).

                You can put a portlet on different pages.

                I don't know why you say "It defines the url suffix which is used to access a particular portlet?"

                A portlet never requires -portal.xml but -pages.xml and -portal.xml can be define either in an application package with portlets or directly in the deploy directory of JBoss.

                • 5. Re: Multiple portlets, 1 war

                  Ok, here's what im trying to do:
                  I have made 4 helloworld portlets (basically copies of the basic helloworld with different names for each class). I want all these 4 portlets to display on the same html page.
                  Each portlet prints out a line on stdout whenever its accessed.

                  My WEB-INF contains jboss-portlet.xml:

                  <portlet-app>
                   <app-name>manyhellos</app-name>
                  </portlet-app>
                  


                  portlet.xml
                  <?xml version="1.0" encoding="UTF-8"?>
                  <portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd /opt/SUNWps/dtd/portlet.xsd" version="1.0">
                  
                   <portlet>
                   <portlet-name>HelloAPortlet</portlet-name>
                   <portlet-class>org.jboss.portlet.helloworld.HelloA</portlet-class>
                   <supported-locale>en</supported-locale>
                   <resource-bundle>Resource</resource-bundle>
                   <supports>
                   <mime-type>text/html</mime-type>
                   <portlet-mode>VIEW</portlet-mode>
                   </supports>
                   <portlet-info>
                   <title>My HelloA Portlet</title>
                   </portlet-info>
                   </portlet>
                  
                   <portlet>
                   <portlet-name>HelloBPortlet</portlet-name>
                   <portlet-class>org.jboss.portlet.helloworld.HelloB</portlet-class>
                   <supported-locale>en</supported-locale>
                   <resource-bundle>Resource</resource-bundle>
                   <supports>
                   <mime-type>text/html</mime-type>
                   <portlet-mode>VIEW</portlet-mode>
                   </supports>
                   <portlet-info>
                   <title>My HelloB Portlet</title>
                   </portlet-info>
                   </portlet>
                  
                   <portlet>
                   <portlet-name>HelloCPortlet</portlet-name>
                   <portlet-class>org.jboss.portlet.helloworld.HelloC</portlet-class>
                   <supported-locale>en</supported-locale>
                   <resource-bundle>Resource</resource-bundle>
                   <supports>
                   <mime-type>text/html</mime-type>
                   <portlet-mode>VIEW</portlet-mode>
                   </supports>
                   <portlet-info>
                   <title>My HelloC Portlet</title>
                   </portlet-info>
                   </portlet>
                  
                   <portlet>
                   <portlet-name>HelloDPortlet</portlet-name>
                   <portlet-class>org.jboss.portlet.helloworld.HelloD</portlet-class>
                   <supported-locale>en</supported-locale>
                   <resource-bundle>Resource</resource-bundle>
                   <supports>
                   <mime-type>text/html</mime-type>
                   <portlet-mode>VIEW</portlet-mode>
                   </supports>
                   <portlet-info>
                   <title>My HelloD Portlet</title>
                   </portlet-info>
                   </portlet>
                  
                  </portlet-app>
                  


                  portlet-instances.xml:
                  <?xml version="1.0" standalone="yes"?>
                  <instances>
                   <instance>
                   <instance-name>HelloAPortletInstance</instance-name>
                   <component-name>HelloAPortlet</component-name>
                   </instance>
                   <instance>
                   <instance-name>HelloBPortletInstance</instance-name>
                   <component-name>HelloBPortlet</component-name>
                   </instance>
                   <instance>
                   <instance-name>HelloCPortletInstance</instance-name>
                   <component-name>HelloCPortlet</component-name>
                   </instance>
                   <instance>
                   <instance-name>HelloDPortletInstance</instance-name>
                   <component-name>HelloDPortlet</component-name>
                   </instance>
                  </instances>
                  


                  There;s only 1 pages.xml file,even though there are 4 portlets. This is manyhellos-pages.xml in which I'm placing the many portlet windows:
                  <pages>
                   <portal-name>default</portal-name>
                  
                   <page>
                   <page-name>manyhellos</page-name>
                  
                   <window>
                   <window-name>HelloAPortletWindow</window-name>
                   <instance-ref>manyhellos.HelloAPortlet.HelloAPortletInstance</instance-ref>
                   <default>true</default>
                   <region>left</region>
                   <height>0</height>
                   </window>
                   <window>
                   <window-name>HelloBPortletWindow</window-name>
                   <instance-ref>manyhellos.HelloBPortlet.HelloBPortletInstance</instance-ref>
                   <default>true</default>
                   <region>right</region>
                   <height>0</height>
                   </window>
                   <window>
                   <window-name>HelloCPortletWindow</window-name>
                   <instance-ref>manyhellos.HelloCPortlet.HelloCPortletInstance</instance-ref>
                   <default>true</default>
                   <region>bottom</region>
                   <height>0</height>
                   </window>
                   <window>
                   <window-name>HelloDPortletWindow</window-name>
                   <instance-ref>manyhellos.HelloDPortlet.HelloDPortletInstance</instance-ref>
                   <default>true</default>
                   <region>top</region>
                   <height>0</height>
                   </window>
                  
                   </page>
                  
                  </pages>
                  


                  Now when I run the portal, it shows me the portlet "manyhellos" in the Page Menu. When I click on it, it only runs portlet HelloD. The output I get in stdout is only from HelloD, and it displays only the HelloD portlet on the page.

                  What am I doing wrong?

                  TIA,
                  Karan

                  • 6. Re: Multiple portlets, 1 war
                    theute

                    You must define only 1 default window, you have all your windows as default.

                    Make sure you have existing areas in your theme like top, bottom, right, left or put them all in left if you are using the default theme.

                    • 7. Re: Multiple portlets, 1 war

                      jeeeez. I can't beleive that's what I was doing wrong.
                      Blame it on Fridays.

                      Thank Thomas.
                      It works fine now.