应用引擎+模块+ maven的开发工作流程

时间:2014-03-25 09:08:06

标签: google-app-engine maven

我们最近根据以下结构将我们的应用引擎项目转换为模块。这个新的开发工作流程的问题是我们必须在每次更改时重建EAR并重新启动应用程序引擎本地开发服务器。每次我们对代码进行更改并想要测试时,这会使我们松散30分钟到一分钟。

/commons
 -pom.xml
/model
 -pom.xml
/webapp //app engine module
 -pom.xml
/apis //app engine module
 -pom.xml
/ear
 -pom.xml
pom.xml //main (parent) project pom

在我们之前的工作流程中,使用单片应用程序,我们可以使用app引擎的热重新加载功能,其中自动拾取修改IDE中的代码(例如eclipse)。

在这种情况下,你们推荐什么作为最好的maven配置和/或dev工作流程?理想情况下,任何模块的更改都不需要完全重建项目。

1 个答案:

答案 0 :(得分:8)

我使用的是类似的结构,但差别很小。顶级目录有war和ear,然后它们包含特定的pom.xml。我使用Eclipse进行调试,我能够“大部分时间”进行热部署,而且我没有使用Eclipse插件,我知道这是你想要的。

目录结构

.
|-- pom.xml
|-- README.md
|-- my-ear
|   |-- devpid
|   |-- pom.xml
|   `-- src
|       `-- main
|           `-- application
|               `-- META-INF
`-- my-war
    |-- build
    |   `-- classes
    |       |-- main
    |       |   |-- java
    |       |   `-- webapp
    |       `-- test
    |           `-- java
    |-- pom.xml
    `-- src
        |-- main
        |   |-- java
        |   |   `-- com
        |   `-- webapp
        |       |-- css
        |       |-- favicon.ico
        |       |-- index.html
        |       |-- js
        |       |-- test.html
        |       `-- WEB-INF
        `-- test
            `-- java

工具

  • 没有Google App Engine插件(或SDK)的Eclipse Luna
  • Maven 3.2.1
  • Google App Engine SDK 1.9.6

开发工作流程

  1. 如果您已经拥有源代码,请将其保存在其他位置并使用mvn appengine命令生成骨架。
  2. 使用maven和terminal以及mvn appengine:devserver命令,使用简单的Hello World运行第一个剪切。
  3. 完成后,生成eclipse项目。
  4. 将eclipse项目导入为Maven项目。它将通过Maven看到罐子。我不会在Luna之前写这个答案,因为它需要太多的调整。在Luna中,这会自动生效。
  5. 上面的步骤将创建三个项目,top level,ear和war,每个项目都有pom.xml - 没关系。
  6. 在eclipse中,将输出目录提供为war / target目录。这是使热部署成为可能的步骤。
  7. 在maven ear / pom.xml中,将xArgs添加到appengine插件以便在调试模式下运行。

    <plugin>
        <groupId>com.google.appengine</groupId>
        <artifactId>appengine-maven-plugin</artifactId>
        <version>${appengine.target.version}</version>
        <configuration>
            <jvmFlags>
            <jvmFlag>-Xdebug</jvmFlag>
                <jvmFlag>-Xrunjdwp:transport=dt_socket,address=1044,server=y,suspend=n</jvmFlag>
            </jvmFlags>
            <disableUpdateCheck>true</disableUpdateCheck>
        </configuration>
    </plugin>
    
  8. 注意suspend = n。

  9. 使用来自ear目录的mvn appengine:devserver 从eclipse外部运行app引擎。我用这个命令: mvn appengine:devserver > ~/.logs/.appengine.devserver.logs & echo $! > devpid 我们称之为1号航站楼。
  10. 此方法的一个优点是Eclipse不会捕获您的控制台,因此您可以自由使用您选择的工具来查看它,例如multitail等。我使用这个简单的tail命令: tail -f ~/.logs/.appengine.devserver.logs | sed 's/INFO/^[[0;34m&^[[0m/g;s/ERROR/^[[0;31m&^[[0m/g;s/WARN\|WARNING/^[[0;35m&^[[0m/g;s/SEVERE\|FATAL/^[[0;31;47m&^[[0m/g' 以上是难以打字的命令。 ^ [的每个实例实际上是Ctrl + V Esc - 值得输入一次的努力。但这当然是主观的,取决于你。
  11. 在Eclipse中,在Remote Java Application下为项目创建调试配置文件 - 选择war项目和套接字附加选项。这个步骤可以在互联网上的许多地方找到,但这里仍然是一个图像 Debug Config, Remote Application, War Socket Attach

  12. 在war目录中打开另一个终端,即终端2并保持打开状态,以便在需要时运行mvn compile install

  13. 你很高兴。您应该能够通过在适当的位置粘贴源代码来集成它们。您还应该能够使用标准调试技术。 Eclipse将在正确的位置编译,devserver将检测它。如果Eclipse抛出警告,请忽略它。
  14. 大部分时间都可以使用。有时,您会保存一些会破坏整个项目编译的内容,或者更改从预编译类调用的函数名称,或者只需更改启动时加载的web.xml。当然,热部署不起作用。
  15. 在这种情况下,请在eclipse中停止删除调试,完成任务,从终端2运行mvn compile install .Devserver将自动检测。
  16. 大多数情况下,我几乎不需要触摸终端1中运行的尾部.Devserver不需要重启。
  17. 除非我更改web.xml或重构,否则我不需要从外部运行mvn compile install

  18. 我给出窗口列表(Eclipse,终端1和终端2)的原因只是为了表明Alt + Tab实际上比eclipse中的Shift + F7更快。这是主观的,当然由你决定。