有没有人在Heroku上成功部署了一个GWT应用程序?

时间:2011-09-10 04:25:14

标签: gwt heroku

Heroku最近开始支持Java应用程序。通过文档查看,它似乎与Java Servlet标准类似。有没有人知道在Heroku上成功部署GWT应用程序的实例?如果是这样,有没有限制?

3 个答案:

答案 0 :(得分:5)

是的,我在这里使用Java指令入门进行了成功的部署: http://devcenter.heroku.com/articles/java

我使用带有appassembler插件方法的Maven项目,但在构建期间添加了gwt-maven-plugin来编译GWT应用程序。

当你推送到heroku时,你会看到GWT编译过程正在运行,在一个线程上运行速度非常慢但是工作正常。

嵌入式Jetty实例配置为从src / main / resources / static提供/ static静态资源,并在构建期间将已编译的GWT应用程序复制到此位置,然后正常引用.nocache.js。 / p>

你还想知道什么?

您可以选择,在您的Maven项目中本地构建GWT应用程序的Javascript表示,提交它并从您的应用程序中读取它,或者通过gwt-maven-plugin在Heroku中生成它提及。

通过嵌入式Jetty从jar中的静态位置提供文件的代码在Guice ServletModule中是这样的:

(请参阅下面的其他答案,了解更简单,更少Guice驱动的方法。)

protected void configureServlets() {
  bind(DefaultServlet.class).in(Singleton.class);
  Map<String, String> initParams = new HashMap<String, String>();
  initParams.put("pathInfoOnly", "true");
  initParams.put("resourceBase", staticResourceBase());
  serve("/static/*").with(DefaultServlet.class, initParams);
}

private String staticResourceBase() {
    try {
        return WebServletModule.class.getResource("/static").toURI().toString();
    }
    catch (URISyntaxException e) {
        e.printStackTrace();
        return "couldn't resolve real path to static/";
    }
}

还有一些其他技巧可以让嵌入式Jetty使用guice-servlet,如果这还不够,请告诉我。

答案 1 :(得分:2)

理论上,应该能够使用嵌入式Jetty或Tomcat版本运行GWT,并按照Heroku Java文档中的描述在main中引导服务器。

答案 2 :(得分:2)

当GWT尝试阅读其序列化策略时,我的第一个答案结果就出现了问题。最后,我采用了一种更简单的方法,而不是基于Guice的方法。我不得不单步执行Jetty代码来理解为什么setBaseResource()是可行的方法 - 它不会立即显现在Javadoc中。

这是我的服务器类 - 带有main()方法的服务器类,你根据Heroku文档通过你的app-assembler插件指向Heroku。

public class MyServer {

public static void main(String[] args) throws Exception {
    if (args.length > 0) {
        new MyServer().start(Integer.valueOf(args[0]));
    }
    else {
        new MyServer().start(Integer.valueOf(System.getenv("PORT")));
    }
}

public void start(int port) throws Exception {

    Server server = new Server(port);
    ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
    context.setBaseResource(createResourceForStatics());
    context.setContextPath("/");
    context.addEventListener(new AppConfig());
    context.addFilter(GuiceFilter.class, "/*", null);
    context.addServlet(DefaultServlet.class, "/");
    server.setHandler(context);

    server.start();
    server.join();
}

private Resource createResourceForStatics() throws MalformedURLException, IOException {
    String staticDir = getClass().getClassLoader().getResource("static/").toExternalForm();
    Resource staticResource = Resource.newResource(staticDir);
    return staticResource;
}
}

AppConfig.java是一个GuiceServletContextListener。

然后将静态资源放在src/main/resources/static/