Как определить порядок выполнения с помощью maven-assembly-plugin

Я работаю над переносом проекта с Ant на Maven. Последний дистрибутив, который мне нужно доставить, — это zip-архив, содержащий исполняемый файл jar со всеми его зависимостями. Вот часть моего помпа:

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.2-beta-4</version>
                <configuration>
                    <finalName>ProjectDistribution</finalName>
                    <appendAssemblyId>false</appendAssemblyId>              
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>                            
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <mainClass>fullQualifiedNameToMainClass</mainClass>
                            <addClasspath>true</addClasspath>                               
                        </manifest>
                    </archive>
                    <descriptors>
                        <descriptor>${project.basedir}/src/main/assembly/dep.xml</descriptor>
                    </descriptors>                      
                </configuration>
                <executions>
                    <execution>
                        <id>jar-with-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>dist</id>
                        <phase>assembly</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>                        
                </executions>                                       
            </plugin>

А вот файл сборки:

<assembly>
<id>dist</id>
<formats>
    <format>zip</format>
</formats> 
<!-- 1st approach-->
<!--files>
    <file>
        <source>
            /target/ProjectDistribution.jar
        </source>
        <outputDirectory>/</outputDirectory>
    </file>
</files-->
<fileSets>
            <!-- 2nd approach-->        
    <!--fileSet>
        <directory>/target</directory>
        <outputDirectory></outputDirectory>
        <includes>      
            <include>*.jar</include>
        </includes>
    </fileSet-->
    <fileSet>
        <directory>/HelpFiles</directory>
        <outputDirectory></outputDirectory>
        <includes>
            <include>*.*</include>
        </includes>
    </fileSet>
</fileSets>

I run 1.- mvn compile, 2.- mvn package, and 3.- mvn assembly:single

Проблема, с которой я столкнулся, заключается в том, что

Он генерирует банку со всеми зависимостями и создает почтовый индекс, но не включает банку в почтовый индекс. Мне в значительной степени нужно выяснить, как заставить сборку сначала создать банку и дождаться ее создания (потому что ее размер составляет 5 МБ), а затем создать zip. Прямо сейчас 1-й и 2-й подходы - из файла сборки - закомментированы, однако я использовал оба, и ни один из них не работает.

Любая помощь будет оценена!

Эрик


person user1532449    schedule 17.07.2012    source источник


Ответы (2)


Чтобы это заработало, вам нужно разделить <configuration> и поместить его в два исполнения плагина:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-assembly-plugin</artifactId>
      <version>2.2-beta-4</version>
      <executions>
        <execution>
          <id>jar-with-dependencies</id>
          <phase>verify</phase>
          <goals>
            <goal>single</goal>
          </goals>
          <configuration>
            <finalName>ProjectDistribution</finalName>
            <appendAssemblyId>false</appendAssemblyId>
            <descriptorRefs>
              <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
            <archive>
              <manifest>
                <mainClass>fullQualifiedNameToMainClass</mainClass>
                <addClasspath>true</addClasspath>
              </manifest>
            </archive>
          </configuration>
        </execution>
        <execution>
          <id>dist</id>
          <phase>verify</phase>
          <goals>
            <goal>single</goal>
          </goals>
          <configuration>
            <descriptors>
              <descriptor>${project.basedir}/src/main/assembly/dep.xml</descriptor>
            </descriptors>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

Первое выполнение создаст файл jar. Второе выполнение возьмет этот JAR-файл и поместит его в ZIP-файл вместе с другими файлами. С этой конфигурацией вы можете просто выполнить mvn verify или mvn install для создания сборки.

Есть еще две вещи, которые следует учитывать:

  • Вы должны использовать фазу verify для сборки сборки, потому что дескриптор jar-with-dependencies включает в себя сам артефакт проекта. На этапе упаковки артефакт проекта не будет готов к упаковке.
  • Дескриптор jar-with-dependencies имеет очень ограниченные возможности для создания файла JAR со всеми зависимостями. Вместо этого следует использовать maven-shade-plugin.
person Stefan Ferstl    schedule 17.07.2012
comment
Я сожалею, но это все еще не работает. Я внес изменения, которые вы предлагаете, и когда я использую mvn verify или mvn install, ничего не создается. Когда я использую сборку mvn: single, отображается следующее сообщение об ошибке: Ошибка чтения сборок: дескрипторы сборки не найдены. Может ли быть так, что, поскольку обе конфигурации находятся внутри выполнения, maven не знает, с чего начать? Большое спасибо за вашу помощь! - person user1532449; 18.07.2012
comment
maven должен выполнять исполнения плагинов в том порядке, в котором они определены (при условии, что ‹фаза› одинакова в каждом исполнении). вы сделали настройку в ‹build›‹pluginManagement› или ‹build›‹plugins›? - person Stefan Ferstl; 18.07.2012
comment
Я уже пробовал maven-shade-plugin, но, похоже, он не работает. Он генерирует банку, но зависимостей там нет. Если бы вы могли посоветовать, как создать исполняемый файл jar со всеми его зависимостями с помощью плагина maven-shade, тогда я могу продолжить и просто использовать плагин сборки, чтобы заархивировать банку. Спасибо большое! - person user1532449; 18.07.2012
comment
Да, они находятся внутри следующей структуры.. ‹build› … ‹pluginManagement› … ‹plugins› .. ‹plugin› .. Я думаю, что сейчас лучше всего использовать maven-shade- плагин, который вы упомянули ... однако я не мог заставить его работать раньше ... не могли бы вы дать совет о том, что я спросил в предыдущем комментарии. Большое спасибо! - person user1532449; 18.07.2012
comment
Я думаю, проблема в <pluginManagement>. не могли бы вы попробовать поместить всю часть <plugin> в <build>...<plugins>...<plugin>? Что касается плагина maven-shade. Вы можете легко остаться с дескриптором jar-with-dependencies, если он вам подходит. Я просто хотел упомянуть об этом на тот случай, если у вас когда-то будет более сложный jar-файл для сборки (например, файл jar, содержащий файлы конфигурации, которые необходимо объединить с конфигурациями из других JAR-файлов) - person Stefan Ferstl; 18.07.2012
comment
ВОТ ЭТО ДА!! Это сработало! Вся проблема была вызвана тегом pluginManagement. Спасибо большое Стефан! - person user1532449; 18.07.2012

Вы смешиваете предопределенный jar-with-dependencies с пользовательским дескриптором zip. Обычно вам нужен один из них, а не оба.

Похоже, вам нужен zip-архив, содержащий артефакт вашего проекта вместе с его зависимостями. Для этого вам не нужно создавать файл jar-with-dependencies. Если, однако, вам нужен один исполняемый файл jar со всеми зависимостями в нем, то неясно, почему вам нужно снова заархивировать его.

person Raghuram    schedule 17.07.2012
comment
Мне нужно заархивировать его, потому что окончательный дистрибутив включает не только исполняемый файл jar, но также документы и руководства, связанные с лицензией. Моя первоначальная идея заключалась в том, чтобы использовать предопределенный jar-файл с зависимостями, который работает очень хорошо, и полученный jar-файл добавить его в zip-файл с помощью файла сборки. Имеет ли это смысл? Знаете ли вы более эффективный способ добиться этого? - person user1532449; 17.07.2012
comment
То, что вы говорите, имеет смысл. Прошу прощения, что не получилось с первого раза, я новичок в maven. Не могли бы вы посоветовать, как сгенерировать артефакт (исполняемый jar) со всеми его зависимостями? Большое спасибо! - person user1532449; 17.07.2012