Изменение канонических имен классов в пакете

Немного предыстории (не имеет прямого отношения, поскольку мой вопрос довольно общий): я хочу использовать библиотеку Android ROME Feed Reader для анализа RSS-канала с мультимедийным контентом. Но ROME не поддерживает медиафайлы «из коробки», поэтому я хочу использовать медиа-плагин, который поставляется в виде отдельного JAR-файла и основан на исходной библиотеке.

Итак, у меня есть два JAR-файла (для которых у меня нет исходного кода), и мои зависимости gradle выглядят так:

dependencies {
  compile files('libs/android-rome-feed-reader-1.0.0.jar')
  compile files('libs/mediarss-0.2.3.jar')
}

Проблема в том, что имена пакетов из версии ROME для Android имеют префикс com.google.code.rome.android.repackaged. по отношению к исходной библиотеке.

Например, библиотека Android ROME содержит следующий интерфейс:

package com.google.code.rome.android.repackaged.com.sun.syndication.feed.module;
public interface Module { /* ... */ }

В то время как все классы в медиа-плагине ссылаются на оригинальные канонические имена:

public interface MediaModule extends com.sun.syndication.feed.module.Module { /* ... */ }

Вполне естественно, что компиляция не выполняется:

Error:(69, 34) error: cannot access Module
class file for com.sun.syndication.feed.module.Module not found

Есть ли обходной путь для этого? Можно ли как-то статически изменить канонические имена для всех классов в библиотеке? Или есть какое-то другое решение?

Спасибо!


person SqueezyMo    schedule 08.05.2015    source источник
comment
это ДЕЙСТВИТЕЛЬНО просто переупаковано?   -  person rmalchow    schedule 08.05.2015
comment
На странице проекта просто говорится, что Android ROME Feed Reader — это переупаковка ROME, чтобы она работала на устройствах Android. Я не уверен, что они подразумевают под этим и как одна только переупаковка может что-то изменить. Я думал, что это может быть что-то еще, но опять же, я не нашел источников. Если я не заставлю это работать, думаю, я прибегну к оригинальному ROME.   -  person SqueezyMo    schedule 09.05.2015


Ответы (1)


Ха, глупая проблема. Видел подобные вещи раньше. Самый простой вариант: ссылки Jar Jar.

Простой:

  • Создайте rules.txt в том же каталоге, что и jarjar.jar, со следующим:
  • rule com.google.rome.** com.foo.bar.@1
  • cd в каталог jarjar.jar
  • беги java -jar jarjar.jar rules.txt ~/path_to/old_jar ~/path_to/new_jar

Надо перепаковать все, чтобы ты не дурачился.

person VicVu    schedule 08.05.2015
comment
Да, это именно то, что я искал! Сработало как шарм, спасибо! Если кому-то это когда-нибудь понадобится, я использовал rule com.google.code.rome.android.repackaged.com.** com.@1 (исключение com. вызывает NPE) - person SqueezyMo; 09.05.2015