【问题标题】:sbt-proguard with play 2.2.3sbt-proguard with play 2.2.3
【发布时间】:2014-07-10 07:06:50
【问题描述】:

我们使用 play 2.2.3 开发了一个 Web 应用程序,并希望对其进行混淆处理。我正在尝试使用sbt-proguard 插件。我将下面的行放入 PROJECT_FOLDER/project/plugins.sbt 文件

addSbtPlugin("com.typesafe.sbt" % "sbt-proguard" % "0.2.2")

并将下面的行放入 PROJECT_FOLDER/build.sbt 文件

proguardSettings

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

ProguardKeys.options in Proguard += ProguardOptions.keepMain("Application")

inConfig(Proguard)(javaOptions in ProguardKeys.proguard := Seq("-Xmx2g"))

当我在游戏控制台和插件网站上说 dist 时,我不确定 proguard 是否正常工作,他们说调用 proguard:proguard。当我在游戏控制台上写 proguard:proguard 时,Play 给出如下所示的错误

[info] Reading program jar [/Users/kamil/DEVELOPMENT/play-2.2.3/repository/local/net.sf.ehcache/ehcache-core/2.6.6/jars/ehcache-core.jar] (filtered)
[info] Reading program jar [/Users/kamil/DEVELOPMENT/play-2.2.3/repository/cache/org.json/json/jars/json-20140107.jar] (filtered)
[info] Reading library jar [/Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Home/jre/lib/jce.jar]
[info] Reading library jar [/Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Home/jre/lib/rt.jar]
[error] Error: The output jar is empty. Did you specify the proper '-keep' options?
[trace] Stack trace suppressed: run last proguard:proguard for the full output.
[error] (proguard:proguard) Proguard failed with exit code [1]
[error] Total time: 35 s, completed 10.Tem.2014 09:45:23

有没有人成功使用这个插件和播放框架?

【问题讨论】:

    标签: playframework sbt proguard playframework-2.2


    【解决方案1】:

    在尝试使 sbt-proguard 正确配置后,我放弃了,并在构建项目后使用了 proguard。

    我没有将混淆作为构建部分包含在内,而是打开了activator dist 生成的 zip 文件,对 jar 进行了混淆并将其返回到同名的 lib 文件夹中。操作方法如下:

    Proguard 可以独立运行。您只需从 sourceforge 下载 tar 文件并使用 配置文件 运行 jar,例如:

    java -jar /path/to/proguard/lib/proguard.jar @CONF_FILE
    

    现在对于配置文件,您需要指定:

    1. injar - 被混淆的 jar -
      解压 dist 创建的 zip 文件后,cd 进入 lib 文件,找到 jar 名称 YOUR_PROJECT.VERSION-sans-externalized.jar 这是你需要混淆的 jar。
    2. outjar - 混淆 jar 的路径(输出)。在该过程结束时,只需将此 jar 复制回 lib 目录并将其重命名为 in jar 的名称。

    3. keep - 任何需要保留其名称的包名、类、方法或字段。您应该在 webapp 中保留的常见内容:

      3.1。控制器方法名称。

      3.2。 play 使用并在 application.conf 中指定的任何类,例如 ErrorHandler、ApplicationLoader

      3.3。所有路由器生成的类

    4. 库 - 包括 lib 文件中的所有库,您自己的 jar 除外。

    所以你的 conf.pro 文件应该是这样的:

    -injars /path/to/jar/project-version-sans-externalized.jar(!META-INF)
    -outjars /path/to/obfuscated/jar.jar
    
    
    -keepnames class com.example.ErrorHandler
    -keepnames class com.example.ApplicationLoader    
    
    -keepnames class controllers.**
    -keepclassmembernames class controllers.** {
        <methods>;    
    }
    
    -keeppackagenames controllers.**, router.**, views.**
    -keep class router.** {*;}
    -keepnames class router.** {*;}
    -keepclassmembers class router.** {*;}
    -keep class views.** {*;}
    -keepnames class views.** {*;}
    -keepclassmembers class views.** {*;}
    -libraryjars /usr/lib/jvm/latest/jre/lib/rt.jar
    -libraryjars /path/to/lib/library1.jar
    -libraryjars /path/to/lib/library2.jar
    

    在完成混淆并将输出​​ jar 复制回其旧目录和名称后,您可以将项目压缩回来,您就有了一个经过混淆处理的 play 项目!

    编辑:

    我真的建议您查看proguard manual。它有许多针对不同项目设置和框架的示例。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-18
    • 2014-09-29
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    • 2021-10-04
    相关资源
    最近更新 更多