Scala 在JAR中选择性地包含依赖项

Scala 在JAR中选择性地包含依赖项,scala,maven,jar,packaging,sbt,Scala,Maven,Jar,Packaging,Sbt,我有一个用Scala编写的库,它使用Bouncy Castle,并且有一大堆依赖项。当我滚动一个jar时,我可以滚动一个具有所有依赖项(包括scala)的“胖”jar,它的重量约为19mb,或者滚动一个没有依赖项但只有几百KB的瘦jar 问题是我需要在我的库中包含Bouncy Castle classes/jar,因为如果它在运行时不在类路径上,就会抛出各种异常 所以,我认为理想的情况是,如果有某种方法,我可以让Maven或SBT在滚动的jar中包含一些但不是所有的依赖项。某些依赖项在编译时需要

我有一个用Scala编写的库,它使用Bouncy Castle,并且有一大堆依赖项。当我滚动一个jar时,我可以滚动一个具有所有依赖项(包括scala)的“胖”jar,它的重量约为19mb,或者滚动一个没有依赖项但只有几百KB的瘦jar

问题是我需要在我的库中包含Bouncy Castle classes/jar,因为如果它在运行时不在类路径上,就会抛出各种异常

所以,我认为理想的情况是,如果有某种方法,我可以让Maven或SBT在滚动的jar中包含一些但不是所有的依赖项。某些依赖项在编译时需要,但在运行时不需要,例如Scala标准库。有什么办法可以实现吗

谢谢

覆盖maven

因为您在maven pom中声明项目依赖于bouncy castle,所以任何使用maven依赖您的库的人在默认情况下都会将bouncy castle作为可传递依赖项拉入

您应该为依赖项设置适当的范围,例如,编译和运行时需要的内容,测试测试中只需要的依赖项,以及为您希望由环境提供的内容提供的依赖项

库的依赖项在生成时是否打包到依赖项目中是一个如何配置这些项目的问题,设置范围将影响默认行为

例如,默认情况下不包括依赖项,而war将包括编译范围内的依赖项(但不包括测试或提供的依赖项)。这里的设计目标是让打包插件在不需要配置的情况下以最常见的方式运行,但是当然,如果需要,maven中的打包插件可以配置为具有不同的行为。在ApacheMaven站点上对进行打包的插件本身进行了详细的记录

如果您库的用户不太可能使用maven来构建他们的项目,那么可以选择使用shade插件,它将允许您生成一个“uber jar”,其中包含您希望的所有依赖项。您可以配置特定的包含或排除

这可能是一种有问题的交付方式,例如,当您的库包含依赖项时,哪个版本与使用它的项目的直接依赖项冲突,即它们使用的是您的库的不同版本

但是,如果可以的话,最好让maven来管理,这样使用库的项目就可以决定是否需要依赖项,或者指定特定的版本,从而提供更大的灵活性。这是惯用的方法


有关maven中依赖项和作用域的更多信息,请参阅Sonatype发布的。

我将从中试用sbt proguard插件。它应该能够清除未使用的类。

我不是scala爱好者,但我在Java+Maven中使用过组装东西

您是否尝试过为程序集插件创建自己的程序集描述符

您可以使用依赖项描述符复制/粘贴jar,然后只需将一些排除项添加到。我不是Maven专家,但您应该能够对其进行配置,以便不同的概要文件启动不同的组装构建


EDIT:Ack,没有看到我的HTML被隐藏

如果可以明确定义应该添加哪些依赖项(一个是工件级别,即单个JAR),则可以定义一个程序集(对于单个项目)或一个附加的程序集项目(对于多模块项目)。程序集描述符可以显式地从依赖项中排除/包括工件

是关于这个主题的一些好文件(第8.5.4节),是官方文件


请注意,您可以通过在dependecySets中使用通配符表示法来包括属于一个组的所有工件,例如,
hibernate:::jar
将包括属于hibernate组的所有jar文件。

+1
proguard
assembly
xml-hell相比看起来非常好。最重要的是,它将减少库的大小,而不是数量;scala库本身就有超过8个功能。有没有办法告诉pro guard不要包含scala库?不知道你想要什么。如果您已经编写了一个scala应用程序,那么您至少需要scala库的一些部分