Кто-нибудь успешно развернул приложение GWT на Heroku? - PullRequest
15 голосов
/ 10 сентября 2011

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

Ответы [ 3 ]

5 голосов
/ 23 ноября 2011

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

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

Когда вы нажимаете на heroku, вы видите, что процесс компиляции 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-сервлетом, дайте мне знать, если этого недостаточно.

2 голосов
/ 21 декабря 2011

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

Вот мой класс сервера - тот, у которого есть метод main (), на который вы указываете Heroku через плагин приложения-ассемблера согласно документации 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 голосов
/ 05 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...