这可能是一个非常微不足道的问题,但我很难找到答案:
使用 Google Plugin for Eclipse,我想开发一个普通的旧式 Java 应用程序(不是 Web 应用程序),它使用 AppEngine 进行云存储。
为此,我当然可以简单地创建两个项目,一个包含 AppEngine 服务器,另一个包含 Java 应用程序。
但我想知道是否可以在 Eclipse 中设置一个包含服务器和客户端代码的项目(如 GWT 项目)。为了执行它进行本地调试,我希望 Eclipse 启动 Tomcat 以使我的 servlet 可用,然后从项目的客户端目录启动 Main.java,就好像该项目只是一个简单的 Java 应用程序一样。这就是“Google”->“Web 应用程序”设置中“从此目录启动并部署”复选框的用途吗?如果可以,我该如何使用它?
最佳答案
我找到了一种方法,但有点俗气。
首先,将以下帮助程序类添加到项目中:
// 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
帮助器类的情况下实现此目的,请发布它!
此外,除了像上面那样使用 URL 连接对其进行 ping 操作之外,可能还有一种更优雅的方法来检查 AppEngine 服务器是否正在运行。
注意: AppEngine 开发服务器 registers its own URLStreamHandlerFactory
自动映射Http(s)URLConnections
进入 AppEngine 的 URL-fetch基础设施。这意味着如果您随后在客户端代码中使用 HttpURLConnections
,您会收到错误消息,提示缺少 url-fetch 功能。幸运的是,这可以通过两种方式解决,如下所述:Getting a reference to Java's default http(s) URLStreamHandler .
关于java - 开发使用 AppEngine 数据库的 Java 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17744032/