Кто-нибудь успешно развернул приложение GWT на Heroku?

Недавно Heroku начала поддерживать Java-приложения. Просматривая документы, он, похоже, похож на Java Servlet Standard. Кто-нибудь знает о том, где приложение GWT было успешно развернуто на Heroku? Если да, существуют ли ограничения?

Ответы

Ответ 1

У моего первого ответа на этот вопрос возникли проблемы, когда GWT попытался прочитать свою политику сериализации. В конце концов я пошел на более простой подход, который был менее основан на Guice. Мне пришлось пройти через код Jetty, чтобы понять, почему setBaseResource() - это путь, который не сразу становится очевидным из Javadoc.

Здесь мой класс сервера - тот, у кого метод main(), который вы указываете Heroku через ваш плагин app-ассемблера в соответствии с документами 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/.

Ответ 2

Да, у меня получилось успешное развертывание с использованием начальных инструкций Java здесь: http://devcenter.heroku.com/articles/java

Я использую проект Maven с подходом плагина appassembler, но добавил gwt-maven-plugin для компиляции приложения GWT во время сборки.

Когда вы нажимаете на герою, вы видите, что процесс компиляции GWT работает, в одном потоке только настолько медленный, но он отлично работает.

Вложенный экземпляр Jetty настроен на обслуживание статических ресурсов в /static из src/main/resources/static, и я копирую скомпилированное приложение GWT в это место во время сборки, а затем ссылаюсь на .nocache.js как обычно.

Что еще вы хотите знать?

У вас есть выбор: либо создайте Javascript-представление своего приложения GWT локально в своем проекте Maven, зафиксируйте его и прочитайте в своем приложении, либо создайте его внутри Heroku через gwt-maven-plugin, поскольку я упоминается.

Код для обслуживания файлов из статического местоположения внутри вашего баннера с помощью встроенного Jetty - это что-то вроде этого внутри 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-сервлетом, сообщите мне, если этого недостаточно.

Ответ 3

В теории нужно иметь возможность запускать GWT с помощью встроенных версий Jetty или Tomcat и загружать сервер в main, как описано в документах Java Heroku.