我有两个版本的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或自定义类加载器,但我对这两个领域的知识非常有限,所以我们非常感谢任何帮助。
答案 0 :(得分:0)
<强>的Maven 强>
Maven是一个构建工具,因此它在运行时无法帮助您。可以激活different profiles based on the used JDK,但它基于构建它的系统,而不是运行它的系统。
<强> OSGI 强>
我还没有使用过OSGI,但我所知道的是它非常different deployment and runtime model。这样做并不合理,只是为了防止您的客户部署错误的版本。
部署过程
并非一切都应该通过技术解决方案来解决。部署错误的工件肯定应该通过调整的部署过程来解决。想想..
答案 1 :(得分:0)
这是一个古老的问题,但在当今模块化的JDK世界中,应该得到一个现代的答案。
我在原始问题中真正想要的是拥有一个JAR,该JAR可以执行不同的实现,可以在运行时选择它,具体取决于我所运行的Java版本。我以为Maven可以做到这一点,因为没有其他可用的选择。在模块化世界中,这正是 Multi-Release-Jars 解决的问题。
如果Java版本不是问题,但是必须根据系统属性,应用程序状态或其他条件使用两种实现,则可以将它们打包为服务实现,并将它们都添加到模块路径中,客户端中的用户通过ServiceLoader
加载它们,并确定在运行时需要哪种实现。