在 SBT 中将 unmanagedJars 添加到 proguardLibraryJars

Posted

技术标签:

【中文标题】在 SBT 中将 unmanagedJars 添加到 proguardLibraryJars【英文标题】:Adding unmanagedJars to proguardLibraryJars in SBT 【发布时间】:2012-07-23 11:37:07 【问题描述】:

我正在尝试将 sbt 与以下插件 https://github.com/siasia/xsbt-proguard-plugin 一起使用。到目前为止,我对插件没有任何问题,除了 proguard 将所有非托管 jar 放入最终的 min.jar 文件中(导致多个 jar 冲突的问题)。 Proguard 有 proguardLibraryJars 标志,允许您指定要排除的 jars

基本上我想使用插件将 TaskKey unamangedJars 中的所有 jar 添加到 proguardLibraryJars,即做这样的事情

lazy val proguard = proguardSettings ++ Seq(
    proguardOptions := Seq(
      keepMain("com.test.FacebookPostScheduler"),
      keepMain("org.postgresql.Driver")
    ),
    proguardLibraryJars <++= unmanagedClasspath

  )

问题是上面的代码在这一行显然不能编译

proguardLibraryJars <++= unmanagedClasspath

No implicit for Append.Values[Seq[java.io.File], sbt.Keys.Classpath] found

错误。

您将如何使用 Build.scala(不是 build.sbt)对我尝试使用最新 SBT (0.11.3-2) 执行的代码进行编码

【问题讨论】:

【参考方案1】:

我有一个 SBT 插件的公共存储库,它设法将 jar 传递给 proguard。它不使用 proguard 插件,但代码可能会帮助您了解如何收集依赖项。

https://github.com/tlazaro/xsbt-plugin-deployer/blob/master/src/main/scala/Deployer.scala

寻找:

private def getDepsJars(project: ProjectRef, bs: BuildStructure) = forAllProjects(project, bs) p =>
    artifactPath in Compile in packageBin in p get bs.data
  

这可能会给你一个开始的方法。它收集了您通常需要的所有需要​​的 jar,而不仅仅是非托管的。

或者,您可以只使用此插件并进行协作。代码有点草率,还没有打算发布。该插件还做了一些其他简洁的事情,例如使用 pack200 将所有内容压缩到一个 jar 中,并有一个自定义 ClassLoader 可以在运行时从那里加载压缩的类。

【讨论】:

【参考方案2】:

adamw/xsbt-proguard-plugin,它是 siasia/xsbt-proguard-plugin 的继任者似乎有这个选择:

默认情况下,Proguard 将被指示包含除 Java 运行时中的类以外的所有内容。要将其他库视为外部库(即将它们添加到传递给 Proguard 的 -libraryjars 列表中),请执行以下操作。下面是如何从库依赖项中选择一个名为“httpclient”的模块的示例:

proguardLibraryJars <++= (update) map (_.select(module = moduleFilter(name = "httpclient")))

【讨论】:

以上是关于在 SBT 中将 unmanagedJars 添加到 proguardLibraryJars的主要内容,如果未能解决你的问题,请参考以下文章

在 IntelliJ IDE 中将 Spark 与 Scala 项目集成时出错

将特定目录及其内容添加到通用目标

在 SBT 中添加 sbt native packager 插件

如何在 Windows 上从 Maven 和 SBT 获得彩色输出?

使用 SBT 和 Scala IDE 添加和删除依赖项

Scala sbt 添加国内镜像