Два дня назад мне задали этот вопрос:
«Брат Сонг, почему jar, упакованный моим проектом Spring Boot, всегда сообщает об ошибке class not found после того, как на него полагаются другие проекты?»
У всех такой вопрос, ибо не понятно чем отличается исполняемый jar от обычного jar? Сегодня брат Сун поговорит с вами по этому вопросу.
еще один плагин
JAR-файл, упакованный по умолчанию в Spring Boot, называется исполняемым JAR-файлом. Этот JAR-файл отличается от обычных JAR-файлов.java -jar xxx.jar
выполнение команды, нормальноеjar
В основном зависит от других приложений,Spring Boot
сделалjar
Он может выполняться, но от него не могут зависеть другие приложения.Даже если он принудительно зависит от него, классы внутри не могут быть получены. Но исполняемые jar-файлы не уникальны для Spring Boot, и сами Java-проекты могут быть упакованы в исполняемые jar-файлы.
У некоторых друзей могут возникнуть сомнения, так как реализация одинаковаmvn package
Команда для упаковки проекта, почему проект Spring Boot упакован как исполняемый jar-файл, а обычный проект упакован как неисполняемый jar-файл?
Поэтому мы должны упомянуть конфигурацию плагина по умолчанию в проекте Spring Boot.spring-boot-maven-plugin
, этот упакованный плагин имеет пять функций, что видно из команды плагина:
Пять функций:
- build-info: Создайте файл информации о сборке проекта build-info.properties.
- repackage: это цель по умолчанию, в
mvn package
После выполнения эта команда снова упаковывается для создания исполняемого jar-файла, и в то же времяmvn package
Сгенерированная банка переименовывается в*.origin
- run: это можно использовать для запуска приложений Spring Boot.
- НАЧАЛО: Это
mvn integration-test
этап, продолжениеSpring Boot
Управление жизненным циклом приложений - стоп: это в
mvn integration-test
этап, продолжениеSpring Boot
Управление жизненным циклом приложений
Эта функция по умолчанию является функцией переупаковки.Чтобы использовать другие функции, разработчику необходимо настроить ее явно.
Бэйл
Роль функции переупаковки состоит в том, чтобы сделать немного больше при упаковке:
- во-первых
mvn package
Команда Упаковать проект в одинjar
,этоjar
просто обычныйjar
, может зависеть от других проектов, но не может быть выполнен -
repackage
команда, упакованная в первый шагjar
Упакуйте его снова и сделайте исполняемым файломjar
, введя первый шаг вjar
переименован в*.original
документ
Например:
Упакуйте любой проект Spring Boot и выполнитеmvn package
команду или непосредственно вIDEA
средний щелчокpackage
,следующее :
После успешной упаковкиtarget
Файлы внутри следующие:
Здесь два файла, первыйrestful-0.0.1-SNAPSHOT.jar
Представляет упакованный исполняемый файлjar
,секундаrestful-0.0.1-SNAPSHOT.jar.original
Он был переименован в процессе упаковки.jar
, который является неисполняемымjar
, но может зависеть от других проектовjar
. Распаковав два файла, мы можем увидеть разницу между ними.
Сравнение двух банок
исполняемыйjar
После распаковки каталог выглядит следующим образом:
Как видите, в исполняемом jar-файле наш собственный код находится вBOOT-INF/classes/
каталог, кроме того, естьMETA-INF
каталог, в котором находитсяMANIFEST.MF
файл, откройте файл, содержание выглядит следующим образом:
Manifest-Version: 1.0
Implementation-Title: restful
Implementation-Version: 0.0.1-SNAPSHOT
Start-Class: org.javaboy.restful.RestfulApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Build-Jdk-Spec: 1.8
Spring-Boot-Version: 2.1.6.RELEASE
Created-By: Maven Archiver 3.4.0
Main-Class: org.springframework.boot.loader.JarLauncher
Как видите, здесь определяетсяStart-Class
, который является исполняемымjar
начальный класс,Spring-Boot-Classes
Представляет расположение нашего собственного скомпилированного кода,Spring-Boot-Lib
это означает, что проект зависит отjar
позиция.
Другими словами, если вы хотите запустить исполняемый файлjar
Для пакетов помимо добавления связанных зависимостей также необходимо настроитьMETA-INF/MANIFEST.MF
документ.
Это структура исполняемого jar-файла, а как насчет структуры неисполняемого jar-файла?
Сначала мы ставим суффикс по умолчанию.original
Удалите, затем переименуйте файл, переименование завершено и извлеките:
После распаковки видно, что он не исполняемыйjar
Корневой каталог эквивалентен нашемуclasspath
, после распаковки вы можете увидеть наш код напрямую, он также имеетMETA-INF/MANIFEST.MF
файл, но в нем не определены классы запуска и т. д.
Manifest-Version: 1.0
Implementation-Title: restful
Implementation-Version: 0.0.1-SNAPSHOT
Build-Jdk-Spec: 1.8
Created-By: Maven Archiver 3.4.0
Уведомление
это не может быть выполненоjar
Зависимости проекта также не упакованы.
Отсюда мы видим, что дваjar
, хотя обаjar
package, но внутренняя структура совершенно другая, поэтому один может выполняться напрямую, а другой может зависеть от других проектов.
Упаковка двух банок сразу
Вообще говоря, Spring Boot упакован непосредственно в исполняемый файл.jar
Все, не рекомендуется использовать Spring Boot как обычныйjar
Зависимость от других проектов. Если есть такая необходимость, рекомендуется выделить зависимую часть отдельно, чтобы сделать общийMaven
проект, а затем ссылайтесь на него в Spring BootMaven
проект.
Если вам нужно упаковать Spring Boot в общийjar
Технически возможно зависеть от других проектов, что даетspring-boot-maven-plugin
Добавьте в плагин следующую конфигурацию:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<classifier>exec</classifier>
</configuration>
</plugin>
</plugins>
</build>
настроенclassifier
означает исполняемый файлjar
имя, после настройки, после выполнения плагинаrepackage
команда, это не дастmvn package
сделалjar
Переименовали, поэтому упакованная баночка выглядит следующим образом:
Первый jar представляет собой jar-файл, от которого могут зависеть другие проекты, а второй jar-файл представляет собой исполняемый jar-файл.
Что ж, давайте поговорим о проблеме jar в Spring Boot, если у вас есть какие-либо вопросы, пожалуйста, оставьте сообщение для обсуждения.
Обратите внимание на общедоступную учетную запись [Jiangnan A Little Rain], сосредоточьтесь на технологиях с полным стеком, таких как Spring Boot + микросервисы и разделение интерфейса и сервера, делитесь регулярными видеоуроками, отвечайте на Java после того, как уделите внимание, и получайте Сухие товары Java тщательно приготовлены Songge для вас!