Как получить список файлов ресурсов в файле JAR [дубликат]

Невозможность связывания с соответствующими библиотеками / объектными файлами или компиляция файлов реализации

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

В разделе gcc вы должны указать все объектные файлы, которые должны быть связаны вместе в командной строке, или скомпилировать файлы реализации вместе.

g++ -o test objectFile1.o objectFile2.o -lLibraryName

Здесь libraryName - это просто имя библиотеки, без добавления к платформе. Так, например, в файлах библиотеки Linux обычно называют libfoo.so, но вы должны писать только -lfoo. В Windows этот же файл можно назвать foo.lib, но вы будете использовать тот же аргумент. Возможно, вам придется добавить каталог, в котором эти файлы можно найти, используя -L‹directory›. Обязательно не записывайте пробел после -l или -L.

Для XCode: добавьте пути поиска заголовка пользователя -> добавьте путь поиска библиотеки -> перетащите фактическую ссылку библиотеки в

В MSVS файлы, добавленные в проект, автоматически связывают их объектные файлы, и будет создан файл lib (в общем использовании). Чтобы использовать символы в отдельном проекте, вам нужно будет добавить файлы lib в параметры проекта. Это делается в разделе Linker свойств проекта в Input -> Additional Dependencies. (путь к файлу lib должен быть добавлен в Linker -> General -> Additional Library Directories). При использовании сторонней библиотеки, которая предоставляется с файлом lib, отказ в этом обычно приводит к ошибке.

Также может случиться так, что вы забудете добавить файл в компиляцию, и в этом случае объектный файл не будет сгенерирован. В gcc вы должны добавить файлы в командную строку. В MSVS добавление файла в проект заставит его скомпилировать его автоматически (хотя файлы могут, вручную, быть отдельно исключены из сборки).

В программировании Windows контрольный знак, который вы не связывали необходимая библиотека состоит в том, что имя неразрешенного символа начинается с __imp_. Посмотрите имя функции в документации, и она должна сказать, какую библиотеку вам нужно использовать. Например, MSDN помещает информацию в поле внизу каждой функции в разделе «Библиотека».

3
задан Growler 21 January 2014 в 04:29
поделиться

2 ответа

Нет, потому что classpath является динамическим в Java. Любой дополнительный Jar может вносить свой вклад в пакет, загрузчик классов может быть настолько динамичным, как можно вообразить, и даже динамически создавать классы или ресурсы по запросу.

Если у вас есть определенный JAR-файл, и вы знаете путь в этом JAR файл, вы можете просто обработать этот файл как архив и получить доступ к нему через java.util.jar.JarFile, который позволяет вам перечислить все записи в файле.

JarFile jar = new JarFile("res.jar");
Enumeration<JarEntry> entries = jar.entries();
while (entries.hasMoreElements()) {
    JarEntry entry = entries.nextElement();
    System.out.println(entry.getName());
}

Если вы хотите сделать это, не зная имя и путь JAR-файла (например, классом внутри самого JAR) вам нужно получить имя файла динамически, как предложил Евгений. просто используйте свое собственное имя класса (включая пакет, ваш скриншот выглядит так, как будто вы в пакете по умолчанию, это плохая идея).

2
ответ дан Hauke Ingmar Schmidt 1 September 2018 в 07:40
поделиться

Вы можете попробовать что-то вроде этого

Enumeration<URL> e = ClassLoader.getSystemResources("org/apache/log4j");
while (e.hasMoreElements()) {
   URL u = e.nextElement();
   String file = u.getFile();
...

file:/D:/.repository/log4j/log4j/1.2.14/log4j-1.2.14.jar!/org/apache/log4j

извлечь из него путь jar и использовать класс JarFile, чтобы узнать содержимое org / apache / log4j.

Если он распакован, вы получите прямой путь и используйте File.listFIles

0
ответ дан Evgeniy Dorofeev 1 September 2018 в 07:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: