GWT(Maven)项目:依赖冲突

时间:2015-05-28 22:50:59

标签: maven gwt guice gin owl-api

我有一个具有以下依赖关系的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>
  • 杜松子酒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

  • 导致的运行时失败
  • 降级版本的owlapi不是一种选择。

我有什么选择才能使这项工作成功?我是否可以以某种方式使用依赖范围,同时仍保留正常运行的GWT DevMode?

3 个答案:

答案 0 :(得分:4)

在不同的模块中拆分您的项目。鉴于Maven的有限(按设计)依赖范围选项,这真的是要走的路。

使用一个模块用于客户端代码,仅使用客户端依赖项(GIN和Guice 3),一个模块用于服务器端代码,仅使用服务器依赖项(带有Guice 4的OWLAPI);并让您的客户端模块将您的代码编译为JS并将它们打包为WAR,您可以将其用作服务器模块中的“覆盖”(或者如果您愿意,可以使用依赖于客户端和服务器的第三个模块)。如果您有共享代码,请使用客户端和服务器模块都依赖的第三个/第四个共享模块;共享模块会调用maven-source-plugin的{​​{1}}目标,因此客户端模块可能依赖于共享源。

您可以在https://github.com/tbroyer/gwt-maven-archetypes找到遵循此方法的原型。他们使用我的Maven Plugin for GWT,但早期版本(你必须克隆并jar-no-fork项目,然后从适当的提交)依赖于Mojo的Maven Plugin for GWT(我的插件设计有多模块项目记住,并删除了以前使用Mojo插件时需要的大量黑客。)

答案 1 :(得分:1)

对于依赖性范围的maven体验,这是一个复杂的场景。

鉴于您提到番石榴的错误,您可能会很幸运地使用最新的番石榴 - owlapi应该使用17或18。

另一个选择可能是尝试用guice 4重新编译杜松子酒(并且可能在上游贡献变化)。我不知道这有多难。您还必须确保您的快照随应用程序一起发布,并且可供团队中可能需要它们的其他人访问。

答案 2 :(得分:0)

为了它的价值。我花了几分钟把它“移植”到guice 4.0。幸运的是,这很容易。我对它进行了编组,否则代码库几乎没有任何变化。

https://github.com/chinshaw/google-gin