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

开发使用AppEngine数据库的Java应用程序,java,google-app-engine,development-mode,Java,Google App Engine,Development Mode,这可能是一个非常琐碎的问题,但我很难找到答案: 使用Google插件for Eclipse,我想开发一个普通的旧Java应用程序(不是web应用程序),它使用AppEngine进行云存储 为此,我当然可以简单地创建两个项目,一个包含AppEngine服务器,另一个包含Java应用程序 但是我想知道是否可以在Eclipse中设置一个同时包含服务器和客户机代码的项目(比如GWT项目)。为了执行它进行本地调试,我希望Eclipse启动Tomcat使servlet可用,然后从项目的客户机目录启动Main

这可能是一个非常琐碎的问题,但我很难找到答案:

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

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


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

如果您确实想使用appengine,那么您将创建两个项目,一个在appengine上,另一个是独立的(没有servlet)。在本例中,您可以查看appengine,我找到了一种方法,但它有点俗气

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

// 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.");
    }
}
然后,将以下行添加到entry类:

public static void main(String[] args) {
    DevServer.launch(args);  // launch AppEngine Dev Server (blocks until ready)
    // Do everything else
}
最后,创建适当的运行配置:

  • 只需单击“运行方式”->“Web应用程序”。创建默认运行配置
  • 在创建的运行配置中,在“Main”选项卡下,选择您自己的条目类作为“Main class”,而不是默认的“com.google.appengine.tools.development.DevAppServerMain”
现在,如果启动此运行配置,它将首先启动AppEngine服务器,然后继续entry类中的
main(…)
方法的其余部分。由于服务器线程被标记为守护进程线程,因此一旦
main(…)
中的其他代码完成,应用程序就会正常退出,并关闭服务器

不确定这是否是最优雅的解决方案,但它确实有效。如果其他人没有
DevServer
helper类就可以实现这一点,请发布它

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


注意:自动映射到AppEngine基础架构的AppEngine开发服务器。这意味着,如果在客户端代码中使用
HttpURLConnections
,就会出现错误,抱怨缺少url获取功能。幸运的是,这可以通过以下两种方式解决:。

你说你要找的不是web应用程序?@Rakesh正确。我正在编写一个常规的旧Java应用程序,它使用Url连接访问AppEngine提供的数据库。任何地方都没有涉及网络浏览器。您是否特别需要使用AppEngine或任何数据库?@Rakesh我绝对想使用AppEngine。看起来不错!可能您应该在while循环中引入一些延迟,而不是连续ping。我认为
connect()
方法中已经存在某种超时。至少如果我进一步查看日志消息,while循环在退出之前似乎只执行了4到5次,即使加载服务器需要几秒钟。但总的来说,你当然是对的。而且,也许在另一台机器上,它的行为会有所不同。我将在代码中添加注释。