Java 如何使用Maven为不同的上游版本编译插件?
我正在为Spark编写一个数据源插件,它在2.X和3.X中有不同的API。我冒险重构了特定于版本的部分,最终得到了一棵树,如:Java 如何使用Maven为不同的上游版本编译插件?,java,maven,apache-spark,maven-central,Java,Maven,Apache Spark,Maven Central,我正在为Spark编写一个数据源插件,它在2.X和3.X中有不同的API。我冒险重构了特定于版本的部分,最终得到了一棵树,如: src/ main/ java/ app/ common/ # no dependency on spark spark/ # code compatible with both 2.X and 3.X adaptor_v24/ # 2.4 shim over classes in "common"
src/
main/
java/
app/
common/ # no dependency on spark
spark/ # code compatible with both 2.X and 3.X
adaptor_v24/ # 2.4 shim over classes in "common"
adaptor_v30/ # 3.0 shim over classes in "common"
以及具有spark24和spark30配置文件的POM,以选择合适的Spark deps,包括正确的适配器\u vXX
版本
现在我想将插件的两个版本发布到Maven Central,这样用户就可以获得Spark安装的正确版本。(将2.x插件加载到spark3的类路径中,反之亦然,会导致崩溃,因为没有合适的接口)。我认为正确的方法是发布一个不同的artifactId后缀,比如“app-spark2”/“app-spark3”,但是从我所看到的,Maven真的不希望你动态地修改artifactId,所以我在发布之前就直接针对POM做了一个sed
这是我对Maven所能做的最好的了吗,还是我缺少了一些可以让我自己处理这个问题的特性/插件?我知道,例如,sbt支持类似于针对多个Scala运行时构建/发布的功能,但这是我所知道的与我的问题最相似的功能。你是说像?@xerx593看起来我可以将不同的JAR上传到maven,但Spark无法加载它们,它将坐标解释为“1.0.1-SNAPSHOT-spark3”不是将组件拉出…等等,这是“部署端”,在使用/客户端/依赖端,您还将提供(基于概要文件/环境)
…
。。。“拉出组件”-我不确定还需要什么/程序集的详细信息,但分类器的一致使用会将“已分类的jar”(我假设jar来自默认依赖项。“type”(请参见上面的链接))带到(作用域)classpath抱歉,我的意思是拉出“分类器组件”-但无论如何,是的,这是在客户端,但用户不使用POM,他们给spark一个maven坐标,spark使用ivy解析器下载包(+DEP)。(参见spark.jars.packages at)。Spark不理解分类器,所以尝试使用多个分类器是行不通的