如何告诉 sbt-proguard 包含 java *.jars?

Posted

技术标签:

【中文标题】如何告诉 sbt-proguard 包含 java *.jars?【英文标题】:How to tell sbt-proguard to include java *.jars? 【发布时间】:2011-11-19 18:42:36 【问题描述】:

我正在尝试通过 proguard plugin 为 sbt 10.* 创建单个可执行文件 *.jar。

一切似乎都还好,除了 sbt-proguard 不包括 java jars(在我的情况下 mysql-connector-java-5.1.10.jar)因为我试图使用

运行输出 jar

java -jar proguard-output.min.jar

我明白了

Exception in thread "main" java.lang.ClassNotFoundException: com.mysql.jdbc.Driver (虽然 sbt `run` 运行良好,所以 mysql 连接器肯定在项目中)。

我试图通过在 build.sbt 中显式添加 jar 来解决这个问题:

proguardInJars += Path.userHome / ".m2" / "repository" / "mysql" / "mysql-connector-java" / "5.1.10" / "mysql-connector-java-5.1.10.jar"

此外在 proguard 日志中:

...  
Preparing output jar  
...  
Copying resources from program jar [/home/kostya/.m2/repository/mysql/mysql-connector-java/5.1.10/mysql-connector-java-5.1.10.jar] (filtered) 
...

但我仍然遇到同样的异常。我做错了什么?

【问题讨论】:

【参考方案1】:

类是在输入中指定的,但代码只是通过自省的方式实例化它,ProGuard 无法知道。因此,您必须明确指定它必须保留在输出中。

参照。 ProGuard 手册 > 例子 > Processing database drivers

参照。 ProGuard 手册 > 疑难解答 > ClassNotFoundException

更安全的解决方案可能不是像 JDBC 驱动程序那样处理第三方 jar,而是将它们指定为库 jar。

【讨论】:

以上是关于如何告诉 sbt-proguard 包含 java *.jars?的主要内容,如果未能解决你的问题,请参考以下文章

SBT ProGuard 插件:OutOfMemoryError,如何增加堆空间?

灵魂拷问:如何检查Java数组中是否包含某个值 ?

从 dbus xml 生成文件时,如何告诉 qmake 包含标头?

如何告诉 UserManager.FindByNameAsync 包含关系?

如何告诉 g++ 编译器在哪里搜索包含文件?

使用 Proguard 在 dist 上混淆 Play 2 Web 应用程序?