在 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 插件