1

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

本质上,我想使用插件将 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)编写我尝试执行的操作

4

2 回答 2

0

我有一个 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 可以在运行时从那里加载压缩的类。

于 2012-08-02T17:37:04.033 回答
0

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

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

proguardLibraryJars <++= (update) map (_.select(module = moduleFilter(name = "httpclient")))
于 2013-08-31T09:03:35.137 回答