有选择地在JAR中包含依赖项

时间:2011-09-09 20:16:25

标签: scala maven jar packaging sbt

我有一个我在Scala中编写的库,它使用Bouncy Castle并且有很多依赖项。当我滚动一个罐子时,我可以滚动一个“胖”的罐子,其中所有依赖物(包括scala),重约19 MB,或者我可以滚动一个瘦小的罐子,它不会有依赖关系,但只有几百KB。

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

所以,我认为理想的情况是,如果有一些方法可以让Maven或SBT在jar中获得某些但不包含所有依赖项卷起。编译时需要一些依赖项,但运行时,例如Scala标准库。有没有办法让这种情况发生?

谢谢!

4 个答案:

答案 0 :(得分:7)

我会尝试https://github.com/nuttycom/sbt-proguard-plugin的sbt proguard插件。它应该能够清除未使用的类。

答案 1 :(得分:1)

覆盖maven ......

因为你声明你的项目依赖于你的maven pom中的弹性城堡,任何使用maven依赖你的图书馆的人都会默认将弹性城堡作为传递依赖

您应该在依赖项上设置适当的范围,例如编译编译和运行时所需的东西,测试仅在测试中需要的依赖项,并提供你希望由环境提供的东西。

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

例如,jar type packaging默认情况下不包含依赖项,而war将包括编译范围内的那些(但不包括测试或提供的)。这里的设计目标是让包装插件以最常见的方式运行而无需配置,但当然,maven中的封装插件可以配置为在需要时具有不同的行为。在apache maven网站上有很好地记录了打包的插件本身。

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

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

但是,如果可以的话,最好将其留给maven进行管理,以便使用您的库的项目可以决定他们是否需要您的依赖项或指定特定版本,从而为它们提供更大的灵活性。这是惯用法。

有关maven中依赖关系和范围的更多信息,请参阅Sonatype发布的reference guide

答案 2 :(得分:1)

我不是斯卡拉的家伙,但我已经在Java + Maven中组装了各种东西。

您是否尝试过为程序集插件创建自己的程序集描述符? https://maven.apache.org/plugins/maven-assembly-plugin/assembly.html

您可以复制/粘贴jar-with-dependencies描述符,然后只需向您的<添加一些排除项。 dependencySet>。我不是Maven专家,但您应该能够配置它,以便不同的配置文件启动不同的程序集构建。

编辑:Ack,没看到我的HTML被隐藏

答案 3 :(得分:1)

如果足以明确定义应添加哪些依赖项(一个工件级,即单个JAR),则可以定义程序集(如果是单个项目)或额外的装配项目(如果是多模块项目)。程序集描述符可以显式排除/包含依赖项中的工件。

Here是关于此主题的一些好文档(第8.5.4节),here是官方文档。

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