当前位置: 首页 > 知识库问答 >
问题:

sbt-proGuard您必须指定缩水步骤的-保留选项

邢焱
2023-03-14

我正在努力让sbt proguard插件正常工作。我有一个类库,我想混淆,但我似乎无法得到插件输出没有上述错误。我已经指定了保留选项,或者至少我认为我已经指定了,但是我没有运气。我从Proguard网站上复制了keep选项,该网站说它是为类库设计的。此外,我认为插件没有响应我配置的选项。

例如,我希望有更详细的输出,看看输出是否能给我一个关于我做错了什么的线索。但是,每当我查看日志文件时,它总是指定默认选项。下面是我的配置。有人能帮我解决这个问题吗?我完全迷路了。谢谢

import sbt.Keys._
import com.typesafe.sbt.SbtProguard._

import ProguardKeys._


lazy val commonDependencies = Seq(
  Dependencies.Libraries.junit,
  Dependencies.Libraries.springBootLogging,
  Dependencies.Libraries.scalaMock,
  Dependencies.Libraries.joda,
  Dependencies.Libraries.scalaTestPlus,
  Dependencies.Libraries.scalaXml,
  Dependencies.Libraries.commonsCodec,
  Dependencies.Libraries.typeSafeConfig
)

val keepClasses =
  """
    |-injars       in.jar
    |-outjars      out.jar
    |-libraryjars  <java.home>/lib/rt.jar
    |-printmapping out.map
    |
    |-keepparameternames
    |-renamesourcefileattribute SourceFile
    |-keepattributes Exceptions,InnerClasses,Signature,Deprecated,
    |                SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
    |
    |-keep public class * {
    |    public protected *;
    |}
    |
    |-keepclassmembernames class * {
    |    java.lang.Class class$(java.lang.String);
    |    java.lang.Class class$(java.lang.String, boolean);
    |}
    |
    |-keepclasseswithmembernames,includedescriptorclasses class * {
    |    native <methods>;
    |}
    |
    |-keepclassmembers,allowoptimization enum * {
    |    public static **[] values();
    |    public static ** valueOf(java.lang.String);
    |}
    |
    |-keepclassmembers class * implements java.io.Serializable {
    |    static final long serialVersionUID;
    |    private static final java.io.ObjectStreamField[] serialPersistentFields;
    |    private void writeObject(java.io.ObjectOutputStream);
    |    private void readObject(java.io.ObjectInputStream);
    |    java.lang.Object writeReplace();
    |    java.lang.Object readResolve();
    |}
  """.stripMargin

proguardSettings

lazy val skedaddleCore = (project in file(".")).
  settings(BuildSettings.buildSettings: _*).
  settings(
    name := "core",
    resolvers := Resolvers.all,
    libraryDependencies ++= commonDependencies,
    merge in Proguard := true,
    proguardVersion in Proguard := "5.2.1",
    options in Proguard --= Seq("-dontnote", "-dontwarn", "-ignorewarnings"),
    options in Proguard ++= Seq("-verbose", "-dontshrink"),
    options in Proguard += keepClasses
  )

共有1个答案

华烈
2023-03-14

我终于得到了插件做我想要的以下配置。

import sbt.Keys._
import com.typesafe.sbt.SbtProguard._

lazy val commonDependencies = Seq(
  Dependencies.Libraries.junit,
  Dependencies.Libraries.springBootLogging,
  Dependencies.Libraries.scalaMock,
  Dependencies.Libraries.joda,
  Dependencies.Libraries.scalaTestPlus,
  Dependencies.Libraries.scalaXml,
  Dependencies.Libraries.commonsCodec,
  Dependencies.Libraries.typeSafeConfig
)

proguardSettings

ProguardKeys.proguardVersion in Proguard := "5.2.1"

ProguardKeys.options in Proguard ++= Seq("-dontnote", "-dontwarn", "-ignorewarnings")

ProguardKeys.inputs in Proguard <<= (dependencyClasspath in Compile) map { _.files }

ProguardKeys.filteredInputs in Proguard <++= (packageBin in Compile) map ProguardOptions.noFilter

val keepClasses =
  """
    |-keepparameternames
    |-keepattributes Exceptions,InnerClasses,Signature,Deprecated,
    |                SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
    |
    |-keep,includedescriptorclasses interface com.** {
    |    <methods>;
    |}
  """.stripMargin

ProguardKeys.options in Proguard += keepClasses

lazy val skedaddleCore = (project in file(".")).
  settings(BuildSettings.buildSettings: _*).
  settings(
    name := "core",
    resolvers := Resolvers.all,
    libraryDependencies ++= commonDependencies
  )
 类似资料:
  • 我是阿帕奇骆驼的新手。我正试图将头和请求体一起发送到Apache Camel中的路由。 我得到以下错误:

  • 问题内容: 您好,我正在编写一个Android应用程序,并且已经设置了Proguard来混淆我的应用程序。但是,我使用类加载器为应用程序动态加载了不同的扩展。问题在于,如果更改了它们的名称,它们将无法正确加载。如何防止Proguard混淆特定的类名? 问题答案: 使用proguard.cfg中的选项 请参阅手册 https://www.guardsquare.com/en/proguard/man

  • 我是Liquibase的新手,我尝试将liquibase与postgres数据库一起使用liquibase脚本创建数据库表。我所做的是,我已经手动创建了Postgres表并通过运行命令 mvn液化酶:generateChangeLog 我创建了liquibase-outputChangeLog.xml文件。现在我尝试更新该脚本并在数据库中创建一个表。为此,我将XML代码写入新表的ChangeLog

  • 问题内容: 我在proguard配置中添加了以下行: 但是现在proguard不会从结果中删除我的课程。我希望将其删除。 如何排除某个给定的班级? 谢谢 问题答案: 您可以使用以下规则:

  • 我试图用sbt proguard获得更小的标量可执行jar文件。我添加了项目/插件。sbt这两行代码: 第一个是获取uberjar文件,我可以使用来获取uberjar,这很好。 然后,我执行了来获取这个错误消息。 从这篇文章的提示:ProGuard说不支持的类版本号[52.0](最大51.0,Java1.7)与sbt-proGuard,我切换到Java1.7和Java1.6与导出JAVA_HOME

  • 我正在尝试用AWS SDK Core Ruby Gem删除上传的图像文件。 我有以下代码: 然而,我得到了以下错误: 您试图访问的存储桶必须使用指定的endpoint寻址。请将所有未来的请求发送到此终结点。 我知道该地区是正确的,因为如果我将其更改为,将显示以下错误: 指定的键不存在。 我到底做错了什么?