【发布时间】:2014-07-25 18:51:00
【问题描述】:
是否可以在 Maven 存储库中声明同一依赖项的多个版本?
我同时需要这些依赖项:
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId>
<version>1.7.9-R0.2</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId>
<version>1.7.2-R0.3</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId>
<version>1.6.4-R2.0</version>
<scope>compile</scope>
</dependency>
因为它们每个都包含我关心的不同包:
org.bukkit.craftbukkit.v1_6_R3
org.bukkit.craftbukkit.v1_7_R1
org.bukkit.craftbukkit.v1_7_R3
如果我按照第一个sn-p的方式声明依赖,只有最后一个会生效。有没有办法在 Maven 中实现这一点?
@Edit 任何解决方法,也许?
【问题讨论】:
-
为什么需要这样做?如果 Maven 允许这种行为,您将拥有一个不可预测的类路径,其中包含相同类的多个副本。 Java 不会在运行时对类进行版本控制,这意味着 Maven 的限制是一件好事!
-
在我开始使用 Maven 之前,我曾经在类路径中包含多个版本的同一个库,我没有遇到任何问题。我需要它来提供对 Bukkit 的向后兼容性,它是我运行插件的 Minecraft 游戏服务器。
-
好吧,我猜你从来没有为 Bukkit 写过插件 :)
-
@wassup 这对我来说毫无意义,抱歉……如果我支持产品的多个版本,我会在我的源代码控制系统中使用不同的分支并分别构建每个版本。这样每个人都有自己独特的依赖版本集。关键是在运行时只有一个类的副本。如果您使用同一个 jar 的多个版本,您最终会遇到一个棘手的问题,即您并不真正知道 java 类加载器使用的是哪一个。这是 Maven 通过坚持一个版本来防止的问题。
-
你好 Mark - 我可以给你一个需要多个版本的用例。在我们公司,我们有一组在 Apache Servicemix 上运行的应用程序。 Servicemix 的有趣之处在于,所有内容都配置了功能文件,我们会调用需要安装的捆绑包。当 servicemix 启动时,它可以直接从 maven 存储库中提取这些捆绑包——这非常有效,直到我们进入不允许连接到我们公司的 maven 存储库的认证和生产环境。
标签: maven