2014-12-31 3 views
3

Proguard 5.1 не работает во время фазы сжатия с «Ошибка: 4».
Файл конфигурации ProGuard выглядит следующим образом:Proguard с Scala - Ошибка 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$; 
} 

который в основном конфигурации Scala по умолчанию в документации.
ссылка для загрузки файла банки быть compreseed для воспроизведения: download

Что такое, что «Ошибка: 4», и как это можно исправить или избежать?

+0

Я тоже попал в эту проблему. Я новичок в Proguard – harschware

ответ

0

У меня также была такая же проблема, когда мой барабанный барабанный файл был толстым банком из сборки плагинов через команду sbt assembly. Решение этой проблемы заключается не в использовании толстой банки, а в использовании классов, созданных из 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. Файл 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

1

Другим решением может быть с помощью Gradle.

Это источник градиента для создания, получения жирного файла (файл shadowJar) и сжатия файла jar с помощью proguard.

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 поможет вам скомпилированные классы и банка файл, gradle shadowJar получит Вас большой файл банки, и gradle proguard даст вам облегченную .jar файл с именем main.jar.

Я также загрузил источник: https://dl.dropboxusercontent.com/u/10773282/share/2015/scala_all_jar.zip

1

Хотя ответы prosseek был полезным, я был в состоянии получить простой Hello-World конфигурацию 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.

У меня также была ошибка 4, когда версия библиотеки Scala, которую я передал в injar, была другой (патч) версией, чем версия Scala, с которой я ее скомпилировал.

Смежные вопросы