【问题标题】:Working with modules on the local dev server for Java在本地 Java 开发服务器上使用模块
【发布时间】:2014-09-29 19:22:24
【问题描述】:

我正在开发一个 Google Appengine Java 应用程序,并且在使用本地开发服务器进行测试时面临着重大挑战。我放弃了 Eclipse 工具,因为我对 Netbeans 和 我正在使用 Appengine Maven 插件进行开发。

这是我的示例项目结构:

我的应用程序
模块端点
模块网络
模块耳
pom.xml

当我在根文件夹 (myapp) 上使用 mvn clean install 构建时,以及当我使用 mvn appengine:devserver 命令运行 module-ear 应用程序时,应用程序可以工作,但是我似乎无法通过以下方式访问云端点http://localhost:8080/_ah/api。当我通过管理控制台http://localhost:8080/_ah/admin访问端点时,我只能通过动态发布的端口访问端点的API。

问题在于,根据教程在模块网络项目上测试云端点 Javascript 客户端时,我应该使用 localhost:8080/_ah/api 作为我的测试 URL。我错过了什么吗?

【问题讨论】:

  • 您确定您使用的本地 API 浏览器的 URL 正确吗?它应该是http://localhost:8080/_ah/api/explorer(但实际上它是一个重定向)。您知道您可以在应用程序的pom.xml<plugin><configuration> 中指定<port></port> 吗?
  • 你知道当你在开发服务器上运行一个ear应用程序时,它会为云端点应用程序生成一个随机端口,如果你检查你的控制台,你会发现列出的两个应用程序,war应用程序将运行在 8080 上,而云端点应用程序在不同的端口上运行(每次运行大多是随机的)。如果我访问端点模块,例如 localhost:6789/_ah/api/explorer 它可以工作,但是当我尝试像这样访问它时 localhost:8080/_ah/api/explorer 它没有。谢谢.
  • 对,我正在查看的应用程序在同一模块中有端点。也许我会尝试拆分端点或进入一个新模块,看看我是否可以重现这个问题。您的端点模块是默认模块吗?
  • @tx802 不,我的端点模块不是默认模块。
  • @tx802 所有教程都说使用这个 url localhost:8080/_ah/api,在我看来,资源管理器 url 就像测试端点服务方法的 url,而 _ah/api 适用于客户端访问端点服务方法。

标签: google-app-engine


【解决方案1】:

如果问题仍然存在,您可以随时使用标志更新 pom.xml,以便定义所有模块的端口:

<plugin>
    <groupId>com.google.appengine</groupId>
    <artifactId>appengine-maven-plugin</artifactId>
    <version>${appengine.target.version}</version>
    <configuration>
      <port>8080</port>
      <jvmFlags>
        <jvmFlag>-Xdebug</jvmFlag>
        <jvmFlag>-Xrunjdwp:transport=dt_socket,address=1044,server=y,suspend=n</jvmFlag>
        <jvmFlag>-Dcom.google.appengine.devappserver_module.mymodule2.port=9090</jvmFlag>
      </jvmFlags>
      <disableUpdateCheck>true</disableUpdateCheck>
    </configuration>
  </plugin>

然后您可以使用 localhost:9090/_ah/api/explorer 来测试您的 API

【讨论】:

  • 说真的@Herring,你是怎么知道devappserver_module.mymodule2.port的?你还有其他的黄金知识吗?您是否在 Intellij 中运行了 ear setup 并看到“您的工作目录 ear-xxxear-xxx/module-xxx 不匹配,所以不再有 new File("WEB-INF") 的工作?
【解决方案2】:

如果您部署了多个模块,则需要更新您的 Maven 应用引擎启动器设置以识别不同的模块。请参阅https://github.com/GoogleCloudPlatform/appengine-modules-sample-java 上的模块示例 Java 应用程序。

如果您已经这样做了,那么 dispatch.xml 文件将告诉应用引擎如何路由请求:https://cloud.google.com/appengine/docs/java/modules/routing

【讨论】:

    【解决方案3】:

    当我将端点项目设置为默认模块时,它起作用了。

    【讨论】:

      【解决方案4】:

      dispatch.xml 在 devserver 上被忽略,documentation 声明如下。

      分派文件

      运行开发服务器时忽略所有调度文件。 定位实例的唯一方法是通过它们的端口。

      这意味着在配置的端口(通常是 8888 或 8080)上只能访问 默认模块。我刚刚用app engine 1.9.25测试过,还是不行,所以没有改进。

      另一方面,您始终可以通过其端口来引用模块。应用程序启动时,模块的位置会记录在控制台中,您将看到如下内容:

      INFO:模块实例 module2-auto 正在 http://localhost:37251/ 运行

      在我的情况下,这是没有用的,因为我希望通过使用相同的主机(但不同的 url)向不同的模块发出 AJAX 请求。例如:

      【讨论】:

      • 这就是我解决您提到的问题的方法(“我期望使用相同的主机(但不同的 url)向不同的模块发出 AJAX 请求”):blog.tomtasche.at/2015/12/…
      猜你喜欢
      • 2012-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-28
      • 2015-07-06
      • 1970-01-01
      • 2015-04-21
      相关资源
      最近更新 更多