GWT(Maven)项目:依赖冲突
GWT (Maven) project: Dependency conflict
我有一个具有以下依赖项的 GWT 项目
<dependency>
<groupId>com.google.gwt.inject</groupId>
<artifactId>gin</artifactId>
<version>2.1.2</version>
</dependency>
<dependency>
<groupId>net.sourceforge.owlapi</groupId>
<artifactId>owlapi-distribution</artifactId>
<version>4.0.2</version>
</dependency>
gin 2.1.2 依赖于 guice 3.0 而 owlapi 4.0.2 依赖于 guice 4.0-beta。
gin用在客户端,owlapi用在服务端
当我强制使用 guice 4.0-beta 时编译失败。由 java.lang.ClassNotFoundException: com.google.inject.internal.util.$Maps
引起
当我强制使用guice 3.0时编译成功,但在运行时因java.lang.ClassNotFoundException: com.google.inject.internal.guava.collect.$ImmutableList
[=而失败13=]
不能选择降级 owlapi 版本。
我有哪些选择才能完成这项工作?我能否以某种方式使用依赖范围,同时仍保留正常运行的 GWT DevMode?
对于我在依赖范围方面的 maven 经验来说,这是一个复杂的场景。
鉴于您得到的错误提到番石榴,您可能会幸运地强制使用最新的番石榴 - owlapi 应该适用于 17 或 18。
另一种选择可能是尝试使用 guice 4 重新编译 gin(并可能在上游贡献更改)。我不知道这有多难。您还必须确保您的快照与您的应用一起发布,并且您团队中可能需要它们的其他人可以访问。
将您的项目拆分为不同的模块。鉴于 Maven 的有限(设计)依赖范围选项,这确实是可行的方法。
客户端代码使用一个模块,仅使用客户端依赖项(GIN with Guice 3),服务器端代码使用一个模块,仅使用服务器依赖项(OWLAPI with Guice 4);并让您的客户端模块将您的代码编译为 JS 并将它们打包为 WAR,您可以在服务器模块中将其用作 "overlay"(或者可能使用依赖于客户端和服务器的第三个模块如果你比较喜欢)。如果您有共享代码,请使用客户端和服务器模块都依赖的 third/fourth 共享模块;共享模块将调用 maven-source-plugin
的 jar-no-fork
目标,因此客户端模块可以依赖于共享源。
您可以在 https://github.com/tbroyer/gwt-maven-archetypes. They use my Maven Plugin for GWT 找到遵循此方法的原型,但早期版本(您必须克隆并 mvn install
项目然后从适当的提交中)依赖于 Mojo 的 GWT Maven 插件(我的插件在设计时考虑了多模块项目,并删除了以前使用 Mojo 插件时需要的很多 hack)。
物有所值。我花了几分钟 "ported" 来指导 4.0。幸运的是,这很容易。我对其进行了优化,否则代码库几乎没有任何变化。
我有一个具有以下依赖项的 GWT 项目
<dependency>
<groupId>com.google.gwt.inject</groupId>
<artifactId>gin</artifactId>
<version>2.1.2</version>
</dependency>
<dependency>
<groupId>net.sourceforge.owlapi</groupId>
<artifactId>owlapi-distribution</artifactId>
<version>4.0.2</version>
</dependency>
gin 2.1.2 依赖于 guice 3.0 而 owlapi 4.0.2 依赖于 guice 4.0-beta。
gin用在客户端,owlapi用在服务端
当我强制使用 guice 4.0-beta 时编译失败。由
java.lang.ClassNotFoundException: com.google.inject.internal.util.$Maps
引起
当我强制使用guice 3.0时编译成功,但在运行时因
java.lang.ClassNotFoundException: com.google.inject.internal.guava.collect.$ImmutableList
[=而失败13=]不能选择降级 owlapi 版本。
我有哪些选择才能完成这项工作?我能否以某种方式使用依赖范围,同时仍保留正常运行的 GWT DevMode?
对于我在依赖范围方面的 maven 经验来说,这是一个复杂的场景。
鉴于您得到的错误提到番石榴,您可能会幸运地强制使用最新的番石榴 - owlapi 应该适用于 17 或 18。
另一种选择可能是尝试使用 guice 4 重新编译 gin(并可能在上游贡献更改)。我不知道这有多难。您还必须确保您的快照与您的应用一起发布,并且您团队中可能需要它们的其他人可以访问。
将您的项目拆分为不同的模块。鉴于 Maven 的有限(设计)依赖范围选项,这确实是可行的方法。
客户端代码使用一个模块,仅使用客户端依赖项(GIN with Guice 3),服务器端代码使用一个模块,仅使用服务器依赖项(OWLAPI with Guice 4);并让您的客户端模块将您的代码编译为 JS 并将它们打包为 WAR,您可以在服务器模块中将其用作 "overlay"(或者可能使用依赖于客户端和服务器的第三个模块如果你比较喜欢)。如果您有共享代码,请使用客户端和服务器模块都依赖的 third/fourth 共享模块;共享模块将调用 maven-source-plugin
的 jar-no-fork
目标,因此客户端模块可以依赖于共享源。
您可以在 https://github.com/tbroyer/gwt-maven-archetypes. They use my Maven Plugin for GWT 找到遵循此方法的原型,但早期版本(您必须克隆并 mvn install
项目然后从适当的提交中)依赖于 Mojo 的 GWT Maven 插件(我的插件在设计时考虑了多模块项目,并删除了以前使用 Mojo 插件时需要的很多 hack)。
物有所值。我花了几分钟 "ported" 来指导 4.0。幸运的是,这很容易。我对其进行了优化,否则代码库几乎没有任何变化。