Maven - 在运行时选择工件

时间:2013-12-09 15:24:36

标签: java maven runtime dependency-management

我有两个版本的2个Maven工件,比如A1,A2,B1,B2。 B1取决于A1,B2取决于A2。 A1和A2非常相似,假设A1使用Java 7而A2使用Java 8和lambdas。 所有工件都由我们的客户使用,有时他们会为他们的环境安装错误的工件。

我想构建一个基础A工件,A1和A2将继承A并添加自定义功能和另一个工件,A_Client,我想根据某些属性(JDK和其他一些)选择runtime应使用Ax模块。这样,我们的客户将不得不安装A_Client,他们不必担心正确的版本。

B1和B2是相同的,唯一不同的是它们的Ax依赖性。如果我能以某种方式合并A1和A2,我将只有一个B工件可用于仅依赖于A_Client的客户端。这样我就可以消除B版本的地狱。

所以,问题是: 是否可以在runtime确定依赖关系?我的猜测是可能使用OSGi或自定义类加载器,但我对这两个领域的知识非常有限,所以我们非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

<强>的Maven

Maven是一个构建工具,因此它在运行时无法帮助您。可以激活different profiles based on the used JDK,但它基于构建它的系统,而不是运行它的系统。

<强> OSGI

我还没有使用过OSGI,但我所知道的是它非常different deployment and runtime model。这样做并不合理,只是为了防止您的客户部署错误的版本。

部署过程

并非一切都应该通过技术解决方案来解决。部署错误的工件肯定应该通过调整的部署过程来解决。想想..

  • Why他们是否部署了错误的工件?
  • 他们是否有记录在案的部署流程?应该如何改变这个过程?
  • 你能让这些文物更加明显吗?你可以重命名吗?
  • 你能快速失败吗?它应该无法部署,而不是在它已经在使用时。

答案 1 :(得分:0)

这是一个古老的问题,但在当今模块化的JDK世界中,应该得到一个现代的答案。

我在原始问题中真正想要的是拥有一个JAR,该JAR可以执行不同的实现,可以在运行时选择它,具体取决于我所运行的Java版本。我以为Maven可以做到这一点,因为没有其他可用的选择。在模块化世界中,这正是 Multi-Release-Jars 解决的问题。

如果Java版本不是问题,但是必须根据系统属性,应用程序状态或其他条件使用两种实现,则可以将它们打包为服务实现,并将它们都添加到模块路径中,客户端中的用户通过ServiceLoader加载它们,并确定在运行时需要哪种实现。