开发使用AppEngine数据库的Java应用程序

时间:2013-07-19 10:35:17

标签: java google-app-engine development-mode

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

首先,将以下helper-class添加到项目中:

// 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开发服务器registers its own URLStreamHandlerFactory自动将Http(s)URLConnections映射到AppEngine的URL-fetch基础架构。这意味着如果您在客户端代码中使用HttpURLConnections,则会收到有关丢失url-fetch功能的错误。幸运的是,这可以通过以下两种方式修复:Getting a reference to Java's default http(s) URLStreamHandler

答案 1 :(得分:0)

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