Maven различные причудливые сборки, также может набирать исполняемые пакеты Jar без SpringBoot

Java задняя часть
Maven различные причудливые сборки, также может набирать исполняемые пакеты Jar без SpringBoot

Это 9-й день моего участия в Gengwen Challenge, проверяйте подробности мероприятия:Обновить вызов

Ставь лайк и потом смотри, вырабатывай полезную привычку

Плагин упаковки Spring Boot очень классный, вы можете напрямую упаковать исходный код и все зависимости в пакет Jar.java -jarбегать. Так что, если вы хотите создать исполняемый пакет Jar для проекта, отличного от Spring Boot? ​

Не паникуйте, Maven — это старомодный инструмент сборки, и сделать это непросто! ​

Далее представлены некоторые другие подключаемые модули Maven, которые также могут напрямую упаковывать проект Maven в исполняемый пакет Jar (uber jar/исполняемый jar) с более мощными функциями и более богатыми сценариями приложений! ​

Чтобы узнать о происхождении названия этого uber jar/исполняемого jar, вы можете обратиться к моей предыдущей статье.Что такое Executable Jar/Uber Jar/Shade Jar/Shadow Jar/Fat Jar? 》

maven-dependency-plugin

maven-dependency-pluginЭто встроенный плагин Maven, как видно из названия, его функция заключается в работе с зависимостями. Есть много встроенных целей (целей), очень функциональных:

  • dependency:copydependency:copy-dependencies
  • dependency:unpack
  • dependency:unpack-dependencies
  • dependency:resolve
  • dependency:sources
  • dependency:resolve-plugins
  • dependency:go-offline
  • dependency:purge-local-repository
  • dependency:analyze
  • dependency:analyze-dep-mgt
  • dependency:analyze-report
  • dependency:tree
  • dependency:build-classpath
  • dependency:list-repositories
  • dependency:get

пройти черезunpack-dependenciesэта цельРазархивируйте зависимые пакеты/источники, вы можете выполнить универсальный метод упаковки:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-dependency-plugin</artifactId>
  <executions>

    <execution>
      <id>unpack-dependencies</id>
      <!-- 绑定到 prepare-package 阶段 -->
      <phase>prepare-package</phase>
      <goals>
        <goal>unpack-dependencies</goal>
      </goals>
      <configuration>
        <includeScope>runtime</includeScope>
        <outputDirectory>${project.build.outputDirectory}</outputDirectory>
      </configuration>
    </execution>
  </executions>
</plugin>

Этот метод распаковки «распаковывает» все зависимые пакеты (зависимости внутренних модулей и зависимости внешних модулей), то есть код (класс) зависимых пакетов будет скопирован в каталог outputDirectory, аналогично операции слияния, результат вот так:image.pngЗатем назначьте основной класс для Jar, чтобы сделать его исполняемым напрямую:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <configuration>
    <archive>
      <manifest>
        <mainClass>
          com.github.kongwu.mavenbuild.BuildExample
        </mainClass>
      </manifest>
    </archive>
  </configuration>
</plugin>

Конечно! Этот плагин может сделать больше, чем это... Посмотрите на приведенную выше команду, чтобы знать, что у нее много функций, и это лишь небольшая ее функция.

maven-shade-plugin

maven-shade-pluginЭто также встроенный плагин Maven, и вы также можете напрямую ввести исполняемый файл Jar. Как и эффект плагина зависимостей, это также режим «распаковки».Соедините классы всех зависимых пакетов вместе и настройте трансформатор и основной класс:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-shade-plugin</artifactId>
  <executions>
    <execution>
      <goals>
        <goal>shade</goal>
      </goals>
      <configuration>
        <shadedArtifactAttached>true</shadedArtifactAttached>
        <transformers>
          <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
            <mainClass>com.github.kongwu.mavenbuild.BuildExample</mainClass>
          </transformer>
        </transformers>
      </configuration>
    </execution>
  </executions>
</plugin>

Файл jar по умолчанию после сборки:${artifactId}-${version}-shaded.jar, если не нравится, тоже можно пройти<outputFile>Чтобы изменить выходной файл jar

Суть этого плагина в затенении, а эта «распаковка» — всего лишь базовая функция.

Вам не кажется странным название этого плагина?shadeЧто значит?

Машина затенения переведена в тень и затенение.Shade jar относится к упаковке пакета jar и его зависимых пакетов в файл jar и обеспечивает функцию «затенения/переименования» некоторых зависимых пакетов затенения.

оshadeДля подробного объяснения вы можете обратиться к моей другой статье«Теневая банка / Интерпретация теневой банки»

maven-assembly-plugin

Этот последнийmaven-assembly-pluginПлагин, он есть в mavenСамый сильный плагин для сборкиТеперь, хотя у него есть только одна полезная цель, он действительно очень, очень мощный: ​

  1. Подробные правила сборки можно настроить через отдельные файлы описания.
  2. Включить или исключить модуль/каталог/файл
  3. поддержка фильтра maven
  4. Набор кода для одновременной сборки нескольких пакетов bin с разными конфигурациями.
  5. Различные форматы пакетов сборки, такие как jar/zip/tar/gz и т. д.
  6. ...

Например, Zookeeper/Nacos/Arthas/Jenkins или популярный в последнее время pulsar и другое программное обеспечение, которое необходимо запускать независимо, многие из них созданы с помощью этого плагина.

Давайте сначала рассмотрим простой сценарий и создадим исполняемый пакет Jar:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-assembly-plugin</artifactId>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>single</goal>
      </goals>
      <configuration>
        <archive>
          <manifest>
            <mainClass>
              com.github.kongwu.mavenbuild.BuildExample
            </mainClass>
          </manifest>
        </archive>
        <descriptorRefs>
          <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
      </configuration>
    </execution>
  </executions>
</plugin>

Так же, как и два вышеуказанных плагина, все они «распакованы».${artifactId}-${version}-jar-with-dependencies.jar

С таким мощным плагином было бы слишком расточительно создавать только с ним uber jar.Если это просто сценарий простого uber jar, достаточно первых двух методов.

Так что этот плагин больше подходит для сложных нужд сборки, простыхuber jarДля сцены брать такой инструмент на уровне Гатлинга — пустая трата времени… ​

Давайте посмотрим, как это используется в Nacos:image.pngВ исходном коде Nacos есть отдельный модуль дистрибутива для сборки.С помощью плагина сборки + функция профиля можно легко собирать пакеты bin для различных окружений:

<!-- nacos distribution/pom.xml-->

<profile>
  <id>release-nacos</id>
  <dependencies>
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>nacos-console</artifactId>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
          <descriptors>
            <descriptor>release-nacos.xml</descriptor>
          </descriptors>
          <tarLongFileMode>posix</tarLongFileMode>
        </configuration>
        <executions>
          <execution>
            <id>make-assembly</id>
            <phase>install</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
    <finalName>nacos</finalName>
  </build>
</profile>

 <profile>
   <id>release-core</id>
   <dependencies>
     <dependency>
       <groupId>${project.groupId}</groupId>
       <artifactId>nacos-core</artifactId>
     </dependency>
   </dependencies>
   <build>
     <plugins>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-assembly-plugin</artifactId>
         <executions>
           <execution>
             <id>release-core</id>
             <goals>
               <goal>single</goal>
             </goals>
             <phase>package</phase>
             <configuration>
               <descriptors>
                 <descriptor>release-core.xml</descriptor>
               </descriptors>
               <appendAssemblyId>false</appendAssemblyId>
             </configuration>
           </execution>
         </executions>
       </plugin>
     </plugins>
     <finalName>nacos-core</finalName>
   </build>
</profile>

Метод построения Nacos также является более «мейнстримовым» методом.Если однажды вам понадобится создать независимый работающий пакет, я думаю, вы также будете использовать этот метод.

Суммировать

Полный код помещается вGitHub.com/null-/nameav…, заинтересованные друзья могут снять его и попробовать

Итак, представив способы создания uber-jar с помощью этих плагинов, давайте проведем сравнение:

dependency shade assembly
преимущество Цели богатые, и есть много других функций, кроме распаковки, таких как очистка/просмотр дерева зависимостей и т.д. Он предназначен для uber-jar и поддерживает функцию тени, если есть необходимость в перемещении, вы можете выбрать только его Самый мощный, конфигурация очень гибкая, но нет функции затемнения
недостаток В конце концов, это всего лишь плагин для работы с зависимостями, и его функция в построении относительно слаба. При сложных строительных требованиях функции будет несколько недостаточно Функция затемнения отсутствует, а конфигурация более сложная.
Сценарии применения Хорошо для простой функциональности uber-jar Лучше всего подходит для сборок супербанки, идеально подходит для тени Подходит для сборки в сложных сценариях, а не только в банках uber

3 плагина, описанные в этой статье, они строятuber jarМеханизм отличается от Spring Boot: ​

Плагин сборки Spring Boot поместит зависимые пакеты Jar вuber jarВнутри это способ «jars-in-a-jar» для загрузки пакета Jar в пакет Jar через его собственный ClassLoader; и несколько плагинов, описанных выше, не будут мешать mainClass и ClassLoader и не могут загрузить Jar. пакет в пакете Jar, так что все через метод «декомпрессии». ​

Обратите внимание, что плагины сборки Spring Boot доступны не только в проектах Spring Boot. Его основная функция по-прежнему заключается в сборке, просто замените класс запуска на Spring Boot, а затем загрузите его через собственный ClassLoader.

Итак, используйтеspring-boot-maven-pluginУпакуйте несколько проектов, отличных от Spring (Boot), в одинuber jarЭто также совершенно нормально, если версии JDK и Maven совпадают.

Ссылаться на

Для получения подробных сведений о функциях вышеуказанных плагинов вы можете обратиться к официальной документации следующих плагинов Документация Maven относительно подробная:

Бесплатные гарниры

Прилагается перерисованная диаграмма жизненного цикла Maven по умолчанию, которая относительно ясна, с указанием различных целей разных плагинов, соответствующих каждой фазе, при необходимости сохраните ее самостоятельно (исходное изображение немного больше, нажмите, чтобы просмотреть увеличенное изображение)maven_lifecycle (5) (1).png

Нелегко быть оригинальным, и несанкционированная перепечатка запрещена. Если моя статья полезна для вас, пожалуйста, поставьте лайк/добавьте в избранное/подпишитесь, чтобы поддержать и поддержать ее ❤❤❤❤❤❤