在SBT中将未管理的Jars添加到proguardLibraryJars



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

从本质上讲,我想使用插件将TaskKey unahangedJars中的所有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)尝试执行的操作进行编码

我有一个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,这是您通常想要的,而不仅仅是未管理的jar。

或者,你可以使用这个插件,也许可以合作。代码有点草率,还没有打算发布。该插件还做了一些其他巧妙的事情,比如用pack200将所有东西压缩到一个jar中,并有一个自定义的ClassLoader在运行时从那里加载压缩的类。

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

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

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

最新更新