2016-02-04 2 views
2

Я хотел бы задать вопрос относительно Maven Shade Plugin. Есть ли способ создать банку с классами из текущего проекта и затененной банкой, содержащей только внешние библиотеки?Затененная банка только с внешними библиотеками

Я перемещаю финальные артефакты по сети, и было бы здорово, если бы мне нужно было скопировать «тонкий» банку, если никакие внешние зависимости не изменились.

ответ

2

По умолчанию Maven уже генерирует тонкий сосуд, вы упомянули (то есть баночка обеспечения классов и ресурсы от вашего проекта) через Maven Jar Plugin и по умолчанию во время package фазы (то есть, вызывая mvn clean package, например, или mvn clean install, который в каскаде также вызовет фазу package).

Если вы хотите создать дополнительную банку, предоставляя только внешние библиотеки, по какой-либо причине вы можете использовать действительно Maven Shade Plugin. По умолчанию, однако, он также добавит ваши классы и ресурсы проекта.

Применение конфигурации ниже вы бы вместо того, чтобы инструктировать плагин только пакет внешних библиотек и пропустить классы проекта и ресурсы:

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-shade-plugin</artifactId> 
      <version>2.4.3</version> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
        <configuration> 
         <artifactSet> 
          <excludes> 
           <exclude>${project.groupId}:${project.artifactId}:*</exclude> 
          </excludes> 
         </artifactSet> 
         <finalName>${project.artifactId}-${project.version}-only-dependencies</finalName> 
         <shadedArtifactAttached>false</shadedArtifactAttached> 
         <createDependencyReducedPom>false</createDependencyReducedPom> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

Обратите внимание на exclude элемент, который эффективно пропуская контент проекта.

Кроме того, элемент finalName должен быть настроен для того, чтобы избежать использования механизма по умолчанию для плагина, который заменит исходную баночку по умолчанию (упомянутую выше) с помощью контейнера fat/uber (jar + dependencies).
По official documentation:

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

Бег mvn clean package вы будете иметь свой файл фляга по умолчанию и дополнительный файл банка только содержащий внешние зависимости и заканчивая суффиксом only-dependencies (перед банкой расширение).


Кроме того, вы можете рассмотреть возможность оборачивать всю конфигурацию выше в profile, чтобы избежать такого поведения, как часть сборки по умолчанию (рекомендуется).

Просто переместите конфигурацию выше в профиле оберточной следующим образом:

<profiles> 
    <profile> 
     <id>assemble-external-jars</id> 
     <build> 
      .... 
     </build> 
    </profile> 
</profiles> 

А затем запустить его (при необходимости) с помощью:

mvn clean package -Passemble-external-jars