sbt发布(或publishLocal)VS sbt程序集,以进行分发并解决依赖关系冲突

时间:2018-07-17 11:31:18

标签: maven cassandra sbt apache-flink maven-shade-plugin

最重要的是,我想分发一个可以使用SBTMaven进行集成的库,并且其依赖项不会与集成项目的依赖项或传递性依赖项冲突。

当前,我正在使用SBT命令通过publish分发我的库,该命令配置为将工件发布到我的私有JFrog Artifactory

在将库发布到artifactory的意义上,它可以正常工作,并且我可以轻松地将生成的库成功集成到SBTMaven的不同项目中

不幸的是,我的出版图书馆有第三方的依赖。它使用的是cassandra datastax library版的3.3.0

我遇到了一个令人讨厌的情况,我的库的使用者之一也依赖于另一个第三方库(不受我控制),该第三方库本身依赖于同一个cassandra驱动程序(flink-connector-cassandra,其POM可以在https://github.com/apache/flink/blob/master/flink-connectors/flink-connector-cassandra/pom.xml处找到,其casandra-driver版本为3.0.0

我尝试了各种排除组合,并更改了库的cassandra版本以匹配第三方版本(3.3.0〜>如{{1中将其更改为3.0.0 }})中的文件。{p>

不幸的是,由于flink-connector-cassandra库中未找到的类和方法,使用者在运行时崩溃。

我认为也许可以将我的库以“胖” SBT的形式发布,内联cassandra-driver依赖性(以及其自身的传递性第三方依赖性)并“挤压”要嵌套的名称空间为了避免冲突(即jar可以嵌套在{{1}下作为cassandra或类似的效果),希望可以解决与flink cassandra驱动程序的运行时冲突。

是否有使用com.cassandra.drivercom.myproject命令来避免这些冲突的实用解决方案?

我的图书馆的com.myproject.cassandra.driver如下所示(我正在发布的图书馆):

assembly

正在使用的SBT文件如下:

publish

我试图修改使用中的SBT以排除cassandra驱动程序,但它不起作用:

    lazy val commonSettings = Seq(
      scalaVersion := "2.11.8",
      sources in doc in Compile := List(),
      organization := "com.myLibrary.library",
      name := "commons",
      version := "0.4.1.1",
      publishTo := Some("Artifactory Realm" at "https://a.b.c.jfrog.io/myLibrary"),
      javacOptions ++= Seq("-source", "1.7", "-target", "1.7", "-Xlint")
    )

    lazy val myLibrary: Project = project.in(file("myLibrary"))
      .settings(
        commonSettings,
        name := "myLibrary",
        assemblyJarName in assembly := "myLibrary.jar",
        libraryDependencies ++= Seq(
          "com.datastax.cassandra" % "cassandra-driver-core" % "3.3.0" // << I've also tried to change this to match the flink's version of 3.0.0
// I've also tried to add
// classifier "shaded"
        )
      )

0 个答案:

没有答案