Что такое meta inf
Что нужно знать про META-INF
Привет, Друзья! Файлы, содержащие подробную информацию по всем загрузчикам служб и классов, расширениям и конфигурации пакетов можно найти в каталогах метаданных Java Archive (сокращенно JAR). Он и получил название META-INF. Также в нем можно найти файлы необходимые для контроля безопасности и версий.
В действительности файлы Java Archive в формате ZIP, в которых есть вся сопутствующая информация и у них улучшена индексация. Когда информация пакуется в файл ZIP, нужно разместить ее так, чтобы содержимое было оформлено правильно. Применение каталога META-INF представляет собой попытку применить каталоги как пространство имен в ZIP файле. Благодаря этому появилась возможность сохранности информации, которая могла повлиять на обработку, в самом ZIP файле, не нарушая его упаковку.
Для чего нужен META-INF
Платформа Java, применяя в работе META-INF, может распознавать файлы таких типов:
Некоторые из библиотек Java применяют каталог META-INF как такой, где содержаться файлы конфигурации. Они вместе с JAR должны быть упакованы.
Обучение продвижению сайтов
Если вы хотите научиться выводить сайты в ТОП 10 поисковых систем Яндекс и Google, посетите мои онлайн-уроки по SEO-оптимизации (коротко о себе я рассказал в видео ниже). Все свои интернет-проекты я вывел на посещаемость более 1000 человек в сутки и могу научить этому Вас. В отличие от коллег я не продаю видео курсы, так как они не информативны, и просматривая их некому задавать вопросы. Я провожу обучение по скайпу индивидуально и во время урока отвечаю на все возникающие вопросы моих учеников. По времени SEO обучение длиться около 4 — 6 часов в зависимости от начальной подготовки ученика. Кому интересно обращайтесь!
На этом сегодня всё, всем удачи и до новых встреч!
Оставь отзыв и получи плюс к карме своего сайта:
Какова цель META-INF?
В Java вы часто видите папку META-INF, содержащую некоторые метафайлы. Какова цель этой папки и что я могу поместить туда?
Вообще говоря, вы не должны ничего помещать в META-INF самостоятельно. Вместо этого вы должны полагаться на все, что вы используете для упаковки вашего JAR. Это одна из областей, в которой Ant, на мой взгляд, действительно превосходит другие: указание атрибутов манифеста файла JAR. Это очень легко сказать что-то вроде:
Из официальной спецификации файла JAR (ссылка ведет на версию Java 7, но текст не изменился, по крайней мере, начиная с версии 1.3):
Каталог МЕТА-ИНФ
Следующие файлы / каталоги в каталоге META-INF распознаются и интерпретируются платформой Java 2 для настройки приложений, расширений, загрузчиков классов и служб:
Файл манифеста, который используется для определения данных расширения и пакета.
Файл подписи для файла JAR. «х» обозначает базовое имя файла.
Файл блока подписи, связанный с файлом сигнатуры с тем же базовым именем файла. В этом файле хранится цифровая подпись соответствующего файла подписи.
В этом каталоге хранятся все файлы конфигурации поставщика услуг.
Я заметил, что некоторые библиотеки Java начали использовать META-INF в качестве каталога для включения файлов конфигурации, которые должны быть упакованы и включены в CLASSPATH вместе с JAR-файлами. Например, Spring позволяет импортировать XML-файлы, находящиеся в пути к классам, используя:
Когда я размышляю над этим решением, я не знаю, что именно было бы неправильно при простом включении файлов конфигурации в конкретный пакет Java, а не в META-INF. Но, похоже, это де-факто новый стандарт; или это, или появляющийся антипаттерн 🙂
Вы также можете разместить статические ресурсы там.
и получить их в web3.0-контейнере через
Файл /META-INF/MANIFEST.MF имеет особое значение:
МЕТА-ИНФ в Maven
Просто добавьте к информации здесь, в случае файла WAR, файл META-INF / MANIFEST.MF предоставляет разработчику возможность инициировать проверку времени развертывания контейнером, которая гарантирует, что контейнер может найти все классы вашего приложения. зависит от. Это гарантирует, что в случае, если вы пропустили JAR, вам не нужно ждать, пока ваше приложение сработает во время выполнения, чтобы понять, что оно отсутствует.
Я недавно думал об этой проблеме. Кажется, на самом деле нет никаких ограничений на использование META-INF. Конечно, существуют определенные ограничения относительно необходимости размещения там манифеста, но, похоже, нет никаких запретов на размещение других вещей там.
Дело CXF может быть законным. Вот еще одно место, где этот нестандартный рекомендуется обойти неприятную ошибку в JBoss-ws, которая препятствует проверке на стороне сервера по схеме wsdl.
Но на самом деле, кажется, нет никаких стандартов, никаких проблем. Обычно эти вещи очень строго определены, но по некоторым причинам, кажется, здесь нет стандартов. Странный. Кажется, что META-INF стал популярным местом для любой необходимой конфигурации, которая не может быть легко обработана другим способом.
Думайте об этом как о другом корне. С Enumerator ClassLoader#getSystemResources(String path) точки зрения метода и других:
Когда данный путь начинается с «META-INF», метод выполняет поиск ресурсов, которые вложены в папки META-INF всех jar-файлов в пути класса.
Когда данный путь не начинается с «META-INF», метод ищет ресурсы во всех других папках (кроме META-INF) всех jar-файлов и каталогов в пути к классам.
Если вы знаете о другом имени папки, которое getSystemResources метод обрабатывает специально, прокомментируйте это.
Если вы используете JPA1, вам, возможно, придется добавить persistence.xml туда файл, в котором указано имя единицы сохраняемости, которую вы, возможно, захотите использовать. Модуль постоянства предоставляет удобный способ задания набора файлов метаданных, а также классов и jar-файлов, которые содержат все классы, которые необходимо сохранить в группе.
Все ответы верны. Мета-инфо имеет много целей. Кроме того, вот пример использования контейнера Tomcat.
Перейдите в Tomcat Doc и проверьте атрибут « Стандартная реализация> copyXML ».
Создание самодостаточных исполняемых JAR
Когда ваше программное приложение выходит за пределы десятка строк кода, вам, вероятно, следует разделить код на несколько классов. На этом этапе встает вопрос о том, как их распределить. В Java классическим форматом является Java-архив, более известный как JAR. Но реальные программы, вероятно, зависят от других JAR.
Что такое самодостаточный JAR?
У MainClass метод static main(String… args)
Работа с classpath
Новые проблемы возникают при дистрибуции JAR, которые зависят от других JAR:
Вам необходимо синхронизировать версии библиотек.
3. По этой причине вам необходимо поместить JAR в то же место, относительное или абсолютное, в целевую файловую систему в соответствии с манифестом. Это означает, что сначала нужно открыть JAR и прочитать манифест.
Одним из способов решения этих проблем является создание уникальной единицы развертывания, которая содержит классы из всех JAR и может быть распространена как один артефакт. Существует несколько вариантов создания таких JAR:
Плагин Spring Boot (Для проектов Spring Boot)
Плагин Apache Assembly
Assembly Plugin для Apache Maven позволяет разработчикам объединять результаты проекта в единый распространяемый архив, который также содержит зависимости, модули, документацию сайта и другие файлы.
Одним из принципов Maven является создание одного артефакта на проект. Хотя бывают исключения, например, Javadoc и исходный код, но в целом, если вам нужно несколько артефактов, нужно создавать один проект на каждый артефакт. Идея плагина Assembly заключается в том, чтобы обойти это правило.
Ссылайтесь на предварительно определенную самодостаточную конфигурацию JAR
Установите главный класс для исполнения
Привяжите к package после формирование исходного JAR
Запуск mvn package дает два артефакта:
Первый JAR имеет то же содержимое, что и тот, который был бы создан без плагина. Второй — это самодостаточный JAR. Вы можете выполнить его следующим образом:
В зависимости от проекта он может выполняться успешно. или нет. Например, в примере проекта Spring Boot он не работает со следующим сообщением:
Зачастую плагин следует стратегии «побеждает последний записавший». Порядок основывается на имени JAR.
С помощью Assembly вы можете нек. Если вам нужно объединить ресурсы, вы, вероятно, захотите использовать плагин Apache Shade.
Плагин Apache Shade
Плагин Assembly является общим; плагин Shade ориентирован исключительно на задачу создания самодостаточных JAR.
Этот плагин предоставляет возможность упаковать артефакт в uber-jar, включая его зависимости, и оттенить — т.е. переименовать — пакеты некоторых зависимостей.
Плагин основан на концепции преобразователей: каждый преобразователь отвечает за работу с одним типом ресурсов. Преобразователь может копировать ресурс как есть, добавлять статическое содержимое, объединять его с другими и т.д.
Хотя вы можете разработать свой преобразователь, плагин предоставляет набор готовых преобразователей:
Конфигурация плагина Shade к приведенному выше Assembly выглядит следующим образом:
shade привязан к фазе package по умолчанию
Этот преобразователь предназначен для генерации файлов манифеста
Выполните ввод Main-Class
Настройте финальный JAR так, чтобы он был многорелизным JAR. Это необходимо в случае, когда любой из исходных JAR является многорелизным JAR
Запуск mvn package дает два артефакта:
При работе с проектом, взятым за образец, финальный исполняемый файл все еще не работает так, как ожидалось. Действительно, во время сборки появляется множество предупреждений о дублировании ресурсов. Два из них мешают корректной работе проекта. Чтобы правильно их объединить, нам нужно посмотреть на их формат:
META-INF/org/apache/logging/log4j/core/config/plugins/Log4j2Plugins.dat: этот Log4J2 файл содержит предварительно скомпилированные данные плагина Log4J2. Он закодирован в двоичном формате, и ни один из готовых преобразователей не может объединить такие файлы. Тем не менее, случайный поиск показывает, что кто-то уже занимался этой проблемой и выпустил преобразователь для работы с объединением.
META-INF/spring.factories : эти файлы, специфичные для Spring, они имеют формат «один ключ/много значений». Поскольку они текстовые, ни один готовый преобразователь не может корректно объединить их. Однако разработчики Spring предоставляют такую возможность (и многое другое) в своем плагине.
Чтобы настроить эти преобразователи, нам нужно добавить вышеуказанные библиотеки в качестве зависимостей к плагину Shade:
Объедините файлы /META-INF/spring.factories
Добавьте необходимый код для преобразователей
Эта конфигурация работает! Тем не менее, есть оставшиеся предупреждения:
Лицензии, предупреждения и схожие файлы
Файлы конфигурации Service Loader
Вы можете добавить и настроить дополнительные преобразователи для устранения вышеупомянутых пунктов. В целом, весь процесс требует глубокого понимания каждого вида ресурсов и знаний от том, как с ними работать.
Плагин Spring Boot
Плагин Spring Boot использует совершенно другой подход. Он не объединяет ресурсы из JAR по отдельности; он добавляет зависимые JAR по мере их появления в uber JAR. Для загрузки классов и ресурсов он предоставляет специальный механизм. Очевидно, что он предназначен для проектов Spring Boot.
Настройка плагина Spring Boot проста:
Давайте проверим структуру финального JAR:
Скомпилированные классы проекта
Загрузка классов в Spring Boot
Вот выдержка из манифеста по образцу проекта:
Как вы можете видеть, главный класс является специфичным классом Spring Boot, в то время как «настоящий» главный класс упоминается в другой записи.
Для получения дополнительной информации о структуре JAR, пожалуйста, ознакомьтесь со справочной документацией.
Заключение
В этой статье мы описали 3 различных способа создания самодостаточных исполняемых JAR:
Assembly хорошо подходит для простых проектов
Когда проект становится более сложным и вам нужно работать с дублирующимися файлами, используйте Shade
Наконец, для проектов Spring Boot лучше всего использовать специальный плагин.
Полный исходный код этой статьи можно найти на Github в формате Maven.
Материалы для дополнительного изучения:
Что такое «хороший код» — это во многом спорная тема. Кто-то скажет, что если код работает, значит он достаточно хорош. Кто-то обязательно добавит, что код должен быть легок в понимании и сопровождении. А кто-то добавит, что код еще обязательно должен быть быстрым. Об этом уже много написано и сказано. Что же, давайте еще раз поговорим на эту интересную и холиварную тему. Регистрируйтесь на онлайн-интенсив
Какова цель META-INF?
В Java вы часто видите папку META-INF, содержащую некоторые метафайлы. Какова цель этой папки и что я могу там поместить?
ОТВЕТЫ
Ответ 1
Вообще говоря, вы не должны вкладывать ничего в META-INF самостоятельно. Вместо этого вы должны полагаться на все, что вы используете для упаковки вашего JAR. Это одна из областей, где, по моему мнению, Ant действительно превосходит: указание атрибутов манифеста JAR файла. Очень легко сказать что-то вроде:
Дело в том, что META-INF следует рассматривать как внутренний метакаталог Java. Не связывайтесь с этим! Любые файлы, которые вы хотите включить в JAR, должны быть помещены в какой-либо другой подкаталог или в корень самого JAR.
Ответ 2
Из официальная спецификация файла JAR (ссылка идет на версию Java 7, но текст не изменился с по крайней мере v1.3 ):
Каталог META-INF
Следующие файлы/каталоги в каталоге META-INF распознаются и интерпретируются платформой Java 2 для настройки приложений, расширений, загрузчиков классов и служб:
Файл манифеста, который используется для определения данных, связанных с расширением и пакетом.
Файл подписи для JAR файла. «x» обозначает имя базового файла.
Файл блока подписи, связанный с файлом подписи с тем же именем базового файла. Этот файл хранит цифровую подпись соответствующего файла сигнатуры.
В этом каталоге хранятся все файлы конфигурации поставщика услуг.
Ответ 3
Я заметил, что некоторые библиотеки Java начали использовать META-INF в качестве каталога, в который будут включены файлы конфигурации, которые должны быть упакованы и включены в CLASSPATH вместе с JAR. Например, Spring позволяет импортировать файлы XML, которые находятся в пути к классам, используя:
В этом примере я цитирую прямо из Apache CXF User Guide. В проекте, над которым я работал, в котором нам нужно было разрешить несколько уровней конфигурации через Spring, мы выполнили это соглашение и поместили наши файлы конфигурации в META-INF.
Ответ 4
Папка META-INF является папкой для файла MANIFEST.MF. Этот файл содержит метаданные о содержимом JAR. Например, есть запись с именем Main-Class, которая задает имя класса Java со статическим main() для исполняемых файлов JAR.
Ответ 5
Вы также можете разместить статические ресурсы там.
и получить их в контейнере web3.0 через
Файл /META-INF/MANIFEST.MF имеет специальное значение:
Ответ 6
Чтобы добавить к информации здесь, в случае файла WAR файл META-INF/MANIFEST.MF предоставляет разработчику возможность инициировать проверку времени развертывания контейнером, который гарантирует, что контейнер может найти все от вашего приложения зависит ваше приложение. Это гарантирует, что в случае, если вы пропустили JAR, вам не нужно ждать, пока ваше приложение не ударит во время выполнения, чтобы понять, что он отсутствует.
Ответ 7
Я думал об этой проблеме недавно. Кажется, на самом деле нет никаких ограничений на использование META-INF. Конечно, существуют определенные ограничения относительно необходимости размещения там манифеста, но, похоже, нет никаких запретов на размещение других вещей там.
Дело CXF может быть законным. Вот еще одно место, где этот нестандартный рекомендуется для обхода неприятной ошибки в JBoss-ws, которая препятствует проверке на стороне сервера по схеме wsdl.
Но на самом деле, кажется, нет никаких стандартов, никаких проблем. Обычно эти вещи очень строго определены, но по некоторым причинам, кажется, здесь нет стандартов. Странно. Кажется, что META-INF стал популярным местом для любой необходимой конфигурации, которая не может быть легко обработана другим способом.
Ответ 8
META-INF в Maven
Ответ 9
Думайте об этом как о другом корне. С точки зрения метода Enumerator ClassLoader#getSystemResources(String path) и других:
Когда заданный путь начинается с «META-INF», метод ищет ресурсы, вложенные в папки META-INF всех jar файлов в пути к классам.
Если указанный путь не начинается с «META-INF», метод выполняет поиск ресурсов во всех других папках (за исключением META-INF) всех jar файлов и каталогов в пути к классам.
Ответ 10
Ответ 11
Все ответы верны. Meta-inf имеет множество целей. Кроме того, здесь приведен пример использования контейнера tomcat.
Перейдите к Tomcat Doc и проверьте » Стандартная реализация > copyXML«.
Для чего предназначена папка META-INF
Каталог мета-информации или же как многие привыкли его называть «папки META-INF» непосредственно содержит в себе информацию об игре, зашифрованную в цифровом коде. Именно этот момент является очень примечательным для данного каталога мета-информации, ведь то, что его нужно непременно удалять или же заменять, является обязательным действием для всех крафтеров. Причиной такому действию, является то, что если данный каталог не удалить, то при проверки контрольных сумм – цифрового сертификата: CODESIGN.RSA, CODESIGN.SF и MANIFEST.MF может возникнуть конфликт с Java.
В противном же случае, если вы все сделали правильно, то игра будет работает на все 100% полноценно и не позволит Java создавать различные диалоги безопасности, которые не дадут запускаться игровому клиенту. Отсюда следует, что при смене каких – либо внутриигровых файлов, вся контрольная сумма сертификата изменяется и он в итоге превращается в недействительный, что приводит к неработоспособности всей игровой системы Java, на которой написана игра Minecraft, а при удаление папки META-INF, удаляется и сертификат, что позволяет запускаться игровому клиенту Майнкрафт без внутренних конфликтов.
Папка META-INF при установки различных дополнений для игры Майнкрафт является одной из самых важных и необходимых, а все потому, что только благодаря правильному ее «использованию» мод, а порой и весь игровой клиент будет работать на 100% правильно, в противном же случае игра может вообще не запуститься. Стоит отметить, что папка META-INF присутствует во всех установках модов и лишь за редчайшими исключениями ее может не быть. Ее основной задачей является «вспомогательное действие», которое помогает правильно установиться тому игровому Minecraft дополнению, которое вы устанавливаете. Обычно весь процесс установки выглядит так:
Надеемся, теперь вам стало понятно почему так важно удалять папку META-INF и какую основную функцию она несет.