如何告诉 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)因为我试图使用
运行输出 jarjava -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,如何增加堆空间?
从 dbus xml 生成文件时,如何告诉 qmake 包含标头?