【问题标题】:How to run tomcat7-maven-plugin, that server code changes will be updated immediately如何运行tomcat7-maven-plugin,服务器代码更改将立即更新
【发布时间】:2015-09-22 08:38:53
【问题描述】:

我在 Maven 中有项目。这里主要是pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>pl.derp</groupId>
    <artifactId>parent</artifactId>
    <packaging>pom</packaging>
    <version>1.0.0-SNAPSHOT</version>
    <modules>
        <module>server</module>
        <module>shared</module>
        <module>web</module>
    </modules>

    <properties>
        <gwtVersion>2.7.0</gwtVersion>
        <webappDirectory>${project.build.directory}/${project.build.finalName}</webappDirectory>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <tomcat.webport>8083</tomcat.webport>
        <tomcat.ajpport>8182</tomcat.ajpport>
        <tomcat.context>/parent</tomcat.context>

        <hibernate.version>4.3.7.Final</hibernate.version>
        <mysql.connector.version>5.1.21</mysql.connector.version>

        <slf4j.version>1.6.4</slf4j.version>
        <spring.version>3.0.5.RELEASE</spring.version>
        <guice.version>3.0</guice.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.google.gwt</groupId>
            <artifactId>gwt-servlet</artifactId>
            <version>${gwtVersion}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>com.google.gwt</groupId>
            <artifactId>gwt-user</artifactId>
            <version>${gwtVersion}</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>1.0.0.GA</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>1.0.0.GA</version>
            <classifier>sources</classifier>
            <scope>test</scope>
        </dependency>
        <!-- DB related dependencies -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>${hibernate.version}</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>${hibernate.version}</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.connector.version}</version>
        </dependency>
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.12.1.GA</version>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.182</version>
        </dependency>

        <!-- Logging -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j.version}</version>
        </dependency>

        <!-- Custom formats -->
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.5</version>
        </dependency>
        <dependency>
            <groupId>org.jadira.usertype</groupId>
            <artifactId>usertype.extended</artifactId>
            <version>3.2.0.GA</version>
        </dependency>


        <!-- Spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>commons-logging</groupId>
                    <artifactId>commons-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${spring.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>commons-logging</groupId>
                    <artifactId>commons-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-core</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-taglibs</artifactId>
            <version>${spring.version}</version>
        </dependency>


        <!-- Tests -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>

    </dependencies>


    <build>

        <defaultGoal>clean install tomcat7:run-war-only</defaultGoal>

        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>gwt-maven-plugin</artifactId>
                <version>${gwtVersion}</version>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.3</version>
            </plugin>

            <!-- IDE -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-eclipse-plugin</artifactId>
                <version>2.7</version>  <!-- Note 2.8 does not work with AspectJ aspect path -->
                <configuration>
                    <downloadSources>true</downloadSources>
                    <downloadJavadocs>false</downloadJavadocs>
                    <wtpversion>2.0</wtpversion>
                    <additionalBuildcommands>
                        <buildCommand>
                            <name>org.eclipse.jdt.core.javabuilder</name>
                            <arguments>
                            </arguments>
                        </buildCommand>
                        <buildCommand>
                            <name>com.google.gdt.eclipse.core.webAppProjectValidator</name>
                            <arguments>
                            </arguments>
                        </buildCommand>
                        <buildCommand>
                            <name>com.google.gwt.eclipse.core.gwtProjectValidator</name>
                            <arguments>
                            </arguments>
                        </buildCommand>
                    </additionalBuildcommands>
                    <additionalProjectnatures>
                        <projectnature>com.google.gwt.eclipse.core.gwtNature</projectnature>
                    </additionalProjectnatures>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.5.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.0</version>
                <configuration>
                    <path>${tomcat.context}</path>
                    <port>${tomcat.webport}</port>
                    <ajpPort>${tomcat.ajpport}</ajpPort>
                    <systemProperties>
                        <JAVA_OPTS>-XX:MaxPermSize=256m</JAVA_OPTS>
                    </systemProperties>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

我正在使用tomcat7-maven-plugin,正如您在 pom.xml 中看到的那样。

要启动服务器,我使用命令:maven clean install tomcat7:run-war-only

但不幸的是,当我对服务器端/层代码进行任何更改时,我必须停止服务器并再次运行它,这需要很长时间,原因是:测试运行、完整编译、所有置换编译(它是gwt app,所以它为每个浏览器编译java代码为js代码)...

我怎样才能在运行时设置自动代码替换/热交换,这样我就不必重新启动和重新编译我的项目,只要我做一点改变?

我会加快我的开发过程。

请给我一些帮助。

【问题讨论】:

    标签: java maven tomcat


    【解决方案1】:

    我猜花费时间最长的是 GWT 并发症。如果您使用单个浏览器进行所有开发,您可以告诉 GWT 仅编译该浏览器的排列。请参阅this question and accepted answer 了解如何操作。这应该会减少您的构建时间。

    此外,您可以告诉 Maven 跳过测试。这不是我真正推荐的做法,但如果您确实确定您的更改是微不足道的,或者不涉及 Java 代码,那么请使用 Maven 开关-DskipTests

    如果您的更改仅涉及 HTML、CSS、JS、JSP 等资源,那么您可以直接将它们复制到 $tomcat_home/webapps/yourapp 并且 Tomcat 会选择它们,无需构建。请注意始终在源代码中使用最新版本。

    最后,Tomcat 插件不需要重启 Tomcat。试试

    mvn tomcat7:redeploy
    

    【讨论】:

    • 当我运行tomcat服务器时我应该使用这个命令:mvn tomcat7:redeploy?这会更新我在服务器上的 java 类吗?
    • 我收到一个错误:[ERROR] Could not find goal 'redeploy' in plugin org.apache.tomcat.maven:tomcat7-maven-plugin:2.0 among available goals exec-war-only, deploy-only, shutdown, run-war-only, run, deploy, run-war, exec-war, help -&gt; [Help 1]
    • 奇怪。请改用mvn tomcat7:deploy。 Tomcat 应该正在运行。它将更新 Tomcat 上的整个应用程序。首先自动运行package,所以会重新编译一切。
    • 不起作用。也许我们应该继续聊天:chat.stackoverflow.com/rooms/90302/…?
    • 我有一个带有 tomcat 插件的工作 pom,但它在我家的电脑上 - 稍后我将使用工作插件编辑我的答案。
    【解决方案2】:

    tomcat7-maven-plugin 不是为此目的而制作的,请使用 IDE(IntelliJ、Eclipse、Netbeans...)或 JRebel 等动态类加载器。

    【讨论】:

    • 我使用 Eclipse IDE。但我不知道如何将 Tomcat Maven 插件与 Eclipse 服务器集成。你能给我一些想法吗?可能吗?你是什​​么意思:Use IDE
    • Eclipse 已经能够将资源发布到服务器。无需显式使用插件。打开“Windows”->“视图”->“服务器”。添加您的 Tomcat 和一个项目,然后按播放。 help.eclipse.org/juno/…
    • 我已经尝试过这样做。不幸的是,我的 Maven 项目不适用于 Eclipse 服务器。我应该如何配置 Maven 或 Eclipse 以使它们协同工作?
    • 我知道 IDE 是什么。我只是不能让他们两个一起工作。 Maven 使用 Maven 目标启动他自己的 Eclipse 服务器。请帮助我。
    猜你喜欢
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 2014-01-29
    • 2012-07-01
    • 2012-04-23
    • 2014-01-20
    • 2017-08-18
    • 2018-02-20
    相关资源
    最近更新 更多