You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomcat.apache.org by Pankaj Tandon <pa...@gmail.com> on 2009/06/16 16:39:17 UTC

Using JMX with Tomcat: classloading issues

Hi all,
I am writing a webapp that uses JMX to manage weblogic and websphere servers
and hosting it on Tomcat 6.0.18. The app also uses Jython to manipulate
MBeans within the app servers.

Here's the issue that I'm facing:
To get a JMX connection using JMXConnectionFactory using below:
JMXConnector connector = JMXConnectorFactory.connect(serviceURL, h);
I have to rely on classes in weblogic.jar
That is because the implementation of JMXConnector is in weblogic.jar.
However, the interface/abstract class for JMXConnectionFactory lives in
rt.jar that comes with JDK1.5 or JDK1.6

Because rt.jar is (probably) used by the bootstrap classloader, I HAVE to
include weblogic.jar in the CATALINA_HOME/common/lib directory. If I do so,
I can get the JMX part of the solution to work because both, rt.jar and
weblogic.jar are loaded by the same (system) classloader. 

But then my Jython classes do not work because jython.jar is tucked away in
the webapp's WEB-INF/lib dir of the webapp and my Jython solution needs
classes from weblogic.jar which is loaded by the system classloader and
hence in a different namespace.
I tried placing jython.jar in common/lib too, but that did not work because
Jython needs classes from my webapp and I go down a slippery slope of
chasing classes across classlaoders.

So the ideal solution would be to get weblogic.jar loaded from the webapp
classloader. And not place anything in the CATALINA_HOME/common/lib
directory.

How can I place weblogic.jar in the webapp classlaoder and have my JMX
solution work, given that javax.management.remote.JMXConnectorFactory
resides in rt.jar which is in the System classpath?

Any pointers will be appreciated!

Thanks a lot!

Pankaj




-- 
View this message in context: http://www.nabble.com/Using-JMX-with-Tomcat%3A-classloading-issues-tp24055767p24055767.html
Sent from the Tomcat - User mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org


Re: Using JMX with Tomcat: classloading issues

Posted by Pankaj Tandon <pa...@gmail.com>.
@chuck and @martin You both helped me. Turns out that I could move all
weblogic classes in WEB-INF/lib and out of the System classloader. But
moving just weblogic.jar did not do the trick. I needed to package the
following jars from the BEA distribution into the Webapp:
weblogic.jar
wljmxclient.jar
wlclient.jar

Thanks for your help!

Pankaj


Pankaj Tandon wrote:
> 
> Hi all,
> I am writing a webapp that uses JMX to manage weblogic and websphere
> servers and hosting it on Tomcat 6.0.18. The app also uses Jython to
> manipulate MBeans within the app servers.
> 
> Here's the issue that I'm facing:
> To get a JMX connection using JMXConnectionFactory using below:
> JMXConnector connector = JMXConnectorFactory.connect(serviceURL, h);
> I have to rely on classes in weblogic.jar
> That is because the implementation of JMXConnector is in weblogic.jar.
> However, the interface/abstract class for JMXConnectionFactory lives in
> rt.jar that comes with JDK1.5 or JDK1.6
> 
> Because rt.jar is (probably) used by the bootstrap classloader, I HAVE to
> include weblogic.jar in the CATALINA_HOME/common/lib directory. If I do
> so, I can get the JMX part of the solution to work because both, rt.jar
> and weblogic.jar are loaded by the same (system) classloader. 
> 
> But then my Jython classes do not work because jython.jar is tucked away
> in the webapp's WEB-INF/lib dir of the webapp and my Jython solution needs
> classes from weblogic.jar which is loaded by the system classloader and
> hence in a different namespace.
> I tried placing jython.jar in common/lib too, but that did not work
> because Jython needs classes from my webapp and I go down a slippery slope
> of chasing classes across classlaoders.
> 
> So the ideal solution would be to get weblogic.jar loaded from the webapp
> classloader. And not place anything in the CATALINA_HOME/common/lib
> directory.
> 
> How can I place weblogic.jar in the webapp classlaoder and have my JMX
> solution work, given that javax.management.remote.JMXConnectorFactory
> resides in rt.jar which is in the System classpath?
> 
> Any pointers will be appreciated!
> 
> Thanks a lot!
> 
> Pankaj
> 
> 
> 
> 
> 

-- 
View this message in context: http://www.nabble.com/Using-JMX-with-Tomcat%3A-classloading-issues-tp24055767p24058867.html
Sent from the Tomcat - User mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org


RE: Using JMX with Tomcat: classloading issues

Posted by "Caldarale, Charles R" <Ch...@unisys.com>.
> From: Pankaj Tandon [mailto:pankajtandon@gmail.com]
> Subject: Using JMX with Tomcat: classloading issues
> 
> Because rt.jar is (probably) used by the bootstrap classloader,
> I HAVE to include weblogic.jar in the CATALINA_HOME/common/lib
> directory.

Yes, rt.jar is handled by the bootstrap classloader.  Why do you think that requires placing weblogic.jar in common/lib?  It should work properly in your webapp's WEB-INF/lib, which would be the preferred location.

However, weblogic.jar may contain classes that Tomcat already supplies (notably the ones in servlet-api.jar), so these would need to be removed from weblogic.jar before you can use it anywhere.

> I can get the JMX part of the solution to work because both, rt.jar and
> weblogic.jar are loaded by the same (system) classloader.

That statement is also not true.  As previously established, rt.jar is handled by the bootstrap classloader, while jars in common/lib are handled by Tomcat's common classloader.

> But then my Jython classes do not work because jython.jar is tucked
> away in the webapp's WEB-INF/lib dir of the webapp and my Jython 
> solution needs classes from weblogic.jar which is loaded by the
> system classloader and hence in a different namespace.

I think you're misinterpreting whatever symptoms you're encountering.  None of what you describe so far is a problem, although you do have some misconceptions about how classloading in Tomcat works.

What symptoms are you seeing?  (You never actually said.)

 - Chuck


THIS COMMUNICATION MAY CONTAIN CONFIDENTIAL AND/OR OTHERWISE PROPRIETARY MATERIAL and is thus for use only by the intended recipient. If you received this in error, please contact the sender and delete the e-mail and its attachments from all computers.


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org


RE: Using JMX with Tomcat: classloading issues

Posted by Martin Gainty <mg...@hotmail.com>.
request TOMCAT use the weblogic.management.remote package from wljmxclient.jar instead as illustrated here:

Djmx.remote.protocol.provider.pkgs=weblogic.management.remote



and 



Djava.class.path="D:\jdk1.5.0_16\lib\jconsole.jar;D:\jdk1.5.0_16\lib\tools.jar;%WL_HOME%\server\lib\wljmxclient.jar"

http://e-docs.bea.com/wls/docs81/jms/thin_client.html

Martin Gainty 
______________________________________________ 
Verzicht und Vertraulichkeitanmerkung/Note de déni et de confidentialité
 
Diese Nachricht ist vertraulich. Sollten Sie nicht der vorgesehene Empfaenger sein, so bitten wir hoeflich um eine Mitteilung. Jede unbefugte Weiterleitung oder Fertigung einer Kopie ist unzulaessig. Diese Nachricht dient lediglich dem Austausch von Informationen und entfaltet keine rechtliche Bindungswirkung. Aufgrund der leichten Manipulierbarkeit von E-Mails koennen wir keine Haftung fuer den Inhalt uebernehmen.
Ce message est confidentiel et peut être privilégié. Si vous n'êtes pas le destinataire prévu, nous te demandons avec bonté que pour satisfaire informez l'expéditeur. N'importe quelle diffusion non autorisée ou la copie de ceci est interdite. Ce message sert à l'information seulement et n'aura pas n'importe quel effet légalement obligatoire. Étant donné que les email peuvent facilement être sujets à la manipulation, nous ne pouvons accepter aucune responsabilité pour le contenu fourni.




> Date: Tue, 16 Jun 2009 07:39:17 -0700
> From: pankajtandon@gmail.com
> To: users@tomcat.apache.org
> Subject: Using JMX with Tomcat: classloading issues
> 
> 
> Hi all,
> I am writing a webapp that uses JMX to manage weblogic and websphere servers
> and hosting it on Tomcat 6.0.18. The app also uses Jython to manipulate
> MBeans within the app servers.
> 
> Here's the issue that I'm facing:
> To get a JMX connection using JMXConnectionFactory using below:
> JMXConnector connector = JMXConnectorFactory.connect(serviceURL, h);
> I have to rely on classes in weblogic.jar
> That is because the implementation of JMXConnector is in weblogic.jar.
> However, the interface/abstract class for JMXConnectionFactory lives in
> rt.jar that comes with JDK1.5 or JDK1.6
> 
> Because rt.jar is (probably) used by the bootstrap classloader, I HAVE to
> include weblogic.jar in the CATALINA_HOME/common/lib directory. If I do so,
> I can get the JMX part of the solution to work because both, rt.jar and
> weblogic.jar are loaded by the same (system) classloader. 
> 
> But then my Jython classes do not work because jython.jar is tucked away in
> the webapp's WEB-INF/lib dir of the webapp and my Jython solution needs
> classes from weblogic.jar which is loaded by the system classloader and
> hence in a different namespace.
> I tried placing jython.jar in common/lib too, but that did not work because
> Jython needs classes from my webapp and I go down a slippery slope of
> chasing classes across classlaoders.
> 
> So the ideal solution would be to get weblogic.jar loaded from the webapp
> classloader. And not place anything in the CATALINA_HOME/common/lib
> directory.
> 
> How can I place weblogic.jar in the webapp classlaoder and have my JMX
> solution work, given that javax.management.remote.JMXConnectorFactory
> resides in rt.jar which is in the System classpath?
> 
> Any pointers will be appreciated!
> 
> Thanks a lot!
> 
> Pankaj
> 
> 
> 
> 
> -- 
> View this message in context: http://www.nabble.com/Using-JMX-with-Tomcat%3A-classloading-issues-tp24055767p24055767.html
> Sent from the Tomcat - User mailing list archive at Nabble.com.
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: users-help@tomcat.apache.org
> 

_________________________________________________________________
Microsoft brings you a new way to search the web.  Try  Bing™ now
http://www.bing.com?form=MFEHPG&publ=WLHMTAG&crea=TEXT_MFEHPG_Core_tagline_try bing_1x1

Re: Using JMX with Tomcat: classloading issues

Posted by Pankaj Tandon <pa...@gmail.com>.
@Chuck: Yes, I did kind of munge the bootstrap and System classloaders
together. But the problem still remains. When I remove weblogic.jar from
common/lib and my code attempts to establish a JMX connection using below:
JMXConnector connector = JMXConnectorFactory.connect(serviceURL, h);

I get the following error stack:
java.net.MalformedURLException: Unsupported protocol: t3

javax.management.remote.JMXConnectorFactory.newJMXConnector(JMXConnectorFactory.java:327)

javax.management.remote.JMXConnectorFactory.connect(JMXConnectorFactory.java:247)

com.fedex.ground.scm.service.ControllerServiceImpl.initConnection(ControllerServiceImpl.java:105)

com.fedex.ground.scm.service.ControllerServiceImpl.retrieveAppDataForHost(ControllerServiceImpl.java:47)
	com.fedex.ground.scm.ControllerBean.setSelectedHost(ControllerBean.java:75)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	java.lang.reflect.Method.invoke(Method.java:597)
	org.apache.el.parser.AstValue.invoke(AstValue.java:172)
	org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)

com.sun.faces.application.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:71)
	javax.faces.component.UICommand.broadcast(UICommand.java:377)

com.icesoft.faces.component.panelseries.UISeries$RowEvent.broadcast(UISeries.java:559)

com.icesoft.faces.component.panelseries.UISeries.broadcast(UISeries.java:238)
	javax.faces.component.UIData.broadcast(UIData.java:849)

com.icesoft.faces.component.panelseries.UISeries.broadcast(UISeries.java:233)
	javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:452)
	javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:764)

com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97)
	com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:266)
	com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:132)

com.icesoft.faces.webapp.http.core.JsfLifecycleExecutor.apply(JsfLifecycleExecutor.java:17)

com.icesoft.faces.webapp.http.core.ReceiveSendUpdates.renderCyclePartial(ReceiveSendUpdates.java:64)

com.icesoft.faces.webapp.http.core.ReceiveSendUpdates.service(ReceiveSendUpdates.java:40)

com.icesoft.faces.webapp.http.core.ViewBoundServer.service(ViewBoundServer.java:65)

com.icesoft.faces.webapp.http.core.RequestVerifier.service(RequestVerifier.java:44)

com.icesoft.faces.webapp.http.common.standard.PathDispatcherServer$Matcher.serviceOnMatch(PathDispatcherServer.java:50)

com.icesoft.faces.webapp.http.common.standard.PathDispatcherServer.service(PathDispatcherServer.java:19)

com.icesoft.faces.webapp.http.servlet.ThreadBlockingAdaptingServlet.service(ThreadBlockingAdaptingServlet.java:19)

com.icesoft.faces.webapp.http.servlet.EnvironmentAdaptingServlet.service(EnvironmentAdaptingServlet.java:63)

com.icesoft.faces.webapp.http.servlet.MainSessionBoundServlet.service(MainSessionBoundServlet.java:139)

com.icesoft.faces.webapp.http.servlet.SessionDispatcher.service(SessionDispatcher.java:53)

com.icesoft.faces.webapp.http.servlet.PathDispatcher$Matcher.serviceOnMatch(PathDispatcher.java:52)

com.icesoft.faces.webapp.http.servlet.PathDispatcher.service(PathDispatcher.java:29)

com.icesoft.faces.webapp.http.servlet.MainServlet.service(MainServlet.java:82)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

com.icesoft.faces.webapp.xmlhttp.BlockingServlet.service(BlockingServlet.java:46)

t3 is a WLS proprietary protocol so I am assuming that JMXConnectorFactory
does not even get to the weblogic.jar class to pick up the JMX classes to
recognize the weblogic protocol.

So that is the symptom. If I can get the Weblogic.jar file out of the System
classpath (and into the WEB-INF/lib), I'm pretty sure, I can get the Jython
piece to work. 


@Martin: The wljmxclient.jar that you mentioned does not have the class
JMXConnector. And I'm not sure why jConsole is being used here.

Thanks!

Pankaj





Pankaj Tandon wrote:
> 
> Hi all,
> I am writing a webapp that uses JMX to manage weblogic and websphere
> servers and hosting it on Tomcat 6.0.18. The app also uses Jython to
> manipulate MBeans within the app servers.
> 
> Here's the issue that I'm facing:
> To get a JMX connection using JMXConnectionFactory using below:
> JMXConnector connector = JMXConnectorFactory.connect(serviceURL, h);
> I have to rely on classes in weblogic.jar
> That is because the implementation of JMXConnector is in weblogic.jar.
> However, the interface/abstract class for JMXConnectionFactory lives in
> rt.jar that comes with JDK1.5 or JDK1.6
> 
> Because rt.jar is (probably) used by the bootstrap classloader, I HAVE to
> include weblogic.jar in the CATALINA_HOME/common/lib directory. If I do
> so, I can get the JMX part of the solution to work because both, rt.jar
> and weblogic.jar are loaded by the same (system) classloader. 
> 
> But then my Jython classes do not work because jython.jar is tucked away
> in the webapp's WEB-INF/lib dir of the webapp and my Jython solution needs
> classes from weblogic.jar which is loaded by the system classloader and
> hence in a different namespace.
> I tried placing jython.jar in common/lib too, but that did not work
> because Jython needs classes from my webapp and I go down a slippery slope
> of chasing classes across classlaoders.
> 
> So the ideal solution would be to get weblogic.jar loaded from the webapp
> classloader. And not place anything in the CATALINA_HOME/common/lib
> directory.
> 
> How can I place weblogic.jar in the webapp classlaoder and have my JMX
> solution work, given that javax.management.remote.JMXConnectorFactory
> resides in rt.jar which is in the System classpath?
> 
> Any pointers will be appreciated!
> 
> Thanks a lot!
> 
> Pankaj
> 
> 
> 
> 
> 

-- 
View this message in context: http://www.nabble.com/Using-JMX-with-Tomcat%3A-classloading-issues-tp24055767p24057930.html
Sent from the Tomcat - User mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org