2012-07-03 2 views
0

Я хочу получить все пути jar, которые я могу найти .class файл в этих баночках. Я написал функцию для поиска всех банок в основной папке App, но столкнулся с проблемой - некоторые пакеты jar существуют, но устарели и не используются OSGi, например. xxxx_1.0.0.jar и xxxx_1.2.0.jar существуют, но OSGi используется только 1.2.0. Если я буду искать в основной папке, они будут в списке результатов.Как получить все пути jar, используемые OSGi?

Так есть способ получить все файлы jar, которые используются OSGi? Затем я могу отфильтровать файлы jar, которые не используются. Благодаря

Добавлено: Я пытался использовать этот способ, чтобы получить все Связки абсолютного URL, но не смог:

StringBuffer sb = new StringBuffer(); 
Bundle[] bundles = com.ibm.director.services.storage.debugtool.Activator.context.getBundles(); 
for (Bundle bundle : bundles) { 
    java.net.URL url = bundle.getClass().getProtectionDomain().getCodeSource().getLocation(); 
    sb.append("File:" + url.getFile() + ", Path:" + url.getPath() + "\n"); 
} 

Но сто раз следующий повторять вывод:

File:/opt/ibm/director/lwi/runtime/core/eclipse/plugins/org.eclipse.osgi_3.4.3.R34x_v20081215-1030-RCP20120203-1500.jar 
File:/opt/ibm/director/lwi/runtime/core/eclipse/plugins/org.eclipse.osgi_3.4.3.R34x_v20081215-1030-RCP20120203-1500.jar, 
File:.... 

Количество используемого пакета: 588, это может быть правильно, и мы можем получить абсолютный путь Bundles от API, но почему они все одинаковы? Как я могу получить реальный путь?

+0

Можете ли вы объяснить, чего вы хотите достичь? Что вы хотите искать в файлах классов и почему? –

+0

@Christian Schneider Я хочу декомпилировать runtime .class, имя которого вводится пользователем. Способ, которым я реализую, - собрать все банки в среде OSGi и serach этого класса. На самом деле оба xxx_1.2.0 и xxx_1.0.0 содержат этот файл, но используется только xxx_1.2.0. Я хочу только декомпилировать использованную. – JerryCai

+0

Я думаю, что я помню, у вас был подобный вопрос некоторое время назад. В OSGi одно и то же имя класса может поступать из разных наборов, и поэтому разные версии могут использоваться одновременно. Поэтому, если вы хотите знать источник класса, вам также нужно указать класс/класс загрузчика, который видит класс. Оттуда вы можете узнать из проводки пакета, из которой был загружен класс jar. –

ответ

3

BundleContext#getBundles() дает вам все связки. Затем вы можете сравнить символические имена и версии. Однако только потому, что у вас есть xxxx_1.0.0.jar и xxxx_1.2.0.jar, это не означает, что xxx_1.0.0.jar не используется. Могут быть некоторые другие пакеты, которые требуют xxx_1.0.0.jar. Точно так же, потому что пакет не запущен, это не значит, что он не будет запущен позже. Вы делаете не хотите переопределить распознаватель OSGi. Если вы хотите очистить репозиторий, я бы предложил вам использовать приложение, предоставленное поставщиком репозитория, например GC Application, в p2.

+0

Согласовано. Я предполагаю, что проблема, которую вы пытаетесь решить, либо уже решена, либо является неправильной проблемой. –

+0

@Philippe Marschall, вы можете проверить мою добавленную информацию и вопрос? Спасибо. – JerryCai

+0

Я вижу, что вы используете Equinox, в этом случае я рекомендую приложение для сборщика мусора [p2] (http://wiki.eclipse.org/Equinox/p2/FAQ) –

2

Мозговые пучки ... вобще bundle.getResource (clazz.getName() вместо ('/ ') +'.'. "Класс.")

Перед тем, как перекомпилировать, смотрите в комплекте: «OSGI-OPT/src /» + clazz.getName(). Replace ('.', '/') + ". Java", может существовать исходный код.

+0

Не только это более надежно, чем поиск всех банок для класса, который может существовать в нескольких версиях, он будет намного более эффективным. –

Смежные вопросы