1 2 3 4 Previous Next 48 Replies Latest reply: Jun 26, 2008 1:33 AM by Richard Opalka Go to original post RSS
      • 15. Re: HOWTO deploy webapp dynamically
        Adrian Brock Master

         

        "thomas.diesler@jboss.com" wrote:
        I read http://labs.jboss.com/file-access/default/members/jbossmc/freezone/docs/2.0.x/userGuide/pt04.html
        Is there anywhere else this is documented?

        How do I set the deployments class path?
        I cant do

         // There is one top level deployment
         ContextInfo context = factory.addContext(unit, "");
         context.addClassPathEntry(entry);
        



        I don't know if the non-VFS stuff is documentated?
        There's certainly lots of examples in the testsuite.
        The user guide just tells people how to do normal things. ;-)

        You certainly can't add a classpath entry if you don't a virtual file system
        to back your deployment. It doesn't mean anything.


        In my case, the deployment should use the context class loader of the calling component.


        You can override how the classloader gets "constructed" with an attachment
        (the ClassLoaderFactory)
        http://viewvc.jboss.org/cgi-bin/viewvc.cgi/jbossas/projects/microcontainer/trunk/deployers-spi/src/main/org/jboss/deployers/spi/deployer/helpers/AbstractClassLoaderDeployer.java?revision=69940&view=markup
        which tells the classloader deployer to not use it's own mechanism
        but to use the attached factory.

        Although I don't like this mechanism and I'm currently reworking it
        with proper classloader metadata including dependencies.

        e.g. So for now, you could write a ClassLoaderFactory
        that just returns a preset classloader.

        It should be obvious why this is bad, since you're going to leak that classloader
        unless you have tight control on when the thing gets undeployed
        (either the original deployment or the deployment you are constructing).

        Using the ClassLoaderFactory side steps the dependency checks/rules.

        • 16. Re: HOWTO deploy webapp dynamically
          Adrian Brock Master

           

          "adrian@jboss.org" wrote:

          I don't know if the non-VFS stuff is documentated?
          There's certainly lots of examples in the testsuite.
          The user guide just tells people how to do normal things. ;-)


          Also, I don't know if it will work in JBossAS anyway at the moment.

          There's a todo item to test a programmatic deployment (like what you are
          trying perform), e.g. deploy a datasource from just metadata
          and then fix all the deployers that currently assume there is a virtual file

          I've already fixed a lot them, but people keep putting the same mistakes back in the code :-(

          • 17. Re: HOWTO deploy webapp dynamically
            Thomas Diesler Master

            I am getting further. The endpoint deploys

            14:32:59,417 INFO [TomcatDeployment] deploy, ctxPath=/jaxws-endpoint-servlet, vfsUrl=
            14:33:00,357 INFO [DefaultEndpointRegistry] register: jboss.ws:context=jaxws-endpoint,endpoint=EndpointBean
            


            However, there seems to be a problem with the JACC service not finding jboss:service=defaultClassLoader

            14:33:00,690 ERROR [AbstractKernelController] Error installing to Instantiated: name=jboss.jacc:id=endpoint-deployment,service=jacc state=Described mode=Manual requiredState=Configured
            org.jboss.deployment.DeploymentException: Unable to createMBean for jboss.jacc:service=jacc,id=endpoint-deployment
             at org.jboss.deployment.DeploymentException.rethrowAsDeploymentException(DeploymentException.java:52)
            
            ...
            
            Caused by: javax.management.InstanceNotFoundException: jboss:service=defaultClassLoader is not registered.
             at org.jboss.mx.server.registry.BasicMBeanRegistry.get(BasicMBeanRegistry.java:529)
             at org.jboss.mx.server.MBeanServerImpl.getClassLoader(MBeanServerImpl.java:1094)
             at org.jboss.system.ServiceCreator.installPlainMBean(ServiceCreator.java:191)
             at org.jboss.system.ServiceCreator.install(ServiceCreator.java:115)
            


            • 18. Re: HOWTO deploy webapp dynamically
              Anil Saldhana Master

              Thomas, can you enable some trace on "org.jboss.system" and paste it here?

              The Security Deployer just deals with the MetaData and creates a top level service bean. It does not do any Classloader circus.

              There is something that is happening with your web service deployments.

              • 19. Re: HOWTO deploy webapp dynamically
                Adrian Brock Master

                The relevant code is in the ServiceDeployer:

                 public void deploy(DeploymentUnit unit, ServiceMetaData deployment) throws DeploymentException
                 {
                 ObjectName name = deployment.getObjectName();
                 try
                 {
                 ObjectName loaderName = deployment.getClassLoaderName();
                 if (loaderName == null)
                 {
                 ClassLoader cl = unit.getClassLoader();
                 if (cl != null && cl instanceof RepositoryClassLoader)
                 loaderName = ((RepositoryClassLoader) cl).getObjectName();
                 // TODO add to RealClassLoader
                 else if (cl != null && cl instanceof RealClassLoader)
                 loaderName = ((RealClassLoader) cl).getObjectName();
                 else
                 loaderName = defaultClassLoader;
                 }
                


                I'd guess the actual classloader Thomas is passing in, is not a RealClassLoader
                (but it probably has one as a parent) so this code should loop through
                ClassLoader::getParent() until it finds one that is, before trying to use
                "defaultClassLoader" which doesn't look like it is even configured.

                • 20. Re: HOWTO deploy webapp dynamically
                  Scott Stark Master

                  What is the codebase for the org.jboss.test.ws.jaxws.endpoint.EndpointTestCase in the JBAS-5257 issue? The last time I looked at the ws tests the codebase was https://svn.jboss.org/repos/jbossws/stack/native/branches/jbossws-native-2.0.2. This no longer exists?

                  • 22. Re: HOWTO deploy webapp dynamically
                    Thomas Diesler Master

                     


                    You create Deployment on the fly


                    Yes, please show me the code that creates the deployment on the fly - attaches the WMD and deployes it afterwards.

                    • 23. Re: HOWTO deploy webapp dynamically
                      Ales Justin Master

                       

                      "thomas.diesler@jboss.com" wrote:

                      You create Deployment on the fly


                      Yes, please show me the code that creates the deployment on the fly - attaches the WMD and deployes it afterwards.

                      Looking at the previous posts in this thread, I see a dozen such examples.
                      Why are they not good?
                      Or where exactly are you stuck now?

                      • 24. Re: HOWTO deploy webapp dynamically
                        Richard Opalka Master

                         

                        "alesj" wrote:
                        Or where exactly are you stuck now?


                        Download svn module https://svn.jboss.org/repos/jbossws/stack/native/branches/jbossws-native-3.0.2
                        remove JBAS-5257 test exclusion from modules/testsuite/test-excludes-jboss501.txt
                        start JBossAS trunk server
                        copy jbossws-native-3.0.2/profiles.xml.example to jbossws-native-3.0.2/profiles.xml and update accordingly
                        issue command mvn -Ptestsuite,hudson,jboss501 -Djava.jdk15.home=$JAVA_HOME -Dtest=**/jaxws/endpoint/*TestCase test from directory jbossws-native-3.0.2


                        • 25. Re: HOWTO deploy webapp dynamically
                          Ales Justin Master

                          I meant programatically. :-)

                          What is the piece of code that tries to do something with deployments but fails?
                          What exactly is trying to do?
                          What is supposed to do?
                          Where do you see the possible problem?
                          ...

                          You need to give me exact details.
                          Or exact questions.

                          Sorry, but I'm not gonna dig into WS code.

                          • 26. Re: HOWTO deploy webapp dynamically
                            Richard Opalka Master

                            Give me few minutes, I'll review the test and the failure.

                            • 27. Re: HOWTO deploy webapp dynamically
                              Adrian Brock Master

                              Ales, don't worry about it.
                              I gave up trying to help these guys a while ago.

                              If somebody doesn't have the analysis skills to make a question answerable
                              then I don't have the time to try to guess/work out what the question actually is.
                              http://wiki.jboss.org/wiki/HelpExpertSystem

                              Please help me, is not such a question.

                              • 28. Re: HOWTO deploy webapp dynamically
                                Richard Opalka Master

                                This is our usecase:

                                We have the jaxws-endpoint-servlet.war web archive with the following content:

                                jar -tvf jaxws-endpoint-servlet.war
                                META-INF/
                                META-INF/MANIFEST.MF
                                WEB-INF/
                                WEB-INF/classes/
                                WEB-INF/classes/org/
                                WEB-INF/classes/org/jboss/
                                WEB-INF/classes/org/jboss/test/
                                WEB-INF/classes/org/jboss/test/ws/
                                WEB-INF/classes/org/jboss/test/ws/jaxws/
                                WEB-INF/classes/org/jboss/test/ws/jaxws/endpoint/
                                WEB-INF/classes/org/jboss/test/ws/jaxws/endpoint/EndpointBean.class
                                WEB-INF/classes/org/jboss/test/ws/jaxws/endpoint/EndpointInterface.class
                                WEB-INF/classes/org/jboss/test/ws/jaxws/endpoint/EndpointServlet.class
                                WEB-INF/wsdl/
                                WEB-INF/wsdl/TestService.wsdl
                                WEB-INF/web.xml

                                The most important class here is EndpointServlet, which contains the following lines of code:

                                public void init(ServletConfig config) throws ServletException
                                {
                                 super.init(config);
                                
                                 // Create the endpoint
                                 EndpointBean epImpl = new EndpointBean();
                                 javax.xml.ws.Endpoint endpoint = Endpoint.create(SOAPBinding.SOAP11HTTP_BINDING, epImpl);
                                
                                 // Create and start the HTTP server
                                 SPIProvider spiProvider = SPIProviderResolver.getInstance().getProvider();
                                 HttpServer httpServer = spiProvider.getSPI(HttpServerFactory.class).getHttpServer();
                                 httpServer.start();
                                
                                 // Create the context and publish the endpoint
                                 HttpContext context = httpServer.createContext("/jaxws-endpoint");
                                 endpoint.publish(context);
                                }
                                


                                The purpose of this code is to create new web application deployment dynamically using this api only. The endpoint published this way must reside on address http://localhost:8080/jaxws-endpoint where HttpContext and Endpoint are our abstractions.

                                Our current approach:

                                To solve this use case we're creating new web deployment dynamically this way at the moment:

                                JBossWebMetaData jbwmd = dep.getAttachment(JBossWebMetaData.class);
                                
                                AbstractDeployment deployment = createSimpleDeployment(dep.getSimpleName());
                                MutableAttachments ma = (MutableAttachments)deployment.getPredeterminedManagedObjects();
                                ma.addAttachment(HttpSpec.PROPERTY_GENERATED_WEBAPP, Boolean.TRUE);
                                ma.addAttachment(ClassLoaderFactory.class, new ContextClassLoaderFactory());
                                ma.addAttachment(JBossWebMetaData.class, jbwmd);
                                mainDeployer.deploy(deployment);
                                
                                ...
                                
                                private static class ContextClassLoaderFactory implements ClassLoaderFactory
                                {
                                 public ClassLoader createClassLoader(DeploymentUnit unit) throws Exception
                                 {
                                 return Thread.currentThread().getContextClassLoader();
                                 }
                                
                                 public void removeClassLoader(DeploymentUnit unit) throws Exception
                                 {
                                 }
                                }
                                


                                Problem we're dealing with:

                                We're not able to dynamically deploy this archive to http://localhost:8080/jaxws-endpoint context. The dynamically created application is deployed to http://localhost:8080/jaxws-endpoint-servlet context.

                                I guess this is because of our custom class loader we have. Is there a possibility to enforce deployment context?

                                • 29. Re: HOWTO deploy webapp dynamically
                                  Scott Stark Master

                                  You need to make a copy of the JBossWebMetaData and use setContextRoot("jaxws-endpoint").

                                  The getPredeterminedManagedObjects attachments bucket is the wrong one to be using. This is for data that is set from previous admin edits through the profileservice. The client spi does not look correct for deployer implementations.

                                  We also need this usecase in the jbossas testsuite as an illustration of proper dynamic deployment creation.