Как уменьшить библиотеку scala swing с помощью Proguard?

#java #scala #obfuscation #proguard

#java #scala #запутывание #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
  

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

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

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

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

ПРАВКА 2: использование Scala 2.9.1.final jars не помогло.

Комментарии:

1. Возможно, вы захотите попробовать опубликовать на форумах ProGuard: proguard.sourceforge.net/feedback.html

Ответ №1:

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

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

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

 ()Lscala/swing/ComboBox$selection$;
  

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

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

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

 -dontwarn scala.swing.**
  

Комментарии:

1. Да, это именно то, что я хотел. Спасибо!