2015-12-28 2 views
1

Мне нужно создать несколько пакетов для одного приложения, созданного Maven. Сначала я использовать -Denv для создания различных пакетов с аргументами Maven, и я использую ресурс для включения/исключения ресурсов:генерировать несколько артефактов в maven

<resources> 
    <resource> 
     <directory>src/main/resources</directory> 
     <includes> 
      <include>**/*.properties</include> 
      <include>**/${env}.ini></include> 
     </includes> 
     <filtering>true</filtering> 
    </resource> 
</resources> 

Тогда я могу использовать

mvn clean package -Denv=dev 
mvn clean package -Denv=prod1 
mvn clean package -Denv=prod2 
mvn clean package -Denv=prod3 
..... 

Однако, кажется, что различные пакеты имеют которые будут упакованы один за другим, что означает, что Maven потратит слишком много времени на сборку всех пакетов, поскольку для развертывания приложения у нас есть почти 22 разных среды.

Кроме того, каждый mvn .. package почти генерирует такой же результат, как классы, ресурсы, за исключением некоторых определенных ресурсов, таких как {$env}.ini. Я думаю, что это лишний раз запустить compile снова и снова.

Было бы лучше, если бы мы собираем все источники и ресурсы в целевой каталог, а затем генерировать различные пакеты соответственно, так что я думал, что maven-assembly-plugin, как правило, мы будем использовать его как это:

<plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
     <configuration> 
      <descriptors> 
       <descriptor>/src/main/assembly/env.xml</descriptor> 
       <descriptor>/src/main/assembly/prod1.xml</descriptor> 
       <descriptor>/src/main/assembly/prod2.xml</descriptor> 
       ...... 
      </descriptors> 
     </configuration> 
</plugin> 

Тогда мы должны создать 22 дескриптора, однако эти дескрипторы слишком похожи друг на друга, что означает, что слишком много повторной конфигурации, и это будет сложно, если я хочу внести некоторые общие изменения во все дескрипторы.

Итак, интересно, есть ли хорошая альтернатива для решения таких требований?

ответ

2

Вы можете использовать iterator-maven-plugin, чтобы решить эту проблему следующим образом:

<plugin> 
    <groupId>com.soebes.maven.plugins</groupId> 
    <artifactId>iterator-maven-plugin</artifactId> 
    <version>0.3</version> 
    <executions> 
     <execution> 
     <phase>package</phase> 
     <goals> 
      <goal>iterator</goal> 
     </goals> 
     <configuration> 
      <items> 
      <item>test</item> 
      <item>prod</item> 
      <item>dev</item> 
      </items> 
      <pluginExecutors> 
      <pluginExecutor> 
       <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-assembly-plugin</artifactId> 
       <version>2.6</version> 
       </plugin> 
       <goal>single</goal> 
       <configuration> 
       <descriptors> 
        <descriptor>${project.basedir}/@[email protected]</descriptor> 
       </descriptors> 
       </configuration> 
      </pluginExecutor> 
      </pluginExecutors> 
     </configuration> 
     </execution> 
    </executions> 
    </plugin> 

Если вы используете дескриптор вроде этого: ${project.basedir}/@[email protected] имя будет заменено на каждой итерации, так что вы можете иметь несколько дескрипторов .. . в вашем случае я предполагаю, что вы очень похожи дескрипторы поэтому у вас есть те же дескрипторы без заменителя, который содержит лишь незначительные различия, которые можно решить, как это в самом дескрипторе:

<assembly 
    xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd"> 

    <id>${item}</id> 
    <formats> 
    <format>war</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <dependencySets> 
    <dependencySet> 
     <unpack>true</unpack> 
     <useProjectArtifact>true</useProjectArtifact> 
    </dependencySet> 
    </dependencySets> 
    <fileSets> 
    <fileSet> 
     <outputDirectory>WEB-INF</outputDirectory> 
     <directory>${basedir}/src/main/environment/${item}/</directory> 
     <includes> 
     <include>**</include> 
     </includes> 
    </fileSet> 
    </fileSets> 
</assembly> 

как результат вам нужен только один дескриптор. Если у вас есть issues, пожалуйста, создайте запросы о проблемах.

+0

Этот плагин потрясающий! Благодаря.. – hguser

Смежные вопросы