2013-09-17 4 views
1

Я запускаю приложение GUI (A.jar). Затем я добавляю плагин (B.jar) в этот графический интерфейс (A.jar). Теперь я хочу получить доступ к файлу manifest.mf в B.jar. Я попробовал B.class.getResourceAsInStream ("/ META-INF/MANIFEST.MF"). Тем не менее, я получил манифест.mf в A.jar, а не в B.jar.Как читать файл в другом файле jar?

Любой может дать мне несколько советов по этой проблеме? Спасибо.

+0

Как добавить плагин? Что такое B.class? – Marcelo

+0

Вы можете попробовать likethis: - public void readXmlFile() { JarFile jarFile = new JarFile (pathToJar2); JarEntry entry = jarFile.getJarEntry ("/ test.xml"); InputStream inputStream = jarFile.getInputStream (запись);} –

+0

Поскольку jar является zip, попробуйте разархивировать B.jar (или исключить необходимый файл) из запуска A.jar и прочитать, что вам нужно. –

ответ

2

Это тот случай, когда общий загрузчик классов будет идти по первому пути на пути к классу, и, очевидно, A.jar на первом месте перед B.jar.

String someUniqueResourceInBJar = "..."; 
URL url = B.class.getResource(someUniqueResourceInBJar); 
url = new URL(url.getPath().replaceFirst(someUniqueResourceInBJar + "$", "") 
    + "META-INF/MANIFEST.MF"; 
url.openStream(); 

URL-адрес будет что-то вроде "баночка: файл! //.../B.jar META-INF/MANIFEST.MF".


В качестве альтернативы получения класса URL:

URL url = b.class.getProtectionDomain().getCodeSource().getLocation(); 
+0

Я все еще пытаюсь обойти это. Если 'B' находится внутри пути к классу, то простой с использованием' getResource («META-INF/MANIFEST.MF») должен работать сам по себе, не нужно создавать новый 'URL', потому что URL-адрес становится неизвестным - нет никакой гарантии, что новый 'URL' на самом деле указывает на действительные ресурсы ... кроме того,' B # getResource' уже вернул бы действительную ссылку URL-адреса ... просто кажется мне непонятным ... – MadProgrammer

+0

@MadProgrammer Запутанная часть заключается в том, что загрузчик классов B пытается решить путь. Если путь является абсолютным, «/ ...», то все баночки рассматриваются, загружаются загрузчиком этого класса или его загрузчиками классов. С относительным путем «META-INF/...» это не произойдет, но B.class должен находиться в корне (без пакета). BTW 'getClassLoader(). GetResource' использует абсолютный путь и требует ** нет **'/'. –

+0

Большое спасибо, Joop. Ваше решение работает для моего дела. –

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