2014-12-31 158 views
3

Proguard 5.1在“Error:4”的收缩阶段失败。
Proguard的配置文件如下:Scala的Proguard - 错误4

-injars  ReversiRaw.jar 
-outjars  Reversi.jar 
-libraryjars <java.home>/lib/rt.jar 
-libraryjars <java.home>/lib/ext/jfxrt.jar 

-dontwarn scala.** 

-dontnote 
-dontwarn 
-ignorewarnings 

-keepclasseswithmembers public class * { 
    public static void main(java.lang.String[]); 
} 

-keepclassmembers class * { 
    ** MODULE$; 
} 

其中大部分是在文档中给出的默认配置斯卡拉。
正在播放的jar文件的下载链接:download

什么是“错误:4”,以及如何修复或避免?

+0

我也碰到过这个问题。我是Proguard的新手 – harschware

回答

0

当我的injar jar文件是来自插件程序集通过sbt assembly命令的胖罐子时,我也有同样的问题。 此问题的解决方案不是使用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") 
} 

你可以在classes目录中的类文件与scalac src/hello.scala -d classes。应该添加MANIFEST文件来告诉哪个是主类。小心最后的空白行。

Manifest-Version: 1.0 
Main-Class: HelloWorld 
... blank line should be here ... 

这个classes文件是从scala生成的。 与proguard @your.pro,我可以得到工作的jar文件。

我上传在https://dl.dropboxusercontent.com/u/10773282/share/2015/scala_class.zip

1

另一种解决方案可能使用的gradle的例子。

这是构建gradle源码,获取fat文件(shadowJar文件),并用proguard缩小jar文件。

buildscript { 
    repositories { 
     flatDir dirs: '/Users/smcho/Dropbox/smcho/bin/jar/proguard5.2/lib' 
     mavenCentral() 
     jcenter() 
    } 
    dependencies { 
     classpath ':proguard' 
     classpath 'com.github.jengelman.gradle.plugins:shadow:1.2.0' 
    } 
} 

apply plugin: 'scala' 
apply plugin: 'com.github.johnrengelman.shadow' 

repositories{ 
    mavenCentral() 
} 

shadowJar { 
    manifest { 
    attributes 'Main-Class': 'HelloWorld' 
    } 
} 

dependencies{ 
    compile "org.scala-lang:scala-library:2.11.5" 
} 

task proguard(type: proguard.gradle.ProGuardTask) { 
// injars './build/classes' 
    injars './build/libs/scala_all_jar-all.jar' 
    outjars './build/libs/main.jar' 
    libraryjars "${System.getProperty('java.home')}/lib/rt.jar" 

    dontwarn 
    dontnote 
    ignorewarnings 

    keepattributes 'SourceFile,LineNumberTable' 

    keepclasseswithmembers 'public class * { \ 
     public static void main(java.lang.String[]); \ 
    }' 
} 

您需要设置flatDir dirs指向您的proguard文件所在的位置。

gradle build将让你的编译类和jar文件,gradle shadowJar将让你大jar文件,并gradle proguard会给你一个名为main.jar的瘦身jar文件。

我还上传来源:https://dl.dropboxusercontent.com/u/10773282/share/2015/scala_all_jar.zip

1

虽然prosseek的答案是有帮助的,我能得到一个简单的Hello-世界proguard的配置,而不必诉诸类文件。 (不像prosseek,我没有尝试Uberjar,但)。

the Scala example in the Proguard manual适应,我有一个简单的*.pro会看起来像:

-injars  build/install/HelloScala/lib/helloscala-1.0.jar 
-injars  build/install/HelloScala/lib/scala-library-2.11.6.jar(!META-INF/MANIFEST.MF) 
-outjars  helloscalapro.jar 
-libraryjars <java.home>/lib/rt.jar 

-dontwarn scala.** 

//etc. 

过滤出来的清单,从Scala库。

当我传递给injar的Scala库的版本与我编译的Scala版本不同(补丁)版本时,我也得到了错误4。