В идеальном мире ваше GWT-приложение скомпилировано в javascript, вы используете его как статический ресурс, а за кулисами у вас есть внутренний код, работающий на JVM, и жизнь идет хорошо. Но этот идеальный мир называется производством во время выполнения.
Однако во время разработки, когда вы захотите использовать сервер кода gwt...
Зависимости времени компиляции GWT необходимы во время выполнения (исходники + классы) для целей отладки и перекомпиляции модуля GWT.
В то же время вы можете захотеть, чтобы серверная часть поддерживалась чем-то вроде spring-boot 1.3.5.RELEASE.
В этом случае весенняя загрузка, страдающая несколькими частыми выпусками, в данный момент хочет добавить управляемую зависимость, например:
<hibernate-validator.version>5.2.4.Final</hibernate-validator.version>
Что, конечно, очень хорошо. На самом деле, это одна из многих хороших черт весны.
Gwt, с другой стороны, см. ссылку ниже, http://www.gwtproject.org/doc/latest/DevGuideValidation.html
по-прежнему требует, чтобы вы использовали:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.1.0.Final</version>
<scope>runtime</scope>
</dependency>
Теперь, если бы вы сказали: меня не волнует продуктивная разработка, просто скомпилируйте мне то, что правильно работает в продакшене.
Тогда действительно вы можете тривиально решить вышеуказанную проблему, структурировав свой проект следующим образом:
ROOT
--- Backend-api
--- Backend-Impl
--- Gwt-Front-end
---- War or stand alone Spring jar module to glue it all together
Где вы делаете конец Gwt-Front зависимым от внутренних API для некоторых служб RPC и DTO. Зависимости pom.xml, которыми вы можете по большей части управлять только в вашем интерфейсном модуле, независимо от того, какие зависимости у вас есть на бэкэнде. В конечном счете, вы создаете войну или исполняемый jar-файл с весенней загрузкой, который содержит ваш gwt-код в качестве статических ресурсов и содержит ваш внутренний код со всеми его зависимостями, а именно последнюю версию валидатора Hirbernate.
Однако, когда вы пытаетесь получить pom, который работает для целей разработки, насколько я вижу, вам приходится глобально управлять зависимостями, которые являются общими между внутренним и внешним уровнями в ROOT. pom.xml и понизить ваши зависимости до версии, требуемой gwt.
То есть в идеальном мировом сценарии. У вас есть ROOT pom.xml, просто объявляющий ваши модули и порядок их сборки. И вы получаете свой back-end-impl, чтобы иметь возможность заявить, что он хочет наследовать зависимости от spring-boot-starter pom.xml и т. д.
В отличие от идеального сценария, в конфигурации pom.xml, которая действительно помогает вам во время разработки... Что ж, вам, возможно, придется пересмотреть корневой файл pom.xml. И вы должны добавить управляемые зависимости к этому корневому файлу pom.xml, чтобы для всех этих распространенных конфликтующих зависимостей между вашим интерфейсом GWT и серверной частью Spring Boot вам всегда приходилось забивать версию GWT и ставить более раннюю версию. на месте.
Это гарантирует, что когда вы выполняете gwt:run, перекомпилируете в режиме разработки и т. д., компилятор gwt не будет пытаться скомпилировать javascript вашей Hibernate версии 5, а вместо этого будет использовать версию, которая действительно поддерживается финальной версией GWT 4.1. Конечно, вы можете столкнуться с сюрпризом в бэкэнд-коде, в один из дней внедрив такой хак...
Есть ли у кого-нибудь представление о том, как правильно организовать многомодульный проект, в котором серверная часть и интерфейс на основе gwt могут иметь конфликтующие требования к зависимостям?
В конечном счете, если ответ отрицательный, я полагаю, что предпочту иметь потери сети и дополнительную задержку связи, имея чистый автономный сервер загрузки spring, который интегрируется с автономным причалом только на чистом gwt, где сервер на этом причале делает не что иное, как тупо отбрасывает запросы к фактическому бэкенду spring-boot. Как-то жалко иметь серверную часть gwt jetty, которая вызывается для выполнения 1 + 1 пользовательским интерфейсом и перенаправляет вычисления на вторую серверную часть, выполняющую загрузку sprin, которая на самом деле знает, как выполнять 1 + 1 ... но если это самый продуктивный способ работы, гарантирующий, что разработка будет продуктивной, а производство будет проходить без неожиданностей, пусть будет так.
Спасибо за любой отзыв, и в идеале я хотел бы увидеть проект с несколькими помпонами, который вы можете импортировать как существующий проект maven в eclipse, и продемонстрировать, как этого можно достичь.