#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. Да, это именно то, что я хотел. Спасибо!