Как сжать библиотеку scala Swing с помощью Proguard?

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

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.final не помогло.


person Rogach    schedule 16.10.2011    source источник
comment
Вы можете попробовать опубликовать сообщение на форумах ProGuard: proguard.sourceforge.net/feedback.html.   -  person Nate C-K    schedule 16.10.2011


Ответы (1)


Похоже на ошибку в компиляторе 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.**
person Eric Lafortune    schedule 17.10.2011
comment
Да, это именно то, что я хотел. Спасибо! - person Rogach; 18.10.2011