Запуск ant из модуля maven, содержащего другие модули

У меня есть структура каталогов, подобная следующей:

root/ui/
root/ui/pom.xml
root/ui/build.xml
root/ui/_idea/{files that I want copied are here}
root/ui/ssui/pom.xml (An inner module)

В моем файле POM я пытаюсь вызвать файл ant, используя

<tasks>
    <ant antfile="build.xml" target="copyIntelliJFiles"/>
</tasks>

И мой build.xml содержит

<project name="ui-parent" default="copyIntelliJFiles" basedir=".">
    <target name="copyIntelliJFiles">
         <copy todir="." overwrite="true">
            <fileset dir="_idea"/>
        </copy>
    </target>
</project>

Однако, когда я запускаю mvn install из /root/ui, я получаю следующую ошибку:

[ОШИБКА] Не удалось выполнить цель org.apache.maven.plugins:maven-antrun-plugin:1.6:run (create-intellij-project-files) в проекте ssui-parent: произошло исключение Ant BuildException: произошла следующая ошибка при выполнение этой строки: [ОШИБКА] java.io.FileNotFoundException: /root/ui/ssui/build.xml (Нет такого файла или каталога) [ОШИБКА] -> [Справка 1]

Кажется, он запускается из /root/ui/ssui, а не из pom.xml.

Отладка завершена

  • Если я изменю свой pom.xml на ../build.xml, сообщение об ошибке станет таким: java.io.FileNotFoundException: /root/build.xml (No such file or directory)

  • Если я удалю определение подмодуля в /root/ui/pom.xml, то путь распознается правильно (но мне нужны подмодули)

  • Если я изменю ссылку build.xml на ${basedir}/build.xml, я получу ту же ошибку: java.io.FileNotFoundException: /root/ui/ssui/build.xml, и это также сработает, если я удалю подмодуль

  • Попробовал решение в свойстве Maven2, которое указывает родительский каталог, создав Свойство ui.rootdir как в ui/pom.xml (как ${basedir}), так и в ui/ssui/pom.xml (как ${basedir}/..) и ссылается на ${ui.rootdir}/build.xml из ui/pom.xml. Та же ошибка.

Любые предложения приветствуются, но я не могу изменить структуру своих каталогов, за исключением того, где находится копируемая папка. Я просмотрел Использование maven ${basedir} в многомодульной настройке. но не понял, как это решит мою проблему.

Я создал ZIP-файл, иллюстрирующий проблему. Если вы запустите mvn install, вы заметите, что ошибка возникает внутри подмодуля, хотя он отлично работает в модуле верхнего уровня (и копирует файл в мою папку)


person Juan Mendes    schedule 23.12.2015    source источник
comment
comment
@Rao Это то же самое поведение, что и без ${basedir}, я обновил раздел отладки, чтобы он содержал эту информацию. Если у меня нет подмодулей, то работают оба способа.   -  person Juan Mendes    schedule 23.12.2015
comment
@Rao Спасибо, но в вашем примере не определен внутренний модуль. Проблема возникает только тогда, когда у вас есть субмодуль. См. If I remove the sub-module definition in /root/ui/pom.xml, then the path is recognized correctly (but I need the submodules)   -  person Juan Mendes    schedule 23.12.2015
comment
Не могли бы вы обновить мой файл, чтобы воспроизвести проблему, и загрузить его снова?   -  person Rao    schedule 23.12.2015


Ответы (1)


Следующее решение сработало для меня. Маловероятно, что его можно применить к другим, поскольку он зависит от переменной среды (которая уже требуется для нашей сборки).

В root/ui/pom.xml я добавил

  <properties>
      <ui.basedir>${env.VCLOUD_SRC_ROOT}/ui</ui.basedir>
  </properties>

   ...
   <target>
     <copy todir="${ui.basedir}" overwrite="true">
       <fileset dir="${ui.basedir}/_idea"/>
     </copy>
     <replace file="${ui.basedir}/.idea/libraries/swfaddress_2_3.xml" token="$LOCAL_REPO$" value="${local.repo}" />
   </target>
person Juan Mendes    schedule 23.12.2015
comment
Вы можете просто заменить элемент ‹task› на <tasks> <subant target="sample"> <property name="basedir" value="${project.basedir}"/> <fileset dir="${project.basedir}" includes="build.xml"/> </subant> </tasks>. - person Rao; 23.12.2015