当我的 injar jar 文件是通过 sbt assembly 命令从插件程序集中获得的胖 jar 时,我也遇到了同样的问题。
解决这个问题的方法不是使用 fat jar,而是使用 scala 生成的类,以及其他 java/scala 库来获取精简的 jar 文件。
在我的 mac (OS X 10.10) 上,我有这个 proguard 文件(名为 your.pro)。
-injar classes
-injar /usr/local/Cellar/scala/2.11.5/libexec/lib/scala-library.jar(!META-INF/MANIFEST.MF)
-outjar main.jar
-libraryjar /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Classes/classes.jar
-dontwarn
-dontnote
-ignorewarnings
-optimizationpasses 2
-optimizations !code/allocation/variable
-keep,allowoptimization,allowshrinking class * { *; }
-keepattributes SourceFile,LineNumberTable
-keepclasseswithmembers public class * { public static void main(java.lang.String[]); }
这是目录结构。
.
├── classes
│ ├── HelloWorld$.class
│ ├── HelloWorld$delayedInit$body.class
│ ├── HelloWorld.class
│ └── META-INF
│ └── MANIFEST.MF
├── src
│ └── hello.scala
└── your.pro
hello.scala如下:
object HelloWorld extends App
{
println("Hello, world")
}
您可以使用scalac src/hello.scala -d classes 获取classes 目录中的类文件。应添加 MANIFEST 文件以区分哪个是主类。小心最后一个空行。
Manifest-Version: 1.0
Main-Class: HelloWorld
... blank line should be here ...
类文件是从 scala 生成的。
使用proguard @your.pro,我可以获得工作 jar 文件。
我在https://dl.dropboxusercontent.com/u/10773282/share/2015/scala_class.zip上传了示例