You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@struts.apache.org by Hugo de Paix de Coeur <hu...@kabhal.org> on 2008/06/11 14:26:03 UTC

Multiple Struts2 WAR in a single EAR

Hello,

I'm currently trying to deploy two Struts2 enabled .war in a single
.ear on Glassfish.

My problem is : I've no isolation between the 2 projects at the action
dispatcher level.

----------------------------
Project A WAR struts.xml : 

<struts>
<package name="projectA-support" namespace="/" extends="struts2-default">

	<action name="Index" class="com.web.projectA.Index">
		<result>/jsp/index.jsp</result>
	</action>
								
</package>

Project B WAR struts.xml : 

<struts>
<package name="projectB-support" namespace="/" extends="struts2-default">

	<action name="Index" class="com.web.projectB.Index">
		<result>/jsp/index.jsp</result>
	</action>
								
	<action name="Login" class="com.web.projectB.Login">
		<result>/jsp/login.jsp</result>
	</action>
								
</package>

----------------------------

1- I can call 'http://localhost:8080/ProjectA/Login.action' and this is the 'com.web.projectB.Login' class that is executed (even if no Login action is specified in Project A) because they share the namespace '/'.

2- If I call 'http://localhost:8080/ProjectA/Index.action', this is the 'com.web.projectB.Index' class that is executed (last struts.xml to be parsed ?)

I've no clues to resolve this problem (the use of different namespaces doesn't resolve the problem either)
Any idea ?

-- 
Kab

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org


Re: Multiple Struts2 WAR in a single EAR

Posted by Hugo de Paix de Coeur <hu...@kabhal.org>.
Thanks for your advices...

Sure, the first configuration I tried was to put struts jars in each
.war/WEB-INF/lib.

For those interested, a good link on classloaders : https://glassfish.dev.java.net/nonav/javaee5/docs/DG/beade.html

But it doesn't work with Glassfish in this configuration because of xwork as I've already
pointed out :

--------------------------------------------------------------
[#|2008-06-12T11:22:06.192+0200|SEVERE|sun-appserver9.1|javax.enterprise.system.container.web|_ThreadID=20;_ThreadName=httpWorkerThread-4848-0;_RequestID=48141413-1d12-4d21-918f-3950921f55ab;|WebModule[/ProjectB]PWC1270:
Exception starting filter Struts2
Unable to load bean: type: class:com.opensymphony.xwork2.ObjectFactory - bean - jar:file:/Users/hugo/local/glassfish/domains/dev/applications/j2ee-apps/AgaVision/ProjectB_war/WEB-INF/lib/struts2-core-2.0.11.1.jar!/struts-default.xml:30:72

.... skipped stackTrace ....

Caused by: Bean type class com.opensymphony.xwork2.ObjectFactory with the name xwork has already been loaded by bean -
jar:file:/Users/hugo/local/glassfish/domains/dev/applications/j2ee-apps/AgaVision/ProjectA_war/WEB-INF/lib/struts2-core-2.0.11.1.jar!/struts-default.xml:30:72
- bean -
jar:file:/Users/hugo/local/glassfish/domains/dev/applications/j2ee-apps/AgaVision/ProjectB_war/WEB-INF/lib/struts2-core-2.0.11.1.jar!/struts-default.xml:30:72
--------------------------------------------------------------

It seems there are problems like this as stated in this interesting
forum entry : http://forums.java.net/jive/thread.jspa?messageID=260375

But I tried both class loader configuration in sun-web.xml descriptors  with the same result (see
stacktrace above).

-------------------------------------------
Default sun-web.xml : 
<class-loader delegate="true"/>

Modified sun-web.xml :
<class-loader delegate="false"/>
This configuration use firstly the childs classloaders before to
delegate.
-------------------------------------------

Tips :
- I've searched for other remaining struts jars but have not found any.
- I deploy directly from Eclipse, or export the ear from Eclipse and
  deploy it manually (Only 2 xwork references in the ear : 1 in each
  .war/WEB-INF/lib)   

I'm stuck with only one struts project by application for now...

On Wed, Jun 11, 2008 at 03:12:07PM +0200, Marc Ende wrote:
> In general it isn't a good idea to put those custom libs (like 
> struts.jar, spring.jar) etc. in classloaders of the main
> appserver. They should be in the applications-classloader so you can 
> avoid classloader-issues like leaks.
> 
> If you've got the first error it sounds to me that you've got the xwork 
> libs on ear level. If it's in web-inf/lib it shouldn't "see"
> each other. The classloaders _should_ be seperated. I'm not sure if 
> glassfish handles it correctly but I would think so.
> May be you've got another xwork.jar somewhere else, which is loaded at 
> first (such thing can happen if you build using maven and forgets to run 
> a clean before final build.)
> 
> If you've got two identically xwork.jars (or struts.jars) in the 
> classpath or in parent classpaths they will be considered as two
> different types/versions. So I would think that you'll have a xwork.jar 
> somewhere in your parent classpath.
> 
> The second error occures if the loaded classes from lib/ext didn't find 
> the dependent classes within the current and in one of the parent 
> classloaders (up to the bootclassloader). If the javax.servlet.Filter is 
> loaded by a seperate classloader (which might be a child of the 
> classloader (which loads the classes from lib/ext) it wouldn't  be found 
> by the lib/ext classes.
> 
> 
> Hugo de Paix de Coeur schrieb:
> >In fact, this was my second question, so I ask it now :)
> >
> >I have had problems with deploying *struts*.jar in this special
> >configuration (2 war in an ear).
> >- I tries to put them in each .war WEB-INF/lib
> >  => "Error : xwork...ObjectFactory already loaded in bean projectA" at 
> >  projectB deployment.
> >- I tries to put them in glassfish domain lib/ext
> >  => "Error : ClassLoader : Can't find javax.servlet.Filter"
> >
> >So, they are for now in the glassfish "main" lib.. but there are
> >problems too .. at runtime.
> >
> >What is the correct installation scheme for struts.jar with this
> >configuration ?
> >
> >Thx...
> >
> >On Wed, Jun 11, 2008 at 02:31:13PM +0200, Marc Ende wrote:
> >  
> >>Hello,
> >>
> >>do you deploy the struts.jar in the ear or in the WEB-INF/lib folders of 
> >>the war-files?
> >>if they're in the WEB-INF/lib folders they should be seperate.
> >>
> >>Marc
> >>
> >>
> >>Hugo de Paix de Coeur schrieb:
> >>    
> >>>Hello,
> >>>
> >>>I'm currently trying to deploy two Struts2 enabled .war in a single
> >>>.ear on Glassfish.
> >>>
> >>>My problem is : I've no isolation between the 2 projects at the action
> >>>dispatcher level.
> >>>
> >>>----------------------------
> >>>Project A WAR struts.xml : 
> >>>
> >>><struts>
> >>><package name="projectA-support" namespace="/" extends="struts2-default">
> >>>
> >>>	<action name="Index" class="com.web.projectA.Index">
> >>>		<result>/jsp/index.jsp</result>
> >>>	</action>
> >>>								
> >>></package>
> >>>
> >>>Project B WAR struts.xml : 
> >>>
> >>><struts>
> >>><package name="projectB-support" namespace="/" extends="struts2-default">
> >>>
> >>>	<action name="Index" class="com.web.projectB.Index">
> >>>		<result>/jsp/index.jsp</result>
> >>>	</action>
> >>>								
> >>>	<action name="Login" class="com.web.projectB.Login">
> >>>		<result>/jsp/login.jsp</result>
> >>>	</action>
> >>>								
> >>></package>
> >>>
> >>>----------------------------
> >>>
> >>>1- I can call 'http://localhost:8080/ProjectA/Login.action' and this is 
> >>>the 'com.web.projectB.Login' class that is executed (even if no Login 
> >>>action is specified in Project A) because they share the namespace '/'.
> >>>
> >>>2- If I call 'http://localhost:8080/ProjectA/Index.action', this is the 
> >>>'com.web.projectB.Index' class that is executed (last struts.xml to be 
> >>>parsed ?)
> >>>
> >>>I've no clues to resolve this problem (the use of different namespaces 
> >>>doesn't resolve the problem either)
> >>>Any idea ?
> >>>
> >>> 
> >>>      
> >>---------------------------------------------------------------------
> >>To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
> >>For additional commands, e-mail: user-help@struts.apache.org
> >>
> >>    
> >
> >  
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
> For additional commands, e-mail: user-help@struts.apache.org
> 

-- 
Hugo de Paix de Coeur [Kabhal] <hugo[AT]kab[NOSPAM]hal.org>
Contacts: http://www.kabhal.org/~hugo

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org


Re: Multiple Struts2 WAR in a single EAR

Posted by Marc Ende <ml...@e-beyond.de>.
In general it isn't a good idea to put those custom libs (like 
struts.jar, spring.jar) etc. in classloaders of the main
appserver. They should be in the applications-classloader so you can 
avoid classloader-issues like leaks.

If you've got the first error it sounds to me that you've got the xwork 
libs on ear level. If it's in web-inf/lib it shouldn't "see"
each other. The classloaders _should_ be seperated. I'm not sure if 
glassfish handles it correctly but I would think so.
May be you've got another xwork.jar somewhere else, which is loaded at 
first (such thing can happen if you build using maven and forgets to run 
a clean before final build.)

If you've got two identically xwork.jars (or struts.jars) in the 
classpath or in parent classpaths they will be considered as two
different types/versions. So I would think that you'll have a xwork.jar 
somewhere in your parent classpath.

The second error occures if the loaded classes from lib/ext didn't find 
the dependent classes within the current and in one of the parent 
classloaders (up to the bootclassloader). If the javax.servlet.Filter is 
loaded by a seperate classloader (which might be a child of the 
classloader (which loads the classes from lib/ext) it wouldn't  be found 
by the lib/ext classes.


Hugo de Paix de Coeur schrieb:
> In fact, this was my second question, so I ask it now :)
>
> I have had problems with deploying *struts*.jar in this special
> configuration (2 war in an ear).
> - I tries to put them in each .war WEB-INF/lib
>   => "Error : xwork...ObjectFactory already loaded in bean projectA" at projectB deployment.
> - I tries to put them in glassfish domain lib/ext
>   => "Error : ClassLoader : Can't find javax.servlet.Filter"
>
> So, they are for now in the glassfish "main" lib.. but there are
> problems too .. at runtime.
>
> What is the correct installation scheme for struts.jar with this
> configuration ?
>
> Thx...
>
> On Wed, Jun 11, 2008 at 02:31:13PM +0200, Marc Ende wrote:
>   
>> Hello,
>>
>> do you deploy the struts.jar in the ear or in the WEB-INF/lib folders of 
>> the war-files?
>> if they're in the WEB-INF/lib folders they should be seperate.
>>
>> Marc
>>
>>
>> Hugo de Paix de Coeur schrieb:
>>     
>>> Hello,
>>>
>>> I'm currently trying to deploy two Struts2 enabled .war in a single
>>> .ear on Glassfish.
>>>
>>> My problem is : I've no isolation between the 2 projects at the action
>>> dispatcher level.
>>>
>>> ----------------------------
>>> Project A WAR struts.xml : 
>>>
>>> <struts>
>>> <package name="projectA-support" namespace="/" extends="struts2-default">
>>>
>>> 	<action name="Index" class="com.web.projectA.Index">
>>> 		<result>/jsp/index.jsp</result>
>>> 	</action>
>>> 								
>>> </package>
>>>
>>> Project B WAR struts.xml : 
>>>
>>> <struts>
>>> <package name="projectB-support" namespace="/" extends="struts2-default">
>>>
>>> 	<action name="Index" class="com.web.projectB.Index">
>>> 		<result>/jsp/index.jsp</result>
>>> 	</action>
>>> 								
>>> 	<action name="Login" class="com.web.projectB.Login">
>>> 		<result>/jsp/login.jsp</result>
>>> 	</action>
>>> 								
>>> </package>
>>>
>>> ----------------------------
>>>
>>> 1- I can call 'http://localhost:8080/ProjectA/Login.action' and this is 
>>> the 'com.web.projectB.Login' class that is executed (even if no Login 
>>> action is specified in Project A) because they share the namespace '/'.
>>>
>>> 2- If I call 'http://localhost:8080/ProjectA/Index.action', this is the 
>>> 'com.web.projectB.Index' class that is executed (last struts.xml to be 
>>> parsed ?)
>>>
>>> I've no clues to resolve this problem (the use of different namespaces 
>>> doesn't resolve the problem either)
>>> Any idea ?
>>>
>>>  
>>>       
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
>> For additional commands, e-mail: user-help@struts.apache.org
>>
>>     
>
>   


---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org


Re: Multiple Struts2 WAR in a single EAR

Posted by Hugo de Paix de Coeur <hu...@kabhal.org>.
In fact, this was my second question, so I ask it now :)

I have had problems with deploying *struts*.jar in this special
configuration (2 war in an ear).
- I tries to put them in each .war WEB-INF/lib
  => "Error : xwork...ObjectFactory already loaded in bean projectA" at projectB deployment.
- I tries to put them in glassfish domain lib/ext
  => "Error : ClassLoader : Can't find javax.servlet.Filter"

So, they are for now in the glassfish "main" lib.. but there are
problems too .. at runtime.

What is the correct installation scheme for struts.jar with this
configuration ?

Thx...

On Wed, Jun 11, 2008 at 02:31:13PM +0200, Marc Ende wrote:
> Hello,
> 
> do you deploy the struts.jar in the ear or in the WEB-INF/lib folders of 
> the war-files?
> if they're in the WEB-INF/lib folders they should be seperate.
> 
> Marc
> 
> 
> Hugo de Paix de Coeur schrieb:
> >Hello,
> >
> >I'm currently trying to deploy two Struts2 enabled .war in a single
> >.ear on Glassfish.
> >
> >My problem is : I've no isolation between the 2 projects at the action
> >dispatcher level.
> >
> >----------------------------
> >Project A WAR struts.xml : 
> >
> ><struts>
> ><package name="projectA-support" namespace="/" extends="struts2-default">
> >
> >	<action name="Index" class="com.web.projectA.Index">
> >		<result>/jsp/index.jsp</result>
> >	</action>
> >								
> ></package>
> >
> >Project B WAR struts.xml : 
> >
> ><struts>
> ><package name="projectB-support" namespace="/" extends="struts2-default">
> >
> >	<action name="Index" class="com.web.projectB.Index">
> >		<result>/jsp/index.jsp</result>
> >	</action>
> >								
> >	<action name="Login" class="com.web.projectB.Login">
> >		<result>/jsp/login.jsp</result>
> >	</action>
> >								
> ></package>
> >
> >----------------------------
> >
> >1- I can call 'http://localhost:8080/ProjectA/Login.action' and this is 
> >the 'com.web.projectB.Login' class that is executed (even if no Login 
> >action is specified in Project A) because they share the namespace '/'.
> >
> >2- If I call 'http://localhost:8080/ProjectA/Index.action', this is the 
> >'com.web.projectB.Index' class that is executed (last struts.xml to be 
> >parsed ?)
> >
> >I've no clues to resolve this problem (the use of different namespaces 
> >doesn't resolve the problem either)
> >Any idea ?
> >
> >  
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
> For additional commands, e-mail: user-help@struts.apache.org
> 

-- 
Hugo de Paix de Coeur [Kabhal] <hugo[AT]kab[NOSPAM]hal.org>
Contacts: http://www.kabhal.org/~hugo

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org


Re: Multiple Struts2 WAR in a single EAR

Posted by Marc Ende <ml...@e-beyond.de>.
Hello,

do you deploy the struts.jar in the ear or in the WEB-INF/lib folders of 
the war-files?
if they're in the WEB-INF/lib folders they should be seperate.

Marc


Hugo de Paix de Coeur schrieb:
> Hello,
>
> I'm currently trying to deploy two Struts2 enabled .war in a single
> .ear on Glassfish.
>
> My problem is : I've no isolation between the 2 projects at the action
> dispatcher level.
>
> ----------------------------
> Project A WAR struts.xml : 
>
> <struts>
> <package name="projectA-support" namespace="/" extends="struts2-default">
>
> 	<action name="Index" class="com.web.projectA.Index">
> 		<result>/jsp/index.jsp</result>
> 	</action>
> 								
> </package>
>
> Project B WAR struts.xml : 
>
> <struts>
> <package name="projectB-support" namespace="/" extends="struts2-default">
>
> 	<action name="Index" class="com.web.projectB.Index">
> 		<result>/jsp/index.jsp</result>
> 	</action>
> 								
> 	<action name="Login" class="com.web.projectB.Login">
> 		<result>/jsp/login.jsp</result>
> 	</action>
> 								
> </package>
>
> ----------------------------
>
> 1- I can call 'http://localhost:8080/ProjectA/Login.action' and this is the 'com.web.projectB.Login' class that is executed (even if no Login action is specified in Project A) because they share the namespace '/'.
>
> 2- If I call 'http://localhost:8080/ProjectA/Index.action', this is the 'com.web.projectB.Index' class that is executed (last struts.xml to be parsed ?)
>
> I've no clues to resolve this problem (the use of different namespaces doesn't resolve the problem either)
> Any idea ?
>
>   


---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org