Программно исполняемый скрипт ANT на Java - PullRequest
0 голосов
/ 23 декабря 2011

В eclipse я создал Swing Gui, который должен запускать кучу ранее разработанного кода, часть которого включает в себя запуск ant для сборки кода. Когда я запускаю любой скрипт за пределами GUI (в исходном проекте), муравей выполняет правильно и строит проект. Однако, когда я пытаюсь запустить ant программно, он выдает ошибки, которые выглядят так, как будто у проекта нет необходимых .jars. Код, верхняя часть build.xml и ошибки перечислены ниже.

Кодовый блок

File buildFile = new File("lib\\ePlay\\build.xml");
    Project p = new Project();
    p.setUserProperty("ant.file", buildFile.getAbsolutePath());
    DefaultLogger consoleLogger = new DefaultLogger();
    consoleLogger.setErrorPrintStream(System.err);
    consoleLogger.setOutputPrintStream(System.out);
    consoleLogger.setMessageOutputLevel(Project.MSG_INFO);
    p.addBuildListener(consoleLogger);

    try {
        p.fireBuildStarted();
        p.init();
        ProjectHelper helper = ProjectHelper.getProjectHelper();
        p.addReference("ant.projectHelper", helper);
        helper.parse(p, buildFile);
        p.executeTarget(p.getDefaultTarget());
        p.fireBuildFinished(null);
    } catch (BuildException e) {
        p.fireBuildFinished(e);
    }

build.xml

<?xml version="1.0" encoding="UTF-8"?>
<project name="EPlay" xmlns:ivy="antlib:org.apache.ivy.ant" default="resolve">

<dirname file="${ant.file}" property="ant.dir" />
<property name="scm.user" value="scmrel"/>
<property name="scm.user.key" value="/.ssh/scmrel/id_rsa"/>
<property name="ivy.jar" value="ivy-2.0.0.jar" />
<property name="ivy.settings.dir" value="${ant.dir}/ivysettings" />
<property name="VERSION" value="LATEST" />
<property name="tasks.dir" value="${ant.dir}/.tasks" />
<property name="deploy.dir" value="${ant.dir}/deploy" />
...
<!-- retrieve the dependencies using Ivy -->
<target name="resolve" depends="_loadantcontrib,_getivy" description=" retrieve the dependencies with Ivy">
  <ivy:settings file="${ivy.settings.dir}/ivysettings.xml" />
  <ivy:resolve file="${ant.dir}/ivy.xml" transitive="false" />
  <ivy:retrieve pattern="${deploy.dir}/[conf]/[artifact].[ext]"/>
</target>

и ошибка

resolve:
BUILD FAILED
H:\eclipse\CLDeploySwing\lib\ePlay\build.xml:66: Problem: failed to create task or type antlib:org.apache.ivy.ant:settings
Cause: The name is undefined.
Action: Check the spelling.
Action: Check that any custom tasks/types have been declared.
Action: Check that any <presetdef>/<macrodef> declarations have taken place.
No types or tasks have been defined in this namespace yet

This appears to be an antlib declaration. 
Action: Check that the implementing library exists in one of:
        -ANT_HOME\lib
        -the IDE Ant configuration dialogs


Total time: 0 seconds

Я посмотрел мою установку муравья, и она появляется все есть. Как я уже сказал, исходный проект успешно собирается, если build.xml запускается за пределами этого приложения. Спасибо за помощь

Ответы [ 3 ]

1 голос
/ 23 декабря 2011

Я хотел бы предположить, что это вызвано тем, что ваша java-программа не имеет того же пути к классам, где она выполняется, как и обычная сборка муравья - и, следовательно, ANT_HOME не является правильным.

Вы можете убедиться, что это правильно, передав правильные переменные окружения в JVM или просто вызвав System.getProperty ("ANT_HOME"), чтобы увидеть, где на самом деле находится ваш ANT_HOME.

0 голосов
/ 26 апреля 2013

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

<path id="ivy.lib.path">
    <fileset dir="path/to/dir/with/ivy/jar" includes="*.jar"/>
</path>
<taskdef resource="org/apache/ivy/ant/antlib.xml"
         uri="antlib:org.apache.ivy.ant" classpathref="ivy.lib.path"/>

Я делаю что-то в Gradle, которое требует этого

ant.taskdef(name: 'ivy-retrieve', classname: 'org.apache.ivy.ant.IvyRetrieve', classpath: '...path to ivy jar.../ivy-2.2.0.jar')

что в ant было бы что-то вроде

<taskdef name="ivy-retrieve" classname="org.apache.ivy.ant.IvyRetrieve"/>

Я знаю, что это более клёво и просто не так приятно, как включение объявления пространства имен, но это действительно устраняет некоторую путаницу относительно того, какие библиотеки для какого classpath являютсязагружается.

0 голосов
/ 23 декабря 2011

Я думаю ${basedir} для вашего проекта не рассчитано должным образом.

Добавьте эту строку в свой build.xml

<echo message="basedir='${basedir}'/>

Глядя на эту строку

File buildFile = new File("lib\\ePlay\\build.xml");

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...