最重要的是,我想分发一个可以使用SBT
或Maven
进行集成的库,并且其依赖项不会与集成项目的依赖项或传递性依赖项冲突。
当前,我正在使用SBT
命令通过publish
分发我的库,该命令配置为将工件发布到我的私有JFrog Artifactory
。
在将库发布到artifactory
的意义上,它可以正常工作,并且我可以轻松地将生成的库成功集成到SBT
和Maven
的不同项目中
不幸的是,我的出版图书馆有第三方的依赖。它使用的是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.driver
或com.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"
)
)