Как да дефинирате реда на изпълнение с помощта на maven-assembly-plugin

Работя върху миграцията на проект от Ant към Maven. Окончателното разпространение, което трябва да доставя, е zip, съдържащ изпълним буркан с всичките му зависимости. Ето част от моя pom:

            <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

Проблемът, с който се занимавам е, че

Той генерира буркана с всички зависимости и генерира zip файла, но не включва буркана в zip файла. До голяма степен трябва да измисля начин да накарам сборката първо да генерира буркана и да изчака, докато бъде създаден (тъй като размерът му е 5 MB) и след това да създам 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, за да създадете сборката.

Трябва да имате предвид още две неща:

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

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