我们最近将我们的应用程序引擎项目按照以下结构转换为模块。这个新的开发工作流程的问题是,我们必须在每次更改时重建 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
在我们之前的工作流程中,对于整体应用程序,我们可以使用应用程序引擎的热重载功能,其中将自动选择 IDE(例如 Eclipse)中的代码修改。
在这种情况下,你们推荐什么作为最好的 Maven 配置和/或开发工作流程?理想情况下,任何模块的更改都不需要完全重建项目。
我正在使用类似的结构,但略有不同。顶层目录有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
Tools
- 没有 Google App Engine 插件(或 SDK)的 Eclipse Luna
- Maven 3.2.1
- 谷歌应用引擎 SDK 1.9.6
开发工作流程
- 如果您已经有源代码,请将其保存在其他位置并使用 mvn appengine 命令生成框架。
- 仅使用 maven 和终端以及 mvn appengine:devserver 命令,使用简单的 Hello World 运行第一个片段。
- 完成后,生成eclipse项目。
- 将 eclipse 项目导入为 Maven 项目。它将通过 Maven 查看 jar。我不会在 Luna 之前写下这个答案,因为它需要太多的调整。在 Luna 中,这会自动进行。
- 上面的步骤将创建三个项目,顶级项目、ear 项目和 war 项目,每个项目都带有 pom.xml - 没关系。
- 在 Eclipse 中,提供输出目录作为 war/target 目录。这一步使得热部署成为可能。
-
在 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>
注意 suspend=n。
- 使用 mvn appengine:devserver 从 eclipse 外部运行应用程序引擎从耳朵目录。我使用这个命令:
mvn appengine:devserver > ~/.logs/.appengine.devserver.logs & echo $! > devpid
我们称之为 1 号航站楼。
- 这种方法的一个优点是您的控制台不会被 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 - 值得花费精力输入一次。但这当然是主观的,取决于你。
In Eclipse, create a Debug Profile for your project under Remote Java Application - select the war project and socket attach options. This step is available on the internet at many places, here is an image nevertheless
在 war 目录中打开另一个终端 Terminal 2 并保持打开状态以便运行mvn compile install
当你需要的时候。
- 你已准备好出发。您应该能够通过将源代码粘贴到正确的位置来集成它。您还应该能够使用标准的调试技术。 Eclipse 将在正确的位置进行编译,并且 devserver 将正确检测到它。如果 Eclipse 抛出警告,请忽略它。
- 这在大多数情况下都有效。有时,您保存的内容会破坏整个项目的编译,或者更改从预编译的类中调用的函数名称,或者只是更改启动时加载的 web.xml。当然这样热部署就不行了。
- 在这种情况下,停止从 Eclipse 中删除调试,完成任务,运行
mvn compile install
从终端 2。Devserver 将自动检测。
- 大多数情况下,我几乎不需要触及终端 1 中运行的尾部。Devserver 往往不需要重新启动。
- 除非我更改 web.xml 或重构,否则我不需要运行
mvn compile install
从外面。
我给出窗口列表(Eclipse、终端 1 和终端 2)的原因只是为了表明 Alt+Tab 实际上比 Eclipse 中的 Shift+F7 更快。这是主观的,当然取决于你。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)