2012-08-06 3 views
2

J'ai un cas d'utilisation qui me demande de contrôler le déploiement (entre autres choses) d'une application sur un serveur Glassfish à partir d'une application.Déployer l'application sur Glassfish3 + par programmation

Est-il possible d'utiliser une application sur un serveur glassfish pour déployer et contrôler d'autres applications sur le même serveur glassfish?

Si quelqu'un a des conseils, des points de départ, des démonstrations, des avertissements, etc. seraient très appréciés.

Merci

Répondre

1

Alors que GlassFish peut être lancé autonome, it can also be embedded into your own application (ne pense pas que Java EE, mais simple (ou pas si simple) application Java).

Vous pouvez définir un ensemble d'API de gestion, démarrer et configurer GlassFish, et manage that glassfish instance via ces API. L'exposition de vos API aux applications fonctionnant sous glassfish devrait également être réalisable.

+0

T Richard Richard. – tarka

0

Je pense que la manière la plus simple de déployer automatiquement des applications dans glassfish est d'utiliser le dossier autodeploy de glassfish (situé dans glassfish \ domains \ autodeploy). Chaque guerre ou pot que vous copiez dans ce dossier sera automatiquement déployé sur le serveur (si cela fonctionne correctement).

Tout ce que vous devez faire est d'utiliser un contrôle de planification comme Quartz et quelques méthodes pour copier des fichiers dans le serveur (par exemple, dans votre répertoire de travail vers le dossier autodeploy).

Une autre option consiste à exécuter des scripts shell dans votre application avec quelque chose comme ce

$ ./asadmin Déployez --name \ --contextroot /absolute/path/to/.war

0

Je crois que l'administration de base du serveur Glassfish peut être gérée à l'aide des API JSR88. Bien que ces API soient marquées comme facultatives dans Java EE 7, elles fonctionnent. Je pense que vous pouvez utiliser ces API dans les applications Java SE et EE.

Il existe des API wrapper disponibles here que vous pouvez utiliser pour manipuler tous les principaux conteneurs Java EE. Ces API utilisent également JSR88.

Il existe un exemple de code disponible here pour déployer/annuler le déploiement d'une application Java EE. Cet exemple fonctionne avec une ancienne version de Glassfish (Glassfish2x probablement).

J'ai modifié le code exemple un peu pour le faire fonctionner avec Glassfish4x que je posterai ici:

package simplewardeployer; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.util.Properties; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.enterprise.deploy.shared.ModuleType; 
import javax.enterprise.deploy.shared.factories.DeploymentFactoryManager; 
import javax.enterprise.deploy.spi.DeploymentManager; 
import javax.enterprise.deploy.spi.TargetModuleID; 
import javax.enterprise.deploy.spi.exceptions.DeploymentManagerCreationException; 
import javax.enterprise.deploy.spi.exceptions.TargetException; 
import javax.enterprise.deploy.spi.factories.DeploymentFactory; 
import javax.enterprise.deploy.spi.status.ProgressEvent; 
import javax.enterprise.deploy.spi.status.ProgressListener; 
import javax.enterprise.deploy.spi.status.ProgressObject; 


public class Main { 

class DeploymentListener implements ProgressListener { 

    Main driver; 

    String warContext; 

    DeploymentListener(Main driver, String warContext) { 

     this.driver = driver; 

     this.warContext = warContext; 

    } 

    public void handleProgressEvent(ProgressEvent event) { 

     System.out.println(event.getDeploymentStatus().getMessage()); 

     if (event.getDeploymentStatus().isCompleted()) { 

      try { 

       TargetModuleID[] ids = getDeploymentManager().getNonRunningModules(ModuleType.WAR, getDeploymentManager().getTargets()); 

       TargetModuleID[] myIDs = new TargetModuleID[1]; 

       for (TargetModuleID id : ids) { 

        if (warContext.equals(id.getModuleID())) { 

         myIDs[0] = id; 

         ProgressObject startProgress = driver.getDeploymentManager().start(myIDs); 

         startProgress.addProgressListener(new ProgressListener() { 

          public void handleProgressEvent(ProgressEvent event) { 

           System.out.println(event.getDeploymentStatus().getMessage()); 

           if (event.getDeploymentStatus().isCompleted()) { 
            driver.setAppStarted(true); 

           } 

          } 

         }); 

        } 

       } 

      } catch (IllegalStateException ex) { 

       ex.printStackTrace(); 

      } catch (TargetException ex) { 

       ex.printStackTrace(); 

      } 

     } 

    } 

} 

DeploymentManager deploymentManager; 

boolean appStarted; 

boolean appUndeployed; 

String warContext; 

String warFilename; 

String wsdlUrl; 

synchronized void setAppStarted(boolean appStarted) { 

    this.appStarted = appStarted; 

    notifyAll(); 

} 

synchronized void setAppUndeployed(boolean appUndeployed) { 

    this.appUndeployed = appUndeployed; 

    notifyAll(); 

} 

private String getParam(String param) { 

    return (null == deploymentProperties) ? null : deploymentProperties.getProperty(param); 

} 

public DeploymentManager getDeploymentManager() { 

    if (null == deploymentManager) { 

     DeploymentFactoryManager dfm = DeploymentFactoryManager.getInstance(); 

     try { 

      Class dfClass = Class.forName(getParam("jsr88.df.classname")); 

      DeploymentFactory dfInstance; 

      dfInstance = (DeploymentFactory) dfClass.newInstance(); 

      dfm.registerDeploymentFactory(dfInstance); 

     } catch (ClassNotFoundException ex) { 

      ex.printStackTrace(); 

     } catch (IllegalAccessException ex) { 

      ex.printStackTrace(); 

     } catch (InstantiationException ex) { 

      ex.printStackTrace(); 

     } 

     try { 

      deploymentManager 
        = dfm.getDeploymentManager(
          getParam("jsr88.dm.id"), getParam("jsr88.dm.user"), getParam("jsr88.dm.passwd")); 

     } catch (DeploymentManagerCreationException ex) { 

      ex.printStackTrace(); 

     } 

    } 

    return deploymentManager; 

} 

TargetModuleID getDeployedModuleId(String warContext) {  
    TargetModuleID foundId= null; 
    TargetModuleID[] ids = null; 
    try { 
     ids = getDeploymentManager().getAvailableModules(ModuleType.WAR, getDeploymentManager().getTargets()); 
     for (TargetModuleID id : ids) { 
      if (warContext.equals(id.getModuleID())) { 
       foundId = id; 
       break; 
      } 
     } 
    } catch (TargetException | IllegalStateException ex) { 
     Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 
    } 

    return foundId; 
} 

void runApp(String warFilename, String warContext) { 

    setAppStarted(false); 
    ProgressObject deplProgress; 
    TargetModuleID foundId = getDeployedModuleId(warContext); 
    if (foundId != null) { 
     TargetModuleID[] myIDs = new TargetModuleID[1]; 
     myIDs[0] = foundId; 
     deplProgress = getDeploymentManager().redeploy(myIDs, new File(warFilename), null); 
    } else { 
     deplProgress = getDeploymentManager().distribute(getDeploymentManager().getTargets(), 
       new File(warFilename), null); 
    } 
    if (deplProgress != null) { 
     deplProgress.addProgressListener(new DeploymentListener(this, warContext)); 
     waitForAppStart(); 
    } 

} 

void undeployApp(String warContext) { 

    setAppUndeployed(false); 

    try { 

     TargetModuleID[] ids = getDeploymentManager().getRunningModules(ModuleType.WAR, getDeploymentManager().getTargets()); 

     TargetModuleID[] myIDs = new TargetModuleID[1]; 

     for (TargetModuleID id : ids) { 

      if (warContext.equals(id.getModuleID())) { 

       myIDs[0] = id; 

       ProgressObject startProgress = getDeploymentManager().undeploy(myIDs); 

       startProgress.addProgressListener(new ProgressListener() { 

        public void handleProgressEvent(ProgressEvent event) { 

         System.out.println(event.getDeploymentStatus().getMessage()); 

         if (event.getDeploymentStatus().isCompleted()) { 

          setAppUndeployed(true); 

         } 

        } 

       }); 

      } 

     } 

    } catch (IllegalStateException ex) { 

     ex.printStackTrace(); 

    } catch (TargetException ex) { 

     ex.printStackTrace(); 

    } 

    waitForAppUndeployment(); 

} 

void releaseDeploymentManager() { 

    if (null != deploymentManager) { 

     deploymentManager.release(); 

    } 

} 

synchronized void waitForAppStart() { 

    while (!appStarted) { 

     try { 

      wait(); 

     } catch (InterruptedException e) { 
     } 

    } 

} 

synchronized void waitForAppUndeployment() { 

    while (!appUndeployed) { 

     try { 

      wait(); 

     } catch (InterruptedException e) { 
     } 

    } 

} 

public Main() { 

} 

public Main(String filename) { 

    setProperties(filename); 

} 

private final static String SyntaxHelp = "syntax:\\n\\tdeploy \\n\\tundeploy "; 

private final static String PropertiesFilename = "wardeployment.properties"; 

private Properties deploymentProperties; 

private void setProperties(String filename) { 

    FileInputStream fis = null; 

    try { 

     fis = new FileInputStream(filename); 

     deploymentProperties = new Properties(); 

     deploymentProperties.load(fis); 

     fis.close(); 

    } catch (FileNotFoundException ex) { 

     ex.printStackTrace(); 

    } catch (IOException ex) { 

     ex.printStackTrace(); 

    } 

} 

private static void printHelpAndExit() { 

    System.out.println(SyntaxHelp); 

    System.exit(1); 

} 

public static void main(String[] args) { 

    if (args.length < 1) { 

     printHelpAndExit(); 

    } 

    Main worker = new Main(PropertiesFilename); 

    if ("deploy".equals(args[0])) { 

     System.out.println("Deploying app..."); 
     String warContext = new File(args[1]).getName(); 
     warContext = warContext.substring(0, warContext.length() - 4); 

     worker.runApp(args[1], warContext); 

     worker.releaseDeploymentManager(); 

    } else if ("undeploy".equals(args[0])) { 

     System.out.println("Undeploying app..."); 
     String warContext = new File(args[1]).getName(); 
     warContext = warContext.substring(0, warContext.lastIndexOf(".")); 

     worker.undeployApp(warContext); 

     worker.releaseDeploymentManager(); 

     } 

    } 

} 

Le fichier wardeployment.properties modifié est donnée ci-dessous:

jsr88.dm.id=deployer:Sun:AppServer::10.9.80.117:4848 
jsr88.dm.user=admin 
jsr88.dm.passwd=adminadmin 
jsr88.df.classname=org.glassfish.deployapi.SunDeploymentFactory 

Vous devez ajoutez les fichiers javaee-api-7.0.jar et development-client.jar dans votre classpath. Vous pouvez trouver development-client.jar dans votre répertoire d'installation glassfish dans le répertoire "glassfish-4.0 \ glassfish \ modules \". J'ai testé l'application à partir de Netbeans 7.4 et cela a fonctionné dans l'IDE mais en dehors de l'IDE elle a généré un message d'erreur qui n'était pas facile à corriger car il n'y avait aucune indication là où le problème est.Le message d'erreur était

javax.enterprise.deploy.spi.exceptions.DeploymentManagerCreationException: Impossible d'obtenir DeploymentManager

La raison fondamentale est que certaines bibliothèques requises ont été portées disparues. Après avoir parcouru toute la liste des bibliothèques glassfish, j'ai réalisé que les bibliothèques suivantes étaient nécessaires si nous voulions exécuter l'application de façon autonome. Trouvez la liste complète ci-dessous de:

  1. admin-cli.jar
  2. admin-util.jar
  3. cglib.jar
  4. commune-util.jar
  5. config-types.jar
  6. core.jar
  7. déploiement-client.jar
  8. déploiement-common.jar
  9. glassfish-api.jar
  10. hk2-api.jar
  11. hk2-config.jar
  12. hk2-locator.jar
  13. hk2-utils.jar
  14. -api.jar interne
  15. javax .enterprise.deploy-api.jar
  16. javax.inject.jar
  17. osgi-ressources locator.jar
Questions connexes