2010-03-28 8 views
3

У меня есть этот многомодульный проект.Выполнение скрипта из maven внутри проекта с несколькими модулями

В начале каждой сборки я хотел бы запустить некоторый файл bat.

Так я сделал следующее:

<profile> 
      <id>deploy-db</id> 
      <build> 
       <plugins> 
<plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>exec-maven-plugin</artifactId> 
      <version>1.1.1</version> 
     </plugin> 
       </plugins> 
       <pluginManagement> 
        <plugins> 
         <plugin> 
          <groupId>org.codehaus.mojo</groupId> 
          <artifactId>exec-maven-plugin</artifactId> 
          <version>1.1.1</version> 
          <executions> 
           <execution> 
            <phase>validate</phase> 
            <goals> 
             <goal>exec</goal> 
            </goals> 
            <inherited>false</inherited> 
           </execution> 
          </executions> 
          <configuration> 
           <executable>../database/schemas/import_databases.bat</executable> 
          </configuration> 
         </plugin> 
        </plugins> 
       </pluginManagement> 
      </build> 
     </profile> 

, когда я бегу mvn verify -Pdeploy-db от корня я получаю этот скрипт выполняется снова и снова в каждом из моих модулей.

Я хочу, чтобы он выполнялся только один раз, в корневом модуле.

Что мне там не хватает?

Благодаря

+1

Это «хороший» вопрос. Проблема здесь в том, что ** эффекты ** профиля наследуются, и плагин maven exec получает, таким образом, также исполняемый для всех детей. Нужно копать это (но я боюсь, что не будет чистого решения). –

+0

Нет, действительно, я люблю Maven, это замечательно в его идее (например, коммунизм :-)). Но когда дело доходит до простых вещей, подобных этому, он абсолютно терпит неудачу .... Кажется, мне придется написать собственный плагин, чтобы сделать это чистым. – Roman

ответ

1

Я могу ошибаться, но при добавлении плагина в разделе <pluginManagement> каждый подмодуль наследует его и «работает» его.

Я думаю, что вы должны переместить вам exec-maven-plugin и его <execution> в нормальный раздел <plugins>.

+1

Это не совсем правильно. PluginManagment настраивает только плагин. Не сообщая ему ничего о применении. Короче говоря, это не работает ... – Roman

+0

, когда вы добавляете раздел выполнения - что-то говорит о его вызове ... – Yaneeve

+1

@Roman, запустите 'mvn help: effective-pom' из подмодулей, чтобы посмотреть, что наследуется/что применяется, а что нет –

0

Итак, проблема заключается в том, что вы пытаетесь сделать что-то в родительском POM. Это не то, как родительские помы разработаны в maven (т. Е. Не «путь maven»). Вы должны выполнять действия только в «листовом узле», родители - только для агрегации и совместного использования, которые должны быть повторно использованы для каждого ребенка.

Таким образом, простой ответ на вызов сценария - анализ зависимостей между вашими детьми, чтобы определить, что должно произойти первым (и навязать зависимость, если это необходимо для обеспечения соблюдения), а затем добавить плагин к этому ребенку. Если по какой-то причине он плохо подходит для этого ребенка, вы можете сделать другого ребенка, который просто выполняет это действие.

На боковой ноте никогда не ссылайтесь на относительные пути к файлам в maven. Вы используете «../database/schemas/import_databases.bat». Если import_databases.bat не находится внутри каталога проекта, то при условии, что он находится в родительском каталоге, запрашивается беспорядок. Вместо этого вы должны использовать что-то вроде «$ {basedir} /src/main/scripts/import_databases.bat»