0

这可能是一个非常微不足道的问题,但我很难找到答案:

使用 Eclipse 的 Google 插件,我想开发一个普通的旧 Java 应用程序(不是 Web 应用程序),它使用 AppEngine 进行云存储。

为此,我当然可以简单地创建两个项目,一个包含 AppEngine 服务器,一个包含 Java 应用程序。

但我想知道是否可以在 Eclipse 中设置一个包含服务器和客户端代码的项目(如 GWT 项目)。为了执行本地调试,我希望 Eclipse 启动 Tomcat 以使我的 servlet 可用,然后从项目的客户端目录启动我的 Main.java,就好像项目只是一个简单的 Java 应用程序一样。这就是“Google”->“Web 应用程序”设置中的“从该目录启动和部署”复选框的用途吗?如果是这样,我该如何使用它?

4

2 回答 2

1

我找到了一种方法来做到这一点,但它有点俗气。

首先,将以下辅助类添加到项目中:

// other imports
import com.google.appengine.tools.development.DevAppServerMain;

public class DevServer {
    public static void launch(final String[] args) {
        Logger logger = Logger.getLogger("");
        logger.info("Launching AppEngine server...");
        Thread server = new Thread() {
            @Override
            public void run() {
                try {
                    DevAppServerMain.main(args);  // run DevAppServer
                } catch (Exception e) { e.printStackTrace(); }
            }
        };
        server.setDaemon(true);  // shut down server when rest of app completes
        server.start();          // run server in separate thread
        URLConnection cxn;
        try {
            cxn = new URL("http://localhost:8888").openConnection();
        } catch (IOException e) { return; }  // should never happen
        boolean running = false;
        while (!running) {  // maybe add timeout in case server fails to load
            try {
                cxn.connect();  // try to connect to server
                running = true;
                // Maybe limit rate with a Thread.sleep(...) here
            } catch (Exception e) {}
        }
        logger.info("Server running.");
    }
}

然后,将以下行添加到入口类:

public static void main(String[] args) {
    DevServer.launch(args);  // launch AppEngine Dev Server (blocks until ready)
    // Do everything else
}

最后,创建适当的运行配置:

  • 只需单击“运行方式”->“Web 应用程序”。创建默认运行配置。
  • 在创建的运行配置中,在“主”选项卡下选择您自己的条目类作为“主类”,而不是默认的“com.google.appengine.tools.development.DevAppServerMain”。

现在,如果您启动此运行配置,它将首先启动 AppEngine 服务器,然后继续main(...)执行入口类中的其余方法。由于服务器线程被标记为守护线程,一旦其他代码main(...)完成,应用程序将正常退出,同时关闭服务器。

不确定这是否是最优雅的解决方案,但它确实有效。如果其他人有办法在没有DevServer助手类的情况下实现这一点,请发布!

此外,可能还有一种更优雅的方法来检查 AppEngine 服务器是否正在运行,而不是像我上面那样使用 URL 连接 ping 它。

注意: AppEngine 开发服务器注册自己的URLStreamHandlerFactory以自动映射Http(s)URLConnections到 AppEngine 的URL-fetch基础设施。HttpURLConnections这意味着如果您随后在客户端代码中使用,您会收到抱怨缺少 url-fetch 功能的错误。幸运的是,这可以通过两种方式解决,如下所述:获取对 Java 的默认 http(s) URLStreamHandler 的引用

于 2013-07-19T11:58:33.797 回答
0

如果您确实想使用 appengine,那么您最终将创建两个项目,一个在 appengine 上,另一个是独立的(无 servlet)。在这种情况下,您可以查看 appengine Remote API

于 2013-07-19T11:26:48.400 回答