Вопрос по tomcat, maven – Получить Maven для параллельного развертывания в Tomcat

2

Я не могу найти стандартизированный способ заставить Maven выполнять развертывание Tomcat 7, использующее параллельное развертывание Tomcat 7:

http://tomcat.apache.org/tomcat-7.0-doc/config/context.html#Parallel_deployment

Есть ли надежный способ сделать это? Может быть, всегда держать две версии приложения в прямом эфире?

У меня нет опыта работы с MTOMCAT, но вы можете определить имя файла WAR, который вы будете развертывать? Если это так, просто убедитесь, что он называетсяmywebapp##version.war. Christopher Schultz

Ваш Ответ

6   ответов
1

поэтому я написал сценарий, чтобы сделать именно это с Maven, смотритеhttp://tynamo.org/Zero+downtime+deployment+to+Tomcat+7+with+Maven, Кроме того, Tomcat 7.0.31 будет иметь undeployOldVersions (см.https://issues.apache.org/bugzilla/show_bug.cgi?id=52777).

0

такой как MeerCat:http://www.meercatmanager.com

Он не использует Maven, но можно развернуть одно и то же приложение на нескольких экземплярах сервера Tomcat и легко управлять их развертыванием. Проверьте это!

3

Как заставить Maven создать .war с соответствующим именем для использования с функцией параллельного развертывания Tomcat 7?.

Ваш вопрос действительно суть этого. Ниже то, что я сделал.

Во-первых, попросите Maven сгенерировать правильно названный файл .war. Я использовал плагин метки времени Maven.

...
<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>${war.version}</version>
    <configuration>
        <warName>${war.name}</warName>
    </configuration>
</plugin>
...

Использование метки времени в качестве версии гарантирует, что файл .war назван правильно в соответствии с правилами, которые Tomcat 7 использует для определения последней версии.

Я не смог найти никакой информации о том, как заставить плагин Tomcat 7 Maven работать с этим. Спросил на Tomcat IRC & amp; на Maven IRC. Может быть, это возможно, но я не могу заставить его работать.

То, что я сделал, было это:

...
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>copy</id>
            <phase>install</phase>
            <goals>
                <goal>copy</goal>
            </goals>
            <configuration>
                <artifactItems>
                    <artifactItem>
                        <groupId>${group.id}</groupId>
                        <artifactId>${artifact.id}</artifactId>
                        <version>${version}</version>
                        <type>war</type>
                        <overWrite>true</overWrite>
                        <outputDirectory>${autodeploy.directory}</outputDirectory>
                        <destFileName>${war.name}.war</destFileName>
                    </artifactItem>
                </artifactItems>
            </configuration>
        </execution>
    </executions>
</plugin>
...

Это просто копирует файл из одного места в другое. В этом случае файл .war, созданный вами в каталоге автоматического развертывания Tomcat.

Если вы используете Jenkins для развертывания, вы можете настроить копию как действие после сборки. (Используйте target / appname * .war для имени файла EAR / WAR.)

Просто для полноты, здесь перечислены различные свойства:

<properties>
    <artifact.id>myApp</artifact.id>
    <version>1.0</version>      
    <group.id>com.example.${artifact.id}</group.id>
    <autodeploy.directory xml:space="preserve">C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps</autodeploy.directory>
    <war.name>${artifact.id}##${maven.build.timestamp}</war.name>    
...

(Обратите вниманиеxml:space="preserve" осчастливить Windows, когда в каталоге есть пробелы.)

По умолчанию Tomcat 7 автоматически развертывается, но не удаляет старые версии. Может быть, это то, что вам нужно, потому что у вас будут доступны все старые версии на тот случай, если вы что-то напортачили, и вам нужно будет удалить последнюю версию.

Но если вы хотите написать пером, так сказать, найдите conf / server.xml в вашем установочном каталоге Tomcat 7. Делать<Host> выглядеть примерно так:

<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true" undeployOldVersions="true">

undeployOldVersions="true" это магия

Вот и все. Теперь, когда вы делаетеmaven clean installон создаст красиво названную войну и бросит ее в директорию автоматического развертывания Tomcat, и она должна просто работать.

-Colin

Спасибо, что поделились этим драгоценным камнем! Еще одно дополнение, чтобы настроить формат отметки времени, можно следовать инструкциям, доступным здесь:maven.apache.org/guides/introduction/…
0

Ниже вы найдете 3 профиля, которые позволяют вам:

Locally deploy to a Tomcat automatically installed by Cargo Locally deploy to a Tomcat already installed and started Remote deploy.

Обратите внимание на «контекст»; свойство, позволяющее переименовать артефакт во время развертывания, используя ## для параллельного развертывания.

<profiles>
    <profile>
        <!-- Local deploy - tomcat 7 automatically installed by Cargo -->
        <id>local_deploy_auto_install</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.codehaus.cargo</groupId>
                    <artifactId>cargo-maven2-plugin</artifactId>
                    <configuration>
                        <container>
                            <containerId>tomcat7x</containerId>
                            <zipUrlInstaller>
                                <url>http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.35/bin/apache-tomcat-7.0.35.zip</url>
                            </zipUrlInstaller>
                        </container>
                        <deployables>
                            <deployable>
                                <properties>
                                    <context>${project.artifactId}##${project.version}</context>
                                </properties>
                            </deployable>
                        </deployables>
                        <confi,guration>
                            <properties>
                                <cargo.servlet.port>9080</cargo.servlet.port>
                            </properties>
                        </configuration>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>

    <profile>
        <!-- Local deploy - tomcat 7 must have been installed and started -->
        <id>local_deploy</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.codehaus.cargo</groupId>
                    <artifactId>cargo-maven2-plugin</artifactId>
                    <configuration>
                        <!-- When Cargo starts the container, the following tag instructs it to wait for you to kill the session with Crtl-C -->
                        <!-- <wait>true</wait> -->
                        <!-- The following tag details the container you want to deploy to. -->
                        <container>
                            <!-- Specifying "tomcat7x" is very important! This one tripped me up for quite a while. The issue is that instead 
                                of being an identifier for you, "tomcat7x" is an identifier for Cargo that you want to deploy your webapp in Tomcat 7.x. 
                                I had initially thought otherwise and hence just dropped the 'x', making it "tomcat7", but that never worked. -->
                            <containerId>tomcat7x</containerId>
                            <!-- Type == Installed means that you want to deploy to a container that's installed on your computer -->
                            <type>installed</type>
                        </container>
                        <configuration>
                            <!-- This is another one that confused me for long. Its not enough to specify 'installed' in the container tag. You 
                                have to now specify another configuration with type == existing and the home path -->
                            <type>existing</type>
                            <home>${basedir}/../../tomcat7.0.37</home>
                        </configuration>
                        <!-- Here you specify 'deployables' -->
                        <deployables>
                            <!-- This deployable specifies the webapp you want to deploy -->
                            <deployable>
                                <properties>
                                    <context>${project.artifactId}##${project.version}</context>
                                </properties>
                            </deployable>
                        </deployables>
                    </configuration>
                    <!-- Executions specify the targets that you want to run during build -->
                    <executions>
                        <!-- Maven has the concept of a 'phase' which can be thought of a collection of goals. Hence here we are specifying 
                            that during the 'install' phase first deploy the webapp to the container specific folder and then start the container. Both 
                            'deployer-deploy' and 'start' are cargo specific goals. -->
                        <execution>
                            <id>verify-deploy</id>
                            <phase>install</phase>
                            <goals>
                                <goal>deploy</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>

    <profile>
        <!-- Remote dans un tomcat7 pré-installé, pré-démarré -->
        <id>remote_deploy</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.codehaus.cargo</groupId>
                    <artifactId>cargo-maven2-plugin</artifactId>
                    <configuration>
                        <!-- When Cargo starts the container, the following tag instructs it to wait for you to kill the session with Crtl-C -->
                        <!-- <wait>true</wait> -->
                        <!-- The following tag details the container you want to deploy to. -->
                        <container>
                            <!-- Specifying "tomcat7x" is very important! This one tripped me up for quite a while. The issue is that instead 
                                of being an identifier for you, "tomcat7x" is an identifier for Cargo that you want to deploy your webapp in Tomcat 7.x. 
                                I had initially thought otherwise and hence just dropped the 'x', making it "tomcat7", but that never worked. -->
                            <containerId>tomcat7x</containerId>
                            <!-- Type == Installed means that you want to deploy to a container that's installed on your computer -->
                            <type>remote</type>
                        </container>
                        <configuration>
                            <!-- This is another one that confused me for long. Its not enough to specify 'installed' in the container tag. You 
                                have to now specify another configuration with type == existing and re-issue the home path -->
                            <type>runtime</type>
                            <properties>
                                <cargo.protocol>http</cargo.protocol>
                                <cargo.hostname>192.168.0.6</cargo.hostname>
                                <cargo.servlet.port>8080</cargo.servlet.port>
                                <cargo.remote.username>deploy</cargo.remote.username>
                                <cargo.remote.password>purplerain</cargo.remote.password>
                            </properties>
                        </configuration>
                        <!-- Here you specify 'deployables' -->
                        <deployables>
                            <!-- This deployable specifies the webapp you want to deploy -->
                            <deployable>
                                <properties>
                                    <context>${project.artifactId}##${project.version}</context>
                                </properties>
                            </deployable>
                        </deployables>
                    </configuration>
                    <!-- Executions specify the targets that you want to run during build -->
                    <executions>
                        <!-- Maven has the concept of a 'phase' which can be thought of a collection of goals. Hence here we are specifying 
                            that during the 'install' phase first deploy the webapp to the container specific folder and then start the container. Both 
                            'deployer-deploy' and 'start' are cargo specific goals. -->
                        <execution>
                            <id>verify-deploy</id>
                            <phase>install</phase>
                            <goals>
                                <goal>deploy</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>
4

tomcat7-Maven-плагин для этого варианта использования:

        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.2</version>
            <configuration>
                <path>/WebappName##${maven.build.timestamp}</path>
                <url>http://localhost:8080/manager/text</url>
                <username>tomcat</username>
                <password>tomcat</password>
                <update>true</update>
            </configuration>
        </plugin>

Как вы можете видеть, версия указана вpath элемент, основанный на метке времени сборки в этом примере.

Конечно, вам все еще нужно использоватьundeployOldVersions="true" в вашем server.xml<Host> элемент, если вы не хотите, чтобы все старые версии работали.

0

можете попытаться заставить Maven применить его номер версии к файлу WAR, когда происходит упаковка, и затем развернуть его.

Что касается старой версии, то "undeployOldVersions" свойство позволит Tomcat удалить старую версию, когда она больше не используется.

Похожие вопросы