GWT和SpringBoot—有没有一种聪明的方法来处理相互冲突的依赖关系?
在理想的情况下,您可以将GWT应用程序编译成javascript,将其作为静态资源使用,并在幕后将后端代码运行在JVM上,这样生活就会顺利进行。 但这个理想世界称为运行时生产 然而,在开发期间,当您希望使用gwt代码服务器时 您知道,GWT编译时依赖关系在运行时(源代码+类)期间是必需的,用于调试和重新编译GWT模块 同时,您可能希望后端支持spring boot 1.3.5.RELEASE之类的版本 在这种情况下,频繁发布多个版本的spring boot此时希望添加为托管依赖项,例如:GWT和SpringBoot—有没有一种聪明的方法来处理相互冲突的依赖关系?,gwt,spring-boot,gwt-super-dev-mode,Gwt,Spring Boot,Gwt Super Dev Mode,在理想的情况下,您可以将GWT应用程序编译成javascript,将其作为静态资源使用,并在幕后将后端代码运行在JVM上,这样生活就会顺利进行。 但这个理想世界称为运行时生产 然而,在开发期间,当您希望使用gwt代码服务器时 您知道,GWT编译时依赖关系在运行时(源代码+类)期间是必需的,用于调试和重新编译GWT模块 同时,您可能希望后端支持spring boot 1.3.5.RELEASE之类的版本 在这种情况下,频繁发布多个版本的spring boot此时希望添加为托管依赖项,例如: <
<hibernate-validator.version>5.2.4.Final</hibernate-validator.version>
对于某些RPC服务和DTO,您使Gwt前端依赖于后端API。大多数情况下,您只能在前端模块中管理pom.xml依赖项,而与后端模块中的任何依赖项无关。
最终,您将创建一个war或spring boot可运行jar,它将gwt代码作为静态资源携带,并携带后端代码及其所有依赖项,即Hirbernate validator最新版本
然而,在我看来,当您试图获得一个用于开发目的的pom时,您必须全局地管理根pom.xml中后端和前端层之间常见的依赖项,并将依赖项降级到gwt所需的版本
也就是说,在理想世界中。
您的根pom.xml只需声明模块及其生成顺序。您让后端impl能够声明它希望从spring boot starter pom.xml继承依赖项,等等
与理想情况相反,在开发期间实际帮助您的pom.xml配置上。。。
嗯,您可能需要重新访问根pom.xml。
您必须在此根pom.xml上添加托管依赖项,以便对于GWT前端和spring boot后端之间所有常见的冲突依赖项,您始终必须修改GWT的版本并将降级设置到位
这将确保在执行gwt:run、dev模式重新编译等操作时。。。您不会让gwt编译器尝试javascript编译Hibernate版本5,而是gwt 4.1最终版确实支持的版本。当然,有一天,你可能会在后端代码中遇到一个惊喜,因为你已经准备好了这样一个黑客程序
有没有人知道如何正确组织一个多模块项目,允许后端和基于gwt的前端具有相互冲突的依赖性需求
最终,如果答案是否定的,我相信我会更喜欢网络浪费和增加通信延迟,通过使用纯独立spring boot后端,与纯gwt独立jetty集成,该jetty上的后端只会将请求无声地踢到实际的spring boot后端。让gwt jetty后端被UI调用执行1+1操作,并将计算转发到另一个运行sprin boot的后端,该后端实际知道如何执行1+1操作,这有点可怜。。。但是,如果这是最有成效的工作方式,确保发展是有成效的,生产将毫无意外地进行,那就这样吧
感谢您的反馈,理想情况下,我希望看到一个可以作为现有maven项目导入eclipse的多pom项目,并演示如何实现这一点。找出编译GWT代码时要排除的可传递依赖项
<dependency>
<groupId>spring-dependency-with-hibernate</groupId>
<artifactId>some-spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
</exclusion>
</exclusions>
</dependency>
带hibernate的spring依赖
一些弹簧起动装置
org.hibernate
休眠验证器
这样,只有GWT提供的
hibernate
版本在运行时可用 是的,我想做的事实上是可以做到的,尽管不是微不足道的。。。一点也不
为了建立一个maven多模块pom,该pom可以有效地用于后端和前端代码的代码交换,而无需选择gwt验证器依赖项或springboot验证器依赖项,我基本上按照以下方式组织我的项目
你有:
LEVEL 1: myproject-root
----- LEVEL 2: myproject-backend
---------- LEVEL 3: myproject-backend-api
---------- LEVEL 3: myproject-backend-impl
------ LEVEL 2: myproject-frontend
------ LEVEL 2: myproject-runner
-----------LEVEL 3: myproject-runner-jar
-----------LEVEL 3: myproject-runner-war
在myprojectroot中,自然地声明子模块。
您可以对一些无关紧要的插件(如surefire插件)进行依赖关系管理。您可以控制java源代码和目标编译语言。你只做了很少的事。如果您有一些可以交叉配置的插件,那么您最好将它们放在插件管理中
在myproject后端中,通过向依赖关系管理中添加以下内容,基本上可以将springboot依赖关系继承到依赖关系管理中:
<dependencyManagement>
<dependencies>
<!-- Inherit dependencies from spring boot dependency management pom -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>${version.spring.boot}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
org.springframework.boot
spring启动程序父级
${version.spring.boot}
聚甲醛
进口
你声明了这两个子模块,你就出局了。
这里不声明任何交叉切割依赖项。您只使用依赖关系管理。前端组件将挂接api子模块,您不希望在后端pom中创建依赖项磁铁,因此这里您尽可能保守
在myproject后端api中,首先让该子模块成为jar子模块。接下来,您将希望通过按入口点性质细分api-s来进一步分支api组件。
首先,-api组件将具有服务器和前端之间通信所需的api,类似于文档中常见的“共享”
LEVEL 1: myproject-root
----- LEVEL 2: myproject-backend
---------- LEVEL 3: myproject-backend-api
---------- LEVEL 3: myproject-backend-impl
------ LEVEL 2: myproject-frontend
------ LEVEL 2: myproject-runner
-----------LEVEL 3: myproject-runner-jar
-----------LEVEL 3: myproject-runner-war
<dependencyManagement>
<dependencies>
<!-- Inherit dependencies from spring boot dependency management pom -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>${version.spring.boot}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<noServer>true</noServer>
<webappDirectory>${project.build.directory}/classes/META-INF/resources</webappDirectory>