Tomcat: удаленное программное развертывание? - PullRequest
5 голосов
/ 31 марта 2011

Я бы хотел развернуть на Tomcat программно удаленно, какие у меня есть варианты? Я знаю про / manager / deploy. Возможно ли это через JMX? Даже MBean, не пришедший с Tomcat, это нормально.

Редактировать: Кажется, что развертывание с использованием / manager / deploy не работает - если я выполняю запрос POST с многочастным форматом, содержащим файл, сервлет возвращает 405 Метод не разрешен. Кроме того, код сервлета 6.0.32, по-видимому, не реализует удаленное развертывание - я не прав? Как это сделать?

Спасибо.

Ответы [ 3 ]

4 голосов
/ 13 ноября 2013

Поскольку я также нашел это через Google, я хочу поделиться своим решением по развертыванию и отключению для tomcat 7

-) как ondra-zizka указал, что это так же просто, как выполнить запрос Put на правильный URL хотя URL-адрес в tomcat7 изменился на / manager / text / deploy? path = & update =

должен начинаться с косой черты, например: / deployMe

-) вам может потребоваться установить разрешения для доступа к приложению менеджера добавьте это в TOMCAT_HOME / conf / tomcat-users.xml

примечание: документ tomcat предупреждает вас, чтобы вы не давали одному и тому же пользователю доступ к более чем одной роли

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

-) пример кода для развертывания веб-приложения на 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;
    }
}

-) 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>
3 голосов
/ 04 апреля 2011

Я следовал старым документам. Загрузка осуществляется по запросу PUT на /manager/deploy?path=<context-do-deploy-to>&update=<true|false>

Также есть задача Ant, которая использует методы PUT для внутреннего использования.

Средство Tomcat JMX MBeans не допускает удаленного развертывания.

1 голос
/ 04 сентября 2012

По какой-то причине это лучший результат Google. плагин maven tomcat6 превосходен, если у вас установлен менеджер.

...