Hi, In mean time devs from HotSwapAgent replied my question on github, they give another idea to create a plugin for WSO2 on Hot Swap Agent, I will try that way too.
Here is the post: https://github.com/HotswapProjects/HotswapAgent/issues/107 Thanks Clóvis 2016-01-25 9:16 GMT-02:00 Clovis Wichoski <clo...@neoinix.com.br>: > Hi, > > Its very fine that have a fix, I will try and give you some feedback if > that works. > > Thanks > > Clóvis > > 2016-01-25 4:52 GMT-02:00 Thusitha Thilina Dayaratne <thusit...@wso2.com>: > >> Hi, >> >> AFAIU we can easily fix this by adding a null check to webappCC in the >> CarbonWebappClassLoader.getResource method as follows >> >> public Enumeration<URL> getResources(String name) throws IOException { >> Enumeration[] tmp = new Enumeration[2]; >> if (parent != null && webappCC != null) { // add a null check to webappCC >> >> ..... >> >> WDYT? >> >> >> Thanks >> >> Thusitha >> >> >> On Mon, Jan 25, 2016 at 12:04 PM, Thusitha Thilina Dayaratne < >> thusit...@wso2.com> wrote: >> >>> Hi Clovis, >>> >>> I've checked on the error that you have mentioned. >>> According to the hotswapagent logic >>> *org.hotswap.agent.plugin.tomcat.TomcatPlugin.init() >>> *method get called during WebappLoader.start lifecycle event. But at >>> the time STARTING event get fired we haven't set >>> the WebappClassloadingContext to the WebappClassloader. Therefore when it >>> tries to do some checks in order to load the resources it throws the NPE. >>> >>> *org.wso2.carbon.webapp.mgt.loader.CarbonWebappLoader* >>> >>> @Override >>> protected void startInternal() throws LifecycleException { >>> >>> ....... >>> >>> super.startInternal(); ----> In this point STARTING even get fired and so >>> *TomcatPlugin.init * method get called and it try to get the resource. That >>> called getResources method and since we haven't still set the >>> webappClassloadingContext it throws a NPE. >>> >>> >>> //Adding the WebappClassloadingContext to the WebappClassloader >>> >>> ((CarbonWebappClassLoader) >>> getClassLoader()).setWebappCC(webappClassloadingContext); // This is >>> the point where we are setting the webappClassloadingContext >>> >>> Thanks >>> Thusitha >>> >>> On Fri, Jan 22, 2016 at 4:54 PM, Clovis Wichoski <clo...@neoinix.com.br> >>> wrote: >>> >>>> Hi Kishanthan, >>>> >>>> The redeploy all of a small system its ok, but for a big one, its a >>>> problem, just a change in one class you must redeploy, loose sessions, >>>> restart the system from scratch, to reach the point of test again, with the >>>> ideas used by HotSwapAgent they act on reloading only that one class >>>> changed, this way speeds the development time, these ideas are well >>>> defended by JRebel tool, that HotSwapAgent tends to be a choice as an open >>>> source solution. Please note that this feature is only needed for >>>> development phase, in production, the scheduled task its ok. >>>> >>>> I mean time I tested with AS 5.3.0, JRebel and HotSwapAgent, JRebel >>>> trial worked as expected, but HotSwapAgent not (see exception bellow [1]), >>>> I will check these problems with HotSwapAgent devs, and try to discover why >>>> dont works with WSO2 AS as with HotSwapAgent active none of webapps load, >>>> all get that exception, as we see a NPE in class CarbonWebappClassLoader >>>> maybe its the way they initialize the dependent class loaders. >>>> >>>> [1] Exception when HotSwapAgent is active: >>>> [2016-01-22 09:14:18,467] ERROR >>>> {org.apache.catalina.core.ContainerBase} - ContainerBase.addChild: start: >>>> org.apache.catalina.LifecycleException: Failed to start component >>>> [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/example]] >>>> at >>>> org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154) >>>> at >>>> org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901) >>>> at >>>> org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877) >>>> at >>>> org.apache.catalina.core.StandardHost.addChild(StandardHost.java:649) >>>> at >>>> org.wso2.carbon.tomcat.internal.CarbonTomcat.addWebApp(CarbonTomcat.java:344) >>>> at >>>> org.wso2.carbon.tomcat.internal.CarbonTomcat.addWebApp(CarbonTomcat.java:252) >>>> at >>>> org.wso2.carbon.webapp.mgt.TomcatGenericWebappsDeployer.handleWebappDeployment(TomcatGenericWebappsDeployer.java:314) >>>> at >>>> org.wso2.carbon.webapp.mgt.TomcatGenericWebappsDeployer.handleWarWebappDeployment(TomcatGenericWebappsDeployer.java:212) >>>> at >>>> org.wso2.carbon.webapp.mgt.TomcatGenericWebappsDeployer.handleHotDeployment(TomcatGenericWebappsDeployer.java:179) >>>> at >>>> org.wso2.carbon.webapp.mgt.TomcatGenericWebappsDeployer.deploy(TomcatGenericWebappsDeployer.java:144) >>>> at >>>> org.wso2.carbon.webapp.mgt.AbstractWebappDeployer.deployThisWebApp(AbstractWebappDeployer.java:224) >>>> at >>>> org.wso2.carbon.webapp.mgt.AbstractWebappDeployer.deploy(AbstractWebappDeployer.java:114) >>>> at >>>> org.wso2.carbon.webapp.deployer.WebappDeployer.deploy(WebappDeployer.java:42) >>>> at >>>> org.apache.axis2.deployment.repository.util.DeploymentFileData.deploy(DeploymentFileData.java:136) >>>> at >>>> org.apache.axis2.deployment.DeploymentEngine.doDeploy(DeploymentEngine.java:807) >>>> at >>>> org.apache.axis2.deployment.repository.util.WSInfoList.update(WSInfoList.java:144) >>>> at >>>> org.apache.axis2.deployment.RepositoryListener.update(RepositoryListener.java:377) >>>> at >>>> org.apache.axis2.deployment.RepositoryListener.checkServices(RepositoryListener.java:254) >>>> at >>>> org.apache.axis2.deployment.DeploymentEngine.loadServices(DeploymentEngine.java:135) >>>> at >>>> org.wso2.carbon.core.CarbonAxisConfigurator.deployServices(CarbonAxisConfigurator.java:567) >>>> at >>>> org.wso2.carbon.core.internal.DeploymentServerStartupObserver.completingServerStartup(DeploymentServerStartupObserver.java:51) >>>> at >>>> org.wso2.carbon.core.internal.CarbonCoreServiceComponent.notifyBefore(CarbonCoreServiceComponent.java:235) >>>> at >>>> org.wso2.carbon.core.internal.StartupFinalizerServiceComponent.completeInitialization(StartupFinalizerServiceComponent.java:185) >>>> at >>>> org.wso2.carbon.core.internal.StartupFinalizerServiceComponent.serviceChanged(StartupFinalizerServiceComponent.java:288) >>>> at >>>> org.eclipse.osgi.internal.serviceregistry.FilteredServiceListener.serviceChanged(FilteredServiceListener.java:107) >>>> at >>>> org.eclipse.osgi.framework.internal.core.BundleContextImpl.dispatchEvent(BundleContextImpl.java:861) >>>> at >>>> org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230) >>>> at >>>> org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148) >>>> at >>>> org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEventPrivileged(ServiceRegistry.java:819) >>>> at >>>> org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEvent(ServiceRegistry.java:771) >>>> at >>>> org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.register(ServiceRegistrationImpl.java:130) >>>> at >>>> org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.registerService(ServiceRegistry.java:214) >>>> at >>>> org.eclipse.osgi.framework.internal.core.BundleContextImpl.registerService(BundleContextImpl.java:433) >>>> at >>>> org.eclipse.osgi.framework.internal.core.BundleContextImpl.registerService(BundleContextImpl.java:451) >>>> at >>>> org.wso2.carbon.throttling.agent.internal.ThrottlingAgentServiceComponent.registerThrottlingAgent(ThrottlingAgentServiceComponent.java:123) >>>> at >>>> org.wso2.carbon.throttling.agent.internal.ThrottlingAgentServiceComponent.activate(ThrottlingAgentServiceComponent.java:100) >>>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) >>>> at >>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) >>>> at >>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) >>>> at java.lang.reflect.Method.invoke(Method.java:606) >>>> at >>>> org.eclipse.equinox.internal.ds.model.ServiceComponent.activate(ServiceComponent.java:260) >>>> at >>>> org.eclipse.equinox.internal.ds.model.ServiceComponentProp.activate(ServiceComponentProp.java:146) >>>> at >>>> org.eclipse.equinox.internal.ds.model.ServiceComponentProp.build(ServiceComponentProp.java:345) >>>> at >>>> org.eclipse.equinox.internal.ds.InstanceProcess.buildComponent(InstanceProcess.java:620) >>>> at >>>> org.eclipse.equinox.internal.ds.InstanceProcess.buildComponents(InstanceProcess.java:197) >>>> at >>>> org.eclipse.equinox.internal.ds.Resolver.getEligible(Resolver.java:343) >>>> at >>>> org.eclipse.equinox.internal.ds.SCRManager.serviceChanged(SCRManager.java:222) >>>> at >>>> org.eclipse.osgi.internal.serviceregistry.FilteredServiceListener.serviceChanged(FilteredServiceListener.java:107) >>>> at >>>> org.eclipse.osgi.framework.internal.core.BundleContextImpl.dispatchEvent(BundleContextImpl.java:861) >>>> at >>>> org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230) >>>> at >>>> org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148) >>>> at >>>> org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEventPrivileged(ServiceRegistry.java:819) >>>> at >>>> org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEvent(ServiceRegistry.java:771) >>>> at >>>> org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.register(ServiceRegistrationImpl.java:130) >>>> at >>>> org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.registerService(ServiceRegistry.java:214) >>>> at >>>> org.eclipse.osgi.framework.internal.core.BundleContextImpl.registerService(BundleContextImpl.java:433) >>>> at >>>> org.eclipse.osgi.framework.internal.core.BundleContextImpl.registerService(BundleContextImpl.java:451) >>>> at >>>> org.wso2.carbon.core.init.CarbonServerManager.initializeCarbon(CarbonServerManager.java:517) >>>> at >>>> org.wso2.carbon.core.init.CarbonServerManager.start(CarbonServerManager.java:219) >>>> at >>>> org.wso2.carbon.core.internal.CarbonCoreServiceComponent.activate(CarbonCoreServiceComponent.java:91) >>>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) >>>> at >>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) >>>> at >>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) >>>> at java.lang.reflect.Method.invoke(Method.java:606) >>>> at >>>> org.eclipse.equinox.internal.ds.model.ServiceComponent.activate(ServiceComponent.java:260) >>>> at >>>> org.eclipse.equinox.internal.ds.model.ServiceComponentProp.activate(ServiceComponentProp.java:146) >>>> at >>>> org.eclipse.equinox.internal.ds.model.ServiceComponentProp.build(ServiceComponentProp.java:345) >>>> at >>>> org.eclipse.equinox.internal.ds.InstanceProcess.buildComponent(InstanceProcess.java:620) >>>> at >>>> org.eclipse.equinox.internal.ds.InstanceProcess.buildComponents(InstanceProcess.java:197) >>>> at >>>> org.eclipse.equinox.internal.ds.Resolver.getEligible(Resolver.java:343) >>>> at >>>> org.eclipse.equinox.internal.ds.SCRManager.serviceChanged(SCRManager.java:222) >>>> at >>>> org.eclipse.osgi.internal.serviceregistry.FilteredServiceListener.serviceChanged(FilteredServiceListener.java:107) >>>> at >>>> org.eclipse.osgi.framework.internal.core.BundleContextImpl.dispatchEvent(BundleContextImpl.java:861) >>>> at >>>> org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230) >>>> at >>>> org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148) >>>> at >>>> org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEventPrivileged(ServiceRegistry.java:819) >>>> at >>>> org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEvent(ServiceRegistry.java:771) >>>> at >>>> org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.register(ServiceRegistrationImpl.java:130) >>>> at >>>> org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.registerService(ServiceRegistry.java:214) >>>> at >>>> org.eclipse.osgi.framework.internal.core.BundleContextImpl.registerService(BundleContextImpl.java:433) >>>> at >>>> org.eclipse.equinox.http.servlet.internal.Activator.registerHttpService(Activator.java:81) >>>> at >>>> org.eclipse.equinox.http.servlet.internal.Activator.addProxyServlet(Activator.java:60) >>>> at >>>> org.eclipse.equinox.http.servlet.internal.ProxyServlet.init(ProxyServlet.java:40) >>>> at >>>> org.wso2.carbon.tomcat.ext.servlet.DelegationServlet.init(DelegationServlet.java:38) >>>> at >>>> org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1284) >>>> at >>>> org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1197) >>>> at >>>> org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1087) >>>> at >>>> org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5262) >>>> at >>>> org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5550) >>>> at >>>> org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) >>>> at >>>> org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1575) >>>> at >>>> org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1565) >>>> at java.util.concurrent.FutureTask.run(FutureTask.java:262) >>>> at >>>> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) >>>> at >>>> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) >>>> at java.lang.Thread.run(Thread.java:745) >>>> Caused by: org.apache.catalina.LifecycleException: Failed to start >>>> component [WebappLoader[/example]] >>>> at >>>> org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154) >>>> at >>>> org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5389) >>>> at >>>> org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) >>>> ... 95 more >>>> Caused by: java.lang.NullPointerException >>>> at >>>> org.wso2.carbon.webapp.mgt.loader.CarbonWebappClassLoader.getResources(CarbonWebappClassLoader.java:260) >>>> at >>>> org.hotswap.agent.config.PluginConfiguration.<init>(PluginConfiguration.java:64) >>>> at >>>> org.hotswap.agent.config.PluginManager.initClassLoader(PluginManager.java:155) >>>> at >>>> org.hotswap.agent.config.PluginManager.initClassLoader(PluginManager.java:130) >>>> at >>>> org.hotswap.agent.config.PluginRegistry.initializePlugin(PluginRegistry.java:139) >>>> at >>>> org.hotswap.agent.util.PluginManagerInvoker.callInitializePlugin(PluginManagerInvoker.java:26) >>>> at >>>> org.hotswap.agent.plugin.tomcat.TomcatPlugin.init(TomcatPlugin.java:91) >>>> at >>>> org.apache.catalina.loader.WebappLoader.startInternal(WebappLoader.java:634) >>>> at >>>> org.wso2.carbon.webapp.mgt.loader.CarbonWebappLoader.startInternal(CarbonWebappLoader.java:55) >>>> at >>>> org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) >>>> ... 97 more >>>> >>>> TIA >>>> Clóvis >>>> >>>> >>>> >>>> >>>> >>>> 2016-01-22 5:32 GMT-02:00 Kishanthan Thangarajah <kishant...@wso2.com>: >>>> >>>>> Hi Clovis, >>>>> >>>>> On Wed, Jan 20, 2016 at 6:06 PM, Clovis Wichoski < >>>>> clo...@neoinix.com.br> wrote: >>>>> >>>>>> Hi, >>>>>> >>>>>> I'm researching for some ways to improve speed of development and >>>>>> redeploy on WSO2 Application Server, for example I have a scenario here >>>>>> where a simple change on a class, to test, get about 5 minutes. (as the >>>>>> test must pass by web interfaces in Jaggery, until reach the REST Api >>>>>> implemented in JAX-RS with Jersey and some JPA using EclipseLink. >>>>>> >>>>>> The Jaggery part is very easy, just rsync files, and all works fine. >>>>>> >>>>>> For the java part, in this research I found the HotSwapAgent - >>>>>> http://www.hotswapagent.org/ >>>>>> >>>>>> My first try was to follow HotSwapAgent quick start as is, and check >>>>>> if it works with WSO2 AS 5.2.1 out of the box, but dont worked, >>>>>> HotSwapAgent dont detect changes when I copy one updated .class file to >>>>>> WEB-INF/classes. >>>>>> >>>>>> Then my question is about, if anyone tried this before with WSO2, and >>>>>> if is a good way to invest time to implement a WSO2 plugin that work >>>>>> better >>>>>> with HotSwapAgent and what is the steps I must follow to implement this >>>>>> plugin or integrate this type of speed with redeploy with WSO2 AS? Maybe >>>>>> some problems with OSGi? >>>>>> >>>>> >>>>> This is a good thing to have with webap deployment. But we do have a >>>>> concept of hot update of webapps which is the default behaviour. If you >>>>> update the webapp, it will be redeployed by the Application Server where >>>>> it >>>>> keeps track of the changes using the scheduled task which runs on every 15 >>>>> seconds interval. Since this redeploys the entire webapp, all the classes >>>>> loaded will be removed and will be loaded again. Do find any issues with >>>>> this behaviour? >>>>> >>>>> Thanks, >>>>> Kishanthan. >>>>> >>>>> >>>>>> ps: Note that the idea, is just change one class, rsync the binary >>>>>> .class file over respective WEB-INF/classes and got the results. >>>>>> >>>>>> Best regards >>>>>> >>>>>> Clóvis Wichoski >>>>>> CEO, Neoinix >>>>>> Mobile: +554588233181 >>>>>> >>>>>> _______________________________________________ >>>>>> Dev mailing list >>>>>> Dev@wso2.org >>>>>> http://wso2.org/cgi-bin/mailman/listinfo/dev >>>>>> >>>>>> >>>>> >>>>> >>>>> -- >>>>> *Kishanthan Thangarajah* >>>>> Associate Technical Lead, >>>>> Platform Technologies Team, >>>>> WSO2, Inc. >>>>> lean.enterprise.middleware >>>>> >>>>> Mobile - +94773426635 >>>>> Blog - *http://kishanthan.wordpress.com >>>>> <http://kishanthan.wordpress.com>* >>>>> Twitter - *http://twitter.com/kishanthan >>>>> <http://twitter.com/kishanthan>* >>>>> >>>> >>>> >>>> _______________________________________________ >>>> Dev mailing list >>>> Dev@wso2.org >>>> http://wso2.org/cgi-bin/mailman/listinfo/dev >>>> >>>> >>> >>> >>> -- >>> Thusitha Dayaratne >>> Software Engineer >>> WSO2 Inc. - lean . enterprise . middleware | wso2.com >>> >>> Mobile +94712756809 >>> Blog alokayasoya.blogspot.com >>> About http://about.me/thusithathilina >>> >>> >> >> >> -- >> Thusitha Dayaratne >> Software Engineer >> WSO2 Inc. - lean . enterprise . middleware | wso2.com >> >> Mobile +94712756809 >> Blog alokayasoya.blogspot.com >> About http://about.me/thusithathilina >> >> >
_______________________________________________ Dev mailing list Dev@wso2.org http://wso2.org/cgi-bin/mailman/listinfo/dev