Использование задачи antcontrib <if>через плагин maven-antrun-plugin - PullRequest
15 голосов
/ 18 января 2011

Мой проект Java Maven использует подключаемый модуль maven-antrun-plugin для выполнения ant-сценария deploy.xml, который развертывает мое приложение. В файле deploy.xml используется задача <if>, и это, похоже, вызывает проблему;

[ИНФО] Выполнение задач
[taskdef] Не удалось загрузить определения из ресурса net / sf / antcontrib / antlib.xml. Не удалось найти.

разворачивать:
[ИНФОРМАЦИЯ] ----------------------------------------------- -------------------------
[ОШИБКА] ОШИБКА ЗДАНИЯ
[ИНФОРМАЦИЯ] ----------------------------------------------- -------------------------
[INFO] Возникла исключительная ситуация Ant BuildException: при выполнении этой строки произошла следующая ошибка:
E: \ My_Workspace \ xxxxxx \ xxxxxx \ xxxxxxx \ deploy.xml: 24: Проблема: не удалось создать задачу или ввести, если
Причина: имя не определено.
Действие: Проверьте орфографию.
Действие: Убедитесь, что все пользовательские задачи / типы были объявлены.
Действие: Убедитесь, что все объявления / выполнены.

Вот конфиг плагина antrun из моего pom;

<plugin>
    <inherited>false</inherited>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <executions>
        <execution>
            <id>remote-deploy</id>
            <phase>install</phase>
            <configuration>
                <tasks>
                    <taskdef resource="net/sf/antcontrib/antcontrib.properties" classpathref="maven.plugin.classpath"/>

                        <property name="compile_classpath" refid="maven.compile.classpath" />
                        <property name="runtime_classpath" refid="maven.runtime.classpath" />
                        <property name="plugin_classpath" refid="maven.plugin.classpath" />

                        <echo message="compile classpath: ${compile_classpath}"/>
                        <echo message="runtime classpath: ${runtime_classpath}"/>
                        <echo message="plugin classpath: ${plugin_classpath}"/>

                        <ant antfile="${basedir}/deploy.xml">
                            <target name="deploy" />
                        </ant>
                </tasks>
            </configuration>
            <goals>
                <goal>run</goal>
            </goals>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>ant-contrib</groupId>
            <artifactId>ant-contrib</artifactId>
            <version>1.0b3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.ant</groupId>
            <artifactId>ant</artifactId>
            <version>1.7.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.ant</groupId>
            <artifactId>ant-jsch</artifactId>
            <version>1.7.1</version>
        </dependency>
    </dependencies>
</plugin>

.. и вот соответствующий раздел из моего deploy.xml;

<target name="deploy" if="deploy">
    <if>    <!-- line 24 -->
        <and>

Почему я смотрю в своем репозитории Maven, я вижу ant-contrib/ant-contrib/1.0b3/ant-contrib-1.0b3.jar, и когда я заглядываю внутрь банки, я вижу net/sf/antcontrib/antcontrib.properties, поэтому никаких проблем нет.

Когда я проверяю значения maven.compile.classpath, maven.compile.classpath и maven.compile.classpath, я не вижу ссылки на antcontrib, может ли это быть проблемой? Почему они не появляются, когда antcontrib определяется как зависимость?

Ответы [ 4 ]

26 голосов
/ 04 декабря 2012

Я думаю, что не очень хорошая идея добавлять муравей в компиляцию classpath, чтобы запустить плагин maven.

Я использую Maven 3.0.4, и он работал путем указания пространства имен для тегов ant-contribпример:

<configuration>
  <target>
    <echo message="The first five letters of the alphabet are:"/>
    <ac:for list="a,b,c,d,e" param="letter" xmlns:ac="antlib:net.sf.antcontrib">
      <sequential>
        <echo>Letter @{letter}</echo>
      </sequential>
    </ac:for>
  </target>
</configuration>

Мои maven-antrun-plugin зависимости:

<dependencies>
  <dependency>
    <groupId>ant-contrib</groupId>
    <artifactId>ant-contrib</artifactId>
    <version>1.0b3</version>
    <exclusions>
      <exclusion>
        <groupId>ant</groupId>
        <artifactId>ant</artifactId>
      </exclusion>
    </exclusions>
  </dependency>
  <dependency>
    <groupId>org.apache.ant</groupId>
    <artifactId>ant-nodeps</artifactId>
    <version>1.8.1</version>
  </dependency>
</dependencies>
3 голосов
/ 08 мая 2017

Я обнаружил, что вам нужно включить в плагин зависимость ant-contrib, которая позволит тегу taskdef найти antcontrib.properties

  <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-antrun-plugin</artifactId>
            <dependencies>
                <dependency>
                    <groupId>ant-contrib</groupId>
                    <artifactId>ant-contrib</artifactId>
                    <version>20020829</version>
                </dependency>
            </dependencies>
            <executions>
                <execution>
                    <id>copy-and-rename-template-files</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>run</goal>
                    </goals>
                    <configuration>
                        <target name = "copy-and-rename-template-files">
                            <taskdef resource="net/sf/antcontrib/antcontrib.properties"/>
                            <if>
                                <available file="src/main/resources/docker/templates" type="dir"/>
                                <then>
                                    <copy todir="${project.build.directory}/docker">
                                        <fileset dir="src/main/resources/docker/templates">
                                            <include name="**/*"/>
                                        </fileset>
                                    </copy>


                                    <move todir="${project.build.directory}/docker">
                                        <fileset dir="${project.build.directory}/docker">
                                            <include name="*"/>
                                        </fileset>
                                        <mapper>
                                            <regexpmapper from="(.*)project(.*)" to="\1${project.artifactId}\2"/>
                                        </mapper>
                                    </move>
                                </then>

                                <else>
                                    <echo>src/main/resources/docker/templates does not exist, skipping processing docker templates</echo>
                                </else>
                            </if>
                        </target>
                    </configuration>
                </execution>
            </executions>
        </plugin>
3 голосов
/ 18 января 2011

ОК, я решил это.

Перемещение зависимостей из тега <build><plugin> и добавление их в другие зависимости проекта, похоже, помогло.

0 голосов
/ 29 марта 2017

другое решение: сохранить путь ant-contrib-1.0b3.jar, а затем определить его следующим образом:

<property name="runningLocation" location="" />
<taskdef resource="net/sf/antcontrib/antcontrib.properties">
    <classpath>
        <pathelement location="${runningLocation}/ant-contrib-1.0b3.jar" />
    </classpath>
</taskdef>

, затем

<target name="doSomething">
    <if>
        <equals arg1="${someProp}" arg2="YES" />
        <then>
            <echo message="It is YES" />
        </then>
        <else>
            <echo message="It is not YES" />
        </else>
    </if>
</target>

Я поставил полный кодпример, который вы можете скачать https://www.surasint.com/run-ant-with-if-from-maven/

...