manager Tomcat: déploiement programmatique à distance?




tomcat manager (3)

Je voudrais déployer à Tomcat à distance, Quelles sont mes options? Je sais à propos de / manager / deploy. Est-ce possible sur JMX? Même un MBean ne venant pas avec Tomcat est correct.

Edit: Il semble que le déploiement à l'aide de / manager / deploy ne fonctionne pas - si je fais une requête POST avec un format multipart contenant un fichier, la servlet renvoie 405 Méthode non autorisée. De plus, le code 6.0.32 de la servlet ne semble pas implémenter le déploiement à distance - ai-je tort? Comment faire ça?

Merci.


Comme je l'ai trouvé via google, je souhaite partager ma solution de déploiement et de désinstallation pour tomcat 7

-) comme ondra-zizka a souligné qu'il est aussi facile que de faire une demande de Put à l'adresse URL correcte que l'URL a changé sous tomcat7 en / manager / text / deploy? path = & update =

<context-do-deploy-to> doit commencer par une barre oblique, par exemple: / deployMe

-) vous devrez peut-être définir des autorisations pour accéder à l'application de gestion Ajoutez ceci à TOMCAT_HOME / conf / tomcat-users.xml

note: le doc tomcat vous avertit de ne pas donner au même utilisateur l'accès à plus d'un rôle

<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<user username="tomcat" password="s3cret" roles="manager-gui,manager-script,manager-jmx"/>

-) un exemple de code pour déployer une application web sur un apache tomcat

package deployment;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

public class DeployManager{

    static CredentialsProvider credsProvider = new BasicCredentialsProvider();;

    public static void main(String args[]) throws ClientProtocolException, IOException{
        /*
         * warning only ever AuthScope.ANY while debugging
         * with these settings the tomcat username and pw are added to EVERY request
         */
        credsProvider.setCredentials(AuthScope.ANY,new UsernamePasswordCredentials("tomcat", "s3cret"));

//      deploy();
//      undeploy();
    }



    private static void deploy() throws ClientProtocolException, IOException {
        String url = "http://localhost:8080/manager/text/deploy?path=/deployMe&update=true";
        File file = new File ("deployMe.war") ;

        HttpPut req = new HttpPut(url) ;
        MultipartEntityBuilder meb = MultipartEntityBuilder.create();
        meb.addTextBody("fileDescription", "war file to deploy");
        //"application/octect-stream"
        meb.addBinaryBody("attachment", file, ContentType.APPLICATION_OCTET_STREAM, file.getName());

        req.setEntity(meb.build()) ;
        String response = executeRequest (req, credsProvider);

        System.out.println("Response : "+response);
    }

    public static void undeploy() throws ClientProtocolException, IOException{
        String url = "http://localhost:8080/manager/text/undeploy?path=/deployMe";
        HttpGet req = new HttpGet(url) ;
        String response = executeRequest (req, credsProvider);
        System.out.println("Response : "+response);
    } 

    private static String executeRequest(HttpRequestBase requestBase, CredentialsProvider credsProvider) throws ClientProtocolException, IOException {
        CloseableHttpClient client = HttpClients.custom().setDefaultCredentialsProvider(credsProvider).build();
        InputStream responseStream = null;
        String res = null;
        HttpResponse response = client.execute(requestBase) ;
        HttpEntity responseEntity = response.getEntity() ;
        responseStream = responseEntity.getContent() ;

        BufferedReader br = new BufferedReader (new InputStreamReader (responseStream)) ;
        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = br.readLine()) != null) {
            sb.append(line);
            sb.append(System.getProperty("line.separator"));
        }
        br.close() ;
        res = sb.toString();

        return res;
    }
}

-) dépendances maven

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.3</version>
</dependency>

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.3</version>
</dependency>

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpmime</artifactId>
    <version>4.3</version>
</dependency>

Je suivais de vieux docs. Le téléchargement est effectué par une requête PUT dans /manager/deploy?path=<context-do-deploy-to>&update=<true|false>

Il existe également une tâche Ant qui utilise les méthodes PUT en interne.

Les MBeans JMX de Tomcat n'autorisent pas le déploiement à distance.


Ceci est un résultat google top pour une raison quelconque. le plugin maven tomcat6 est excellent, en supposant que vous avez installé le gestionnaire.







deployment