Как уменьшить библиотеку Scala Swing с помощью Proguard? - PullRequest
12 голосов
/ 16 октября 2011

Я пытался сжать и запутать свою программу Scala / Java с помощью Proguard. Пока я использовал только scala-library.jar, все было нормально, но когда я добавляю scala-swing.jar в мои jar-файлы, я получаю следующее:

Warning: scala.swing.ComboBox: can't find referenced class scala.swing.ComboBox$selection
Warning: scala.swing.ListView: can't find referenced class scala.swing.ListView$selection
Warning: scala.swing.ListView$selection$: can't find referenced class scala.swing.ListView$selection$indices
Warning: scala.swing.ListView$selection$: can't find referenced class scala.swing.ListView$selection$items
Warning: scala.swing.ListView$selection$$anon$7: can't find referenced class scala.swing.ListView$selection
Warning: scala.swing.ListView$selection$Indices: can't find referenced class scala.swing.ListView$selection
Warning: scala.swing.ListView$selection$indices$: can't find referenced class scala.swing.ListView$selection$indices
Warning: scala.swing.ListView$selection$indices$: can't find referenced class scala.swing.ListView$selection$indices
Warning: scala.swing.ListView$selection$indices$: can't find referenced class scala.swing.ListView$selection
Warning: scala.swing.ListView$selection$items$: can't find referenced class scala.swing.ListView$selection

Если я загляну в банку, то вижу, что таких файлов действительно нет - вместо scala.swing.ComboBox$selection.class есть scala.swing.ComboBox$selection$.class. Переименование вручную не помогает, а затем жалуется, что файл содержит класс с другим именем.

Итак, это незаконные ссылки в scala-swing.jar? Или ошибка в Proguard?

Можете ли вы предложить обходной путь?

РЕДАКТИРОВАТЬ: я использую Scala 2.9.0.1 и Proguard 4.6

EDIT2: Использование Scala 2.9.1. Финальные банки не помогли.

1 Ответ

4 голосов
/ 18 октября 2011

Это похоже на ошибку в компиляторе scala.Например, файл класса scala / swing / ComboBox.class содержит следующий метод:

public final scala.swing.ComboBox$selection$ selection()

Внутренне сигнатура метода представляется следующим образом:

()Lscala/swing/ComboBox$selection$;

Это выглядит нормально.Тем не менее, метод также имеет атрибут Signature для отслеживания стертых обобщений:

()Lscala/swing/ComboBox<TA;>.selection;

Как видите, в конце подписи отсутствует символ $.В ProGuard вы можете обойти эту проблему, указав

-dontwarn scala.swing.**
...