sbt-proguard with play 2.2.3

问题描述 投票:0回答:2

我们使用 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"))

当我在 Play 控制台上说 dist 时,我不确定 proguard 是否正常工作,而在插件网站上他们说调用 proguard:proguard。当我在 Play 控制台上编写 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

有人成功使用这个插件和play框架吗?

playframework sbt proguard playframework-2.2
2个回答
2
投票

在尝试正确配置 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 - 任何需要保留其名称的包名称、类、方法或字段。您应该在网络应用程序中保留的常见内容:

    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 复制回其旧目录和名称,您可以压缩回您的项目,您就得到了一个混淆后的播放项目!

编辑:

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


0
投票

汤姆提供了很好的答案。我可能会稍微改进它,并使新版本的 Play Framework 和 Scala 3 变得现代(Scala 2 应该可以)。

  1. 您可以指定lib目录:
    -libraryjars target/universal/app-name-0.1.0-SNAPSHOT/lib
  2. 您可以指定保留带注释的类:
    -keep @javax.inject.Singleton class * { <init>(...); }
    -keep @javax.inject.Inject class * { <init>(...); }
    
  3. 您可以进行后处理,例如删除文档和 Scala 3 .tasty 文件:
name=your-app-name
version=0.1.0-SNAPSHOT
rm -rf share # remove docs
rm -rf bin # remove bin. You may run it via java -cp, see below
rm -rf logs # remove old logs
rm -f README.md # remove README
rm -f $name.$name-$version-sans-externalized.jar # remove old jar
zip -dq out.jar **.tasty # remove Scala 3 tasty files
zip -dq out.jar **.js # remove duplicated js files. You have them in assets jar
zip -dq out.jar **.html # remove duplicated html files. You have them in assets jar
java -Dconfig.file=conf/application.conf -Dlogback.configurationFile=conf/logback.xml -cp "conf/*:lib/*:out.jar" play.core.server.ProdServerStart # run

我的整个 proguard 文件:

-injars      target/universal/my-app-0.1.0-SNAPSHOT/my-app.my-app-0.1.0-SNAPSHOT-sans-externalized.jar
-outjars     target/universal/my-app-0.1.0-SNAPSHOT/out.jar
-libraryjars <java.home>/jmods/java.base.jmod(!**.jar;!module-info.class)
-libraryjars target/universal/my-app-0.1.0-SNAPSHOT/lib

-keep class !db.**,!log.**,!utils.**,** { *; }
-keep @javax.inject.Singleton class * { <init>(...); }
-keep @javax.inject.Inject class * { <init>(...); }

-dontwarn
-dontobfuscate
-dontoptimize
-dontnote
-ignorewarnings

您可能会注意到

-dontobfuscate
-dontoptimize
选项。您可以尝试避免它们,但由于 Play Framework 的魔力,这很难做到。

注意:proguard 文件中的 out.jar 名称应与 java cp 标志中的名称相同。

© www.soinside.com 2019 - 2024. All rights reserved.