Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ant, заметка для FAQ 
:(
    Опции темы
batigoal
Дата 12.9.2005, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 11
Всего: 151



В течение долгого времени мне хватало для сборки приложения волшебной кнопочки «Build» с зеленой стрелочкой. Однако, по мере роста задач, она перестала удовлетворять моим нуждам, и я обратил свое внимание на утилиту ant. И вот что из этого получилось...


Цели

Имеем следующую ситуацию. Приложение крутится на сервере Sun под управлением OC Solaris. Для внесения изменений в какой-либо из классов необходимо произвести следующие действия:
  • Скорректировать исходный код класса (на своем компьютере).
  • Откомпилировать его (на своем компьютере).
  • Создать JAR-архив с новой версией класса (на своем компьютере).
  • Откомпилировать JSP-страницу.
  • Остановить работу приложения (которое крутится на сервере под связкой Apache + Resin).
  • Заменить лежащий там JAR-файл на свою версию (используя FTP), скопировать обновленную страницу.
  • Стартовать приложение.
Кроме того, по возможности хотелось выполнить SQL-запрос к базе Oracle, чтобы вычистить оттуда тестовые данные, оставшиеся там в результате работы приложения.

Разумеется, выполнять все эти действия вручную – занятие утомительное. Очень хочется выполнять всю последовательность одним кликом или одной командой. Тогда я вспомнил про Ant. Покопавшись в информации по нему, я с удивлением узнал, что он может выполнить и эти операции, и множество других заданий.


Hello, world

Начнем с начала. Ant представляет из себя утилиту, предназначенную для построения готовой build-версии приложения. Работа утилиты определяется XML-документом, состоящим из отдельных заданий (tasks). Обычно этот файл называется build.xml. Пример простейшего файла build.xml:

Код

<project>
  <target name="clean">
        <delete dir="build"/>
    </target>
</project>


project – это корневой тег. Он обязательно должен присутствовать в файле build.xml. Он содержит энное количество тегов <target>, каждый из которых определяет одно задание. Каждое задание должно иметь уникальное (в пределах файла) имя. И, наконец, delete – конкретное действие, выполняющееся при запуске задания. В данном случае это удаление каталога build, находящегося в текущем каталоге.

Запуск

Запустить ant с этим файлом можно командой
ant -buildfile build.xml clean
Соответственно, в данном случае опция –buildfile указывает, что после нее будет идти имя xml-файла. clean – имя запускаемого задания.

Кроме того, существует опция –lib. Она нужна, чтобы подключать к антовскому classpath’у дополнительные библиотеки и классы.


Второй шаг

Расширим наш файл дополнительными параметрами:

Код

<project name="My Project Buildfile" default="clean" basedir=".">
  <property name="build.dir" value="build"/>
  <target name="clean" description="Removes all generated files">
    <delete dir="${build.dir}"/>
  </target>
</project>


Тег project. name – имя проекта. default – имя того задания, которое будет запускаться по умолчанию, если не будет указан конкретный таск. basedir – директория, которая будет считаться корневой при сборке, все пути будут указываться относительно нее. Все три параметра являются необязательными, их можно безболезненно опустить.

Тег property. Этот тег позволяет нам объявить поле с каким-либо значением, и использовать его затем по всему скрипту. Соответственно, если впоследствии нам нужно будет поменять это значение, это нужно будет делать в одном месте, а не во всем коде. name – название переменной, value – ее значение. Теперь мы можем использовать такую конструкцию: ${build.dir}, вместо нее будет подставлено значение «build».

К тегу target мы добавили атрибут description. Никакой смысловой нагрузки он не несет, просто дополнительное описание.


Поехали дальше. Сделаем несколько типовых тасков, а потом соберем их в итоговый документ. Некоторые задания требуют использования дополнительных библиотек. Но сначала определим свойства, которые мы будем использовать по ходу дальнейшей работы:

Код

<property name="src.dir" value="src"/>
<property name="build.dir" value="build"/>
<property name="build.classes" value="${build.dir}/classes"/>
<property name="lib" value="D:/projects/libs"/>


src.dir – каталог исходных java-файлов
build.dir – каталог для результатов компиляции и упаковки
build.classes – class-файлы
lib – каталог для сторонних библиотек. Здесь я использовал абсолютный путь, т.к. у меня один каталог на несколько проектов.


Создание новой директории

Код

    <target name="prepare">
        <mkdir dir="${build.dir}"/>
        <mkdir dir="${build.classes}"/>
    </target> 


Новая директория создается тегом mkdir. Как мы видим из этого примера, задание может содержать несколько директив.


Компиляция

Код

    <target name="compile" depends="prepare" description="Compiles all source code">
        <javac srcdir="${src.dir}" destdir="${build.classes}">
            <classpath>
                <pathelement location="."/>
                <pathelement location="${lib}/ojdbc14.jar"/>
                <pathelement location="${lib}/j2ee.jar"/>
                <pathelement location="${lib}/utils.jar"/>
                <pathelement location="${lib}/context.jar"/>
                <pathelement location="${lib}/signon.jar"/>
            </classpath>
        </javac>
    </target> 


Вот тут в теге target впервые появляется очень важный атрибут – depends. Запись depends="prepare" означает, что при запуске этого задания будет предварительно выполнено задание prepare. Если необходимо выполнить несколько тасков, они перечисляются через запятую, и выполняются в том порядке, в котором они указаны.

Тег javac, как нетрудно догадаться, выполняет компиляцию java-файлов. Атрибутами srcdir и destdir мы указываем каталоги исходных и скомпилированных файлов. Для указания classpath существует одноименный тег, каждый элемент пути указывается отдельным тегом pathelement с атрибутом location.


Упаковка в JAR-архив

Код

    <target name="jar" depends="compile" description="Generates the result JAR-archive">
        <jar jarfile="${build.dir}/tvspace.jar"
             basedir="${build.classes}">
            <metainf file="tvspace.tld"/>
          </jar>
    </target> 


Здесь мы сначала указываем, что упаковке должна предшествовать компиляция. Затем осуществляем архивацию с помощью тега jar. jarfile – имя архива, basedir – каталог, который мы будем паковать, metainf – тег для указания дополнительных файлов, которые мы желаем включить в папку META-INF.


Компиляция JSP

Код

    <target name="compileJSP">
        <jspc srcdir="."
              destdir="${build.dir}"
              package="_tvspace"
              compiler="jasper41">
            <include name="**/*.jsp"/>
        </jspc>
    </target> 


(необходимы библиотеки jasper.jar и jasper-runtime.jar)

Компиляция JSP-страниц выполняется с помощью задания jspc. Указывается исходная директория (srcdir), конечная директория (destdir), пакет (package), компилятор jasper (package). Директива include name="**/*.jsp" указывает, что должны быть откомпилированы все файлы с расширением .jsp, находящиеся в исходной директории.


Работа с FTP

Код

    <target name="ftp" description="Uploads file to FTP">
        <ftp action="put"
             server="appserver.lab.ru"
             userid="my_user"
             password="my_user"
             remotedir="/export/home/my_user/lib">
            <fileset dir="${build.dir}">
                <include name="tvspace.jar"/>
            </fileset>
        </ftp>
    </target> 


(необходима библиотека commons-net-1.4.0.jar)

Как всегда, все очевидно следует из имен и названий smile

Тег ftp. Атрибуты:
action – команда сервера. В данном случае мы делаем закачку на сервер, поэтому put.
server – имя удаленного сервера
userid – имя пользователя
password – пароль
remotedir – директория, в которую будет производиться аплоад.

Тег fileset используется в очень многих директивах ant. Он позволяет определить набор файлов, в т.ч. с использованием маски имени. В данном случае мы просто включаем туда конкретный файл директивой include. То есть, при запуске этого задания будет произведено копирование файла tvspace.jar в директорию /export/home/my_user/lib от имени пользователя my_user (разумеется, в случае правильной авторизации).

Запуск shell-скрипта

Код

    <target name="stop" description="Stops server">
        <sshexec host="my_host.lab.ru" trust="yes"
            username="my_user"
            password="my_user"
            command="/export/home/my_user/myscript stop"/>
    </target> 


(необходима библиотека jsch-0.1.21.jar)

Запуск shell-скрипта можно осуществить с помощью тега sshexec. Этот тег отвечает за открытие SSH-соединения с удаленным сервером.
host – имя удаленного сервера.
trust – этот параметр показывает, «доверяет» ли сервер неизвестным хостам. Я с ним так до конца и не разобрался, но без этого не работало smile
username – имя пользователя
password – пароль
command – директория, в которую будет производиться аплоад.


Работа с БД

Код

    <target name="deleteRecordFromDB" description="The SQL-script for clearing the added records">
        <sql driver="oracle.jdbc.OracleDriver"
                url="jdbc:oracle:thin:@mydbhost:1521:mydbsid"
                userid="my_user"
                password="my_user">
           delete from test_table
        </sql>
    </target> 


(для запуска необходимо подключить библиотеку ojdbc14.jar)

Вновь все очевидно. Формат параметров соответствует обычной JDBCшной нотации. Тег sql имеет атрибуты driver (JDBC-драйвер для базы), url (URL, по которому доступна база), userid (имя пользователя) и password (пароль). Кроме того, можно еще использовать атрибут src и указать sql-файл с выполняемым скриптом (sql=”my_script_file.sql”). Но я делаю это прямо в теле тега, как показано выше.



Итог

Все задания описаны. Теперь мы можем написать, например, такой таск:
Код

<target name="all" depends="stop, compile, jar, ftp, start" 
  description="Cleans, compiles, builds the JAR file, puts it on the server and restarts it"/> 

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


Вся справочная информация получена из официального мануала, который можно найти по адресу http://ant.apache.org/manual/index.html. На официальном сайте ant (http://ant.apache.org) можно найти описания форматов всевозможных заданий, как базовых, так и сторонних. Возможности ant поистине огромны, и все это – при такой простоте управления! Кроме того, мы сохраняем преимущество кроссплатформенности и отвязываемся от среды-сборщика. Кстати, ant отлично интегрируется с современными IDE.




P.S. Большая просьба ко всем, кто работал с ant из командной строки. Я пробовал все это из-под IDE (Idea & Eclipse), с командной строкой у меня не срослось. PATH, CLASSPATH и ANT_HOME прописан, но получаю такую же ошибку командной строки, как если бы виртуальная машина была запущена с неправильными параметрами. Может, кто-нибудь может что-то посоветовать?

Это сообщение отредактировал(а) Lamer George - 12.9.2005, 16:20


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
allex
Дата 12.9.2005, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 5.9.2005

Репутация: нет
Всего: нет



Командную строку и сообщение об ошибке в студию!
PM MAIL   Вверх
batigoal
Дата 12.9.2005, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 11
Всего: 151



Строка проста, как валенок. Пользовал несколько вариантов:
ant
ant -buildfile build.xml
ant stop
ant -buildfile build.xml stop

А ошибка такая же, какую выдает команда java без параметров:


Присоединённый файл ( Кол-во скачиваний: 70 )
Присоединённый файл  java.JPG 53,43 Kb


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
аЛексус
Дата 20.3.2006, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 20.3.2006
Где: Алматы

Репутация: 1
Всего: 1



Кто нить подскажите где можно достать мануал по ANT на русском?! ПЛИЗ!
PM MAIL WWW ICQ   Вверх
batigoal
Дата 20.3.2006, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 11
Всего: 151





--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
аЛексус
Дата 20.3.2006, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 20.3.2006
Где: Алматы

Репутация: 1
Всего: 1



Thanx!
PM MAIL WWW ICQ   Вверх
аЛексус
Дата 21.3.2006, 06:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 20.3.2006
Где: Алматы

Репутация: 1
Всего: 1



Кстати, разобрался с той ошибкой?
У меня есть еще один вопрос!
В общем ситуация такая: у меня есть база данных со всеми хранимками и процедурами, но некоторорые хранимки и процедуры надо регулярно обновлять из CVS. Сейчас это все приходится делать в ручную, но как известно лень! Есть предложение сделать это с помощью ANT. У кого-нибудь есть соображения как?
PM MAIL WWW ICQ   Вверх
tux
Дата 21.3.2006, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 11
Всего: 132



Цитата(аЛексус @ 21.3.2006, 11:47 Найти цитируемый пост)
В общем ситуация такая: у меня есть база данных со всеми хранимками и процедурами, но некоторорые хранимки и процедуры надо регулярно обновлять из CVS. Сейчас это все приходится делать в ручную, но как известно лень! Есть предложение сделать это с помощью ANT. У кого-нибудь есть соображения как?

Да проще простого. Получится что-то такое:
Код

<?xml version="1.0" encoding="UTF-8"?>
<project basedir="." default="all" name="Application">

    <target name="init">
        <property environment="env" />
        <property name="ws.dir" value="./ws" />
        <property name="cvs.root" value=":pserver:[email protected]:/home/cvs" />
        <property name="lib.dir" value="lib" />
        <property name="db.driver" value="org.postgresql.Driver"/>
        <property name="db.url" value="jdbc:postgresql://localhost/database"/>
        <property name="db.user" value="postgres"/>
        <property name="db.password" value=""/>
        
        <path id="class.path">
            <fileset dir="${lib.dir}">
                <include name="*.jar"/>
            </fileset>
        </path>
    </target>

    <target name="cvs" depends="init">
        <cvspass cvsroot="${cvs.root}" password="1234567" />
        <cvs cvsRoot="${cvs.root}" package="application" dest="${ws.dir}" />
    </target>

    <target name="db" depends="cvs">
        <sql driver="${db.driver}" 
            url="${db.url}" 
            userid="postgres" 
            password="${db.password}" 
            src="${ws.dir}/application/src/test/hibernate/db.sql" 
            classpathref="class.path"/>
    </target>

    <target name="all" depends="db">
    </target>

</project>

Заменяешь свойства db.* и название скрипта sql на то, что тебе нужно и все должно работать. Естественно, если у тебя несколько скриптов, выполняешь тэг <sql> для каждого.
PM MAIL Skype GTalk Jabber YIM   Вверх
batigoal
Дата 21.3.2006, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 11
Всего: 151



Цитата(tux @ 21.3.2006, 10:14 Найти цитируемый пост)
Естественно, если у тебя несколько скриптов, выполняешь тэг <sql> для каждого.

А разве скопом нельзя? В мануле есть такие примеры:
Код

<sql
    driver="org.database.jdbcDriver"
    url="jdbc:database-url"
    userid="sa"
    password="pass">
  <fileset dir=".">
    <include name="data*.sql"/>
  </fileset>
  <transaction>
    truncate table some_other_table;
  </transaction>
</sql>


Или просто
Код

<sql
    driver="org.database.jdbcDriver"
    url="jdbc:database-url"
    userid="sa"
    password="pass" >
  <transaction  src="data1.sql"/>
  <transaction  src="data2.sql"/>
  <transaction  src="data3.sql"/>
  <transaction>
    truncate table some_other_table;
  </transaction>
</sql>

Добавлено @ 09:30
Цитата(аЛексус @ 21.3.2006, 07:47 Найти цитируемый пост)
Кстати, разобрался с той ошибкой?

Все заработало, но почему - не знаю smile


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
tux
Дата 21.3.2006, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 11
Всего: 132



Цитата(Lamer George @ 21.3.2006, 14:28 Найти цитируемый пост)
А разве скопом нельзя?

Можно конечно smile Просто скрипт брал из своего готового.
PM MAIL Skype GTalk Jabber YIM   Вверх
аЛексус
Дата 21.3.2006, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 20.3.2006
Где: Алматы

Репутация: 1
Всего: 1



Спасибо, попробую! Мне кажется удобней делать через fileset потому что скриптов много! Да и еще, не подскажите где взять драйвер для MS SQL Server 2000?! я просто недавно этим занимаюсь, поэтому не знаю где что! smile
PM MAIL WWW ICQ   Вверх
tux
Дата 21.3.2006, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 11
Всего: 132



Здесь драйвер от самой Microsoft - http://msdn.microsoft.com/data/jdbc/default.aspx. Здесь драйвер стороннего производства, open-source - http://jtds.sourceforge.net/. Судя по рассказам второй работает лучше, сам не пользовался.
PM MAIL Skype GTalk Jabber YIM   Вверх
vaz
Дата 5.4.2006, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 5.4.2006

Репутация: нет
Всего: нет



To Lamer George по поводу ошибки "А ошибка такая же, какую выдает команда java без параметров".
Посмотри не установлен ли у тебя ант в каталог, содержащий пробелы. Например, D:\Program files\Ant. Ант не работает с путями, содержащими пробелы.

И еще очень насущный вопрос: С помощью <javac> таска можно компилить исходные файлы проекта. А как получить имена только компилируемых исходников? Насколько я понял ант компилит не все исходники подряд, а только измененные исходники. Или как дополнительно обработать исходник с помощью другой программы непосредственно в ходе компиляции с помощью таска <javac>. То есть нужно обрабатывать другой программой только измененные исходники, которые определил ант.
PM MAIL   Вверх
batigoal
Дата 5.4.2006, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 11
Всего: 151



Цитата(vaz @ 5.4.2006, 14:13 Найти цитируемый пост)
To Lamer George по поводу ошибки "А ошибка такая же, какую выдает команда java без параметров".
Посмотри не установлен ли у тебя ант в каталог, содержащий пробелы. Например, D:\Program files\Ant. Ант не работает с путями, содержащими пробелы.

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

Цитата(vaz @ 5.4.2006, 14:13 Найти цитируемый пост)
И еще очень насущный вопрос: С помощью <javac> таска можно компилить исходные файлы проекта. А как получить имена только компилируемых исходников? Насколько я понял ант компилит не все исходники подряд, а только измененные исходники. Или как дополнительно обработать исходник с помощью другой программы непосредственно в ходе компиляции с помощью таска <javac>. То есть нужно обрабатывать другой программой только измененные исходники, которые определил ант.

А ты уверен, что он компилит только измененные? Ведь Ant даже отследить этого не может - никакой иcтории изменений не ведется.

Это сообщение отредактировал(а) Lamer George - 5.4.2006, 14:33


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
jer1
Дата 5.4.2006, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 123
Регистрация: 24.1.2005
Где: Харьков Украина

Репутация: нет
Всего: 5



Цитата(Lamer George @ 5.4.2006, 14:30)
А ты уверен, что он компилит только измененные? Ведь Ant даже отследить этого не может - никакой иcтории изменений не ведется.

ant/docs/manual/CoreTasks/javac.html


Javac
Description

Compiles a Java source tree.

The source and destination directory will be recursively scanned for Java source files to compile. Only Java files that have no corresponding .class file or where the class file is older than the .java file will be compiled. // выделено мною jer1


--------------------
:w!q
PM MAIL   Вверх
chief39
Дата 5.4.2006, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 5
Всего: 77



Цитата(Lamer George @ 12.9.2005, 18:38 Найти цитируемый пост)
ant -buildfile build.xml stop

на всяк случ. мож кому легче будет smile :
вместо -buildfile можно -f :
Код

ant -f build.xml stop

если есть в текущей папке файл build.xml - то ант сам его хватанёт.
ant stop
Если такого нету - тогда следует файл явно указать.
то есть
Код

ant -f build-system.xml stop


В общем та же идеология замечательной утилитки make (которую, я, дурак, раньше недолюбливал)

По поводу частичной сборки: так же как и make - компилит несуществующие или "освежает" старые. Зачастую clean можно не делать.
Когда пересобирал проект - очень пригодилось - поменял мааахонький кусочек - оно его перекомпилило - и всё smile не сидишь по 5 минут в монитор не втыкаешь smile



--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
аЛексус
Дата 6.4.2006, 06:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 20.3.2006
Где: Алматы

Репутация: 1
Всего: 1



Другие программы можно запускать с помощью таска <apply>. Я например запускаю компилятор делфи.

Код

<target name="compile" description="Compiles">
    <apply executable="dcc32.exe" verbose="true">
        <fileset dir="${basedir}" includes="*.dpr"/>
    </apply>
</target>

PM MAIL WWW ICQ   Вверх
jer1
Дата 6.4.2006, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 123
Регистрация: 24.1.2005
Где: Харьков Украина

Репутация: нет
Всего: 5



hi, вот хочу аЛексус первый плюсик поставить, как это можно сделать?
--------------------
:w!q
PM MAIL   Вверх
tux
Дата 6.4.2006, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 11
Всего: 132



Цитата(jer1 @ 6.4.2006, 13:59 Найти цитируемый пост)
hi, вот хочу аЛексус первый плюсик поставить, как это можно сделать?

Не вопрос.
PM MAIL Skype GTalk Jabber YIM   Вверх
аЛексус
Дата 6.4.2006, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 20.3.2006
Где: Алматы

Репутация: 1
Всего: 1



Кстати есть одно дополнение для тех кто собирает проекты делфи на Анте.
Если ваш файл сборки будет не в той же директории где и *.dpr, то он не будет нормально компилировать в том случае если есть dcc32.cfg. Я эту проблему решил путем разделения файла сборки на два: один основной, а другой только для компиляции.
Основной файл выглядит примерно так:
Код

<target name="copy" description="Copies build.xml" depends="CVS checkout">
<!-- Copies to Applications -->
    <copy file="build.xml"  todir="${cch.dir}\Administrator"/>
    <copy file="build.xml"  todir="${cch.dir}\Ambulance"/>
    <copy file="build.xml"  todir="${cch.dir}\Cash"/>
    <copy file="build.xml"  todir="${cch.dir}\DB_Drugstore"/>
    <copy file="build.xml"  todir="${cch.dir}\Diagnostics"/>
    <copy file="build.xml"  todir="${cch.dir}\Drugstore"/>
    <copy file="build5.xml" todir="${cch.dir}\Users"/>
    </target>

    <target name="compile" description="Compiles source" depends="copy">
<!-- Compiles Applications -->
        <sequential>
        <delete>
            <fileset dir="${bin.dir}" includes="**/*.exe"/>
            <fileset dir="${bin.dir}" includes="**/*.log"/>
        </delete>
        <parallel threadCount="5">
        <ant dir="${cch.dir}\Administrator" output="${bin.dir}\CCH\Administrator\dcc32.log"/>
        <ant dir="${cch.dir}\Ambulance"     output="${bin.dir}\CCH\Ambulance\dcc32.log"/>
        <ant dir="${cch.dir}\Cash"          output="${bin.dir}\CCH\Cash\dcc32.log"/>
        <ant dir="${cch.dir}\Diagnostics"   output="${bin.dir}\CCH\Diagnostics\dcc32.log"/>
        <ant dir="${cch.dir}\Drugstore"     output="${bin.dir}\CCH\Drugstore\dcc32.log"/>
        <ant dir="${cch.dir}\Users" antfile="build5.xml" output="${bin.dir}\CCH\Users\dcc32.log"/>
        </parallel>
        </sequential>
    <buildnumber/>
    </target>  


А второй, который копируется в раб. директории я указал выше.

если у кого-нить есть какие-нибудь замечания или советы, жду!
да и обратите внимание на <parallel> и <sequential>, очень полезные штуки, значительно уменьшает время сборки!
PM MAIL WWW ICQ   Вверх
tux
Дата 12.4.2006, 02:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 11
Всего: 132



В дополнение ссылка на статью по Ant - http://www.opennet.ru/base/dev/ant_10.txt.html.
PM MAIL Skype GTalk Jabber YIM   Вверх
vaz
Дата 18.4.2006, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 5.4.2006

Репутация: нет
Всего: нет



Все таки не могу решить проблему. Мне необходимо с помощью другой программы обработать исходник и поменять содержимое doclet тега. Проблема состоит в том, что данную операцию нужно сделать только для изменившихся исходников, которые определит ant и делать мне это нужно непосредственно перед компиляцией каждого из изменившихся исходников.
В принципе в <javac> task можно включить опцию debug="on" и вывести в файл результаты компиляции, где и будут перечислены компилирующиеся файлы. Но во-первых, его парсить нужно и во-вторых, получаешь набор исходников, которые уже откомпилированы. А мне необходимо непосредственно перед компиляцией обработать изменившийся исходник.


Цитата

А ты уверен, что он компилит только измененные? Ведь Ant даже отследить этого не может - никакой иcтории изменений не ведется. 

Есть одна маленькая загвоздка, на которую никто из осваивающих ant не обращает внимание, а потом теряет время.
!!! Если структура каталогов в точности не соответствует структуре пакетов, то ant будет компилить все подряд вне зависимсоти от того каких ты опций в task'e не понаставишь. Другими словами, дерево каталогов, в которые будут ложиться классы будет сформировано согласно структуре пакетов, а исходники могут лежать в дереве каталогов, которое не соответствует в точности дереву каталогов классов. Ведь сравнение изменившегося исходника ведется по классу, который должен лежать в подобной структуре каталогов. Поэтому нужно обязательно проверить соответствие дерева каталогов классов и дерево каталогов исходников на соответствие. Тогда ant будет компилировать только изменившиеся исходники.
И еще хорошо бы воспользоваться task'ом <depend>.

Цитата

<parallel> и <sequential>, очень полезные штуки, значительно уменьшает время сборки! 

не хочется лезть в документацию, но интересно знать за счет чего это происходит. 
PM MAIL   Вверх
sandello
Дата 18.4.2006, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 18.5.2005
Где: Пермь

Репутация: 2
Всего: 2



Цитата(vaz @  18.4.2006,  13:15 Найти цитируемый пост)
Все таки не могу решить проблему. Мне необходимо с помощью другой программы обработать исходник и поменять содержимое doclet тега. Проблема состоит в том, что данную операцию нужно сделать только для изменившихся исходников, которые определит ant и делать мне это нужно непосредственно перед компиляцией каждого из изменившихся исходников.

Можешь описать задачу, которая привела к такой необходимости?

Цитата(vaz @  18.4.2006,  13:15 Найти цитируемый пост)
В принципе в <javac> task можно включить опцию debug="on" и вывести в файл результаты компиляции, где и будут перечислены компилирующиеся файлы. Но во-первых, его парсить нужно и во-вторых, получаешь набор исходников, которые уже откомпилированы. А мне необходимо непосредственно перед компиляцией обработать изменившийся исходник.

Меняешь файлы и компилируешь повторно. Идея плохая, но работать должно.

Хотелось бы дополнить начинателя:
Тег property: однажды сознанная property уже никогда не меняет своего значения. Это, в принципе, есть в статье на opennet

Тег condition: позволяет реализовать ветвление. Пример:
Код

<condition property="name" value="ok_value">
  <length string="${prop}" length="0"/>
</condition>

В случае успешной провеки условия в теле элемента condition будет установлена переменная name (значение "ok_value"). Если условие не верно, переменная установлена не будет. Поэтому, если нужно построить конструкцию if ... else ..., то для этого достаточно после condition добавить тег proprety, в котором установить значение для неверного условия.
   

Это сообщение отредактировал(а) sandello - 18.4.2006, 14:50


--------------------
user posted image
PM MAIL Jabber   Вверх
vaz
Дата 19.4.2006, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 5.4.2006

Репутация: нет
Всего: нет



Цитата
 http://forum.vingrad.ru/index.php?showtopi...st&p=706527
Все таки не могу решить проблему. Мне необходимо с помощью другой программы обработать исходник и поменять содержимое doclet тега. Проблема состоит в том, что данную операцию нужно сделать только для изменившихся исходников, которые определит ant и делать мне это нужно непосредственно перед компиляцией каждого из изменившихся исходников.


Цитата

Можешь описать задачу, которая привела к такой необходимости?


Задача следующая: есть increaseVersion.jar который увеличивает версию в java исходнике, в теге @version. Увеличивает по заданному правилу для определеленного формата x.xx или x.x. Если в какой-то исходник вносится изменение, то его версию нужно увеличить при следующей компиляции. Естественно ant найдет все изменившиеся исходники и скомпилирует только их. Но мне нужно перед тем как он их найдет увеличить версию. Если увеличивать версию после компиляции, то эти файлы снова окажутся измененными и ant их будет компилировать вечно.
Можно ли каким-то образом вклинить запуск этого jar'ника в таск <javac> и непосредственно перед компиляцией увеличивать версию только тех исходников, в которые вносились изменения?
Система контроля версий в данном случае не подходит по нескольким причинам:
- версия класса должна меняться в исходнике после каждого изменения/компиляции а не после коммита
- библиотека небольшая и разрабатывается и собирается одним человеком, т.е. отсутствуют там всякие мерджи версионные ветки
- откаты тоже не нужны
- ну и система контроля версий и место дополнительное ест и время потихоньку тоже. 
PM MAIL   Вверх
sandello
Дата 19.4.2006, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 18.5.2005
Где: Пермь

Репутация: 2
Всего: 2



Цитата(vaz @  19.4.2006,  12:46 Найти цитируемый пост)
Если в какой-то исходник вносится изменение, то его версию нужно увеличить при следующей компиляции. Естественно ant найдет все изменившиеся исходники и скомпилирует только их. Но мне нужно перед тем как он их найдет увеличить версию. Если увеличивать версию после компиляции, то эти файлы снова окажутся измененными и ant их будет компилировать вечно.

Ты немного не понял. Я предлагал сделать что-то вроде:
Код

<target name="compile_and_increase_version>
  <!-- первая компиляцияю. Основная цель - определение списка изменных файлов -->
  <javac .../>
  
  <!-- определяем нужные файлы по выходу javac, вносим изменения в них -->
  <.../>

  <!-- собираем правильные исходники -->
  <javac .../>
</target>


А вот на счет системы контроля версии - ты не прав. Именно она очень удобна для этой задачи. На примере Subversion могу предложить несколько вариантов:
1. С использованием Keywords - тогда в каждый файл можно затолкать номер ревизии
2. С использованием svn status можно получить список изменных файлов без компиляции

Я реализовал 3 вариант :-) Основная особенность - выбор, что будем увеличивать (version.subversion.patch.bugfix), решаю я. Для этого у ant'овского скрипта торчат наружу одноименные цели. Каждая такая цель увеличивает цифирку в определенной строке специального файла. Дальше - дело техники :-)
  

Это сообщение отредактировал(а) sandello - 19.4.2006, 11:57


--------------------
user posted image
PM MAIL Jabber   Вверх
vaz
Дата 19.4.2006, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 5.4.2006

Репутация: нет
Всего: нет



svn только начинаю осваивать и толком данную задачу быстро не решу. Попробую третий вариант :-), может у тебя есть простой пример? 
PM MAIL   Вверх
sandello
Дата 20.4.2006, 06:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 18.5.2005
Где: Пермь

Репутация: 2
Всего: 2



Лови работающий скрипт
Код

<?xml version="1.0" encoding="UTF-8"?>
<project name="Project build" default="build" basedir=".">
  <taskdef resource="svntask.properties">
    <classpath>
      <filelist dir="${basedir}/lib" files="svnant.jar svnClientAdapter.jar svnjavahl.jar"/>
    </classpath>
  </taskdef>

  <target name="init">
    <!--<property file="build.properties"/>-->
    <property name="version_file" value="version"/>

    <property name="module.name" value="radius3tm"/>
    <property name="module.dir" value="."/>
    <property name="module.dir.vc" value="${module.dir}"/>
    <property name="module.dir.src" value="${module.dir}/src"/>
    <property name="module.dir.dtd" value="${module.dir}/dtd"/>
    <property name="module.dir.lib" value="${module.dir}/lib"/>
    <property name="dir.jboss.client" value="${module.dir.lib}"/>

    <property name="version_java" value="${module.dir.src}/com/company/project/Version.java"/>
  </target>


  <target name="increment_build" depends="init">
    <propertyfile file="version">
      <entry key="build.number" type="int" operation="+" value="1"/>
    </propertyfile>
    <propertyfile file="${version_file}">
      <entry key="nostable" value="+"/>
    </propertyfile>
  </target>

  <target name="increment_version" depends="init,increment_build">
    <propertyfile file="${version_file}">
      <entry key="version.number" type="int" operation="+" value="1"/>
      <entry key="subversion.number" value="0"/>
      <entry key="patch.number" value="0"/>
      <entry key="bugfix.number" value="0"/>
      <entry key="nostable" value=""/>
    </propertyfile>
  </target>

  <target name="increment_subversion" depends="init,increment_build">
    <propertyfile file="${version_file}">
      <entry key="subversion.number" type="int" operation="+" value="1"/>
      <entry key="patch.number" value="0"/>
      <entry key="bugfix.number" value="0"/>
      <entry key="nostable" value=""/>
    </propertyfile>
  </target>

  <target name="increment_patch" depends="init,increment_build">
    <propertyfile file="${version_file}">
      <entry key="patch.number" type="int" operation="+" value="1"/>
      <entry key="bugfix.number" value="0"/>
      <entry key="nostable" value=""/>
    </propertyfile>
  </target>

  <target name="increment_bugfix" depends="init,increment_build">
    <propertyfile file="${version_file}">
      <entry key="bugfix.number" type="int" operation="+" value="1"/>
      <entry key="nostable" value=""/>
    </propertyfile>
  </target>

  <target name="configure" depends="init">
    <property file="${version_file}"/>

    <property name="module.version" value="${version.number}.${subversion.number}.${patch.number}.${bugfix.number}"/>
    <property name="module.build" value="${build.number}"/>
  </target>

  <target name="prepare_src" depends="init,configure,pre_version_control">
    <property file="${version_file}"/>
    <!--property file="${build_file}"/-->
    <!--property file="${build_file}"/-->
    <!--property file="${build_file}"/-->
    <!--property file="${build_file}"/-->
    <replaceregexp file="${version_java}" match="build=\d*;" replace="build=${build.number};" byline="true"/>
    <replaceregexp file="${version_java}" match="version=\d*;" replace="version=${version.number};" byline="true"/>
    <replaceregexp file="${version_java}" match="subversion=\d*;" replace="subversion=${subversion.number};"
                   byline="true"/>
    <replaceregexp file="${version_java}" match="patch=\d*;" replace="patch=${patch.number};" byline="true"/>
    <replaceregexp file="${version_java}" match="bugfix=\d*;" replace="bugfix=${bugfix.number};" byline="true"/>
    <replaceregexp file="${version_java}" match="nostable=&quot;\+?&quot;;" replace="nostable=&quot;${nostable}&quot;;" byline="true"/>
    <replaceregexp file="${version_java}" match="module=&quot;.*&quot;;" replace="module=&quot;${module.name.base}&quot;;" byline="true"/>
  </target>


  <!-- информацию из VC получили, подставляем в имена -->
  <target name="pre_version_control" depends="init,configure,version_control_status">
    <echo message="${vc.root}"/>
    <echo message="'${vc.branch}'"/>

    <condition property="module.name.base" value="${module.name}-${vc.branch}">
      <not>
        <length string="${vc.branch}" length="0"/>
      </not>
    </condition>
    <property name="module.name.base" value="${module.name}"/>
    <echo message="${module.name.base}"/>

    <condition property="module.name.ver" value="${module.name.base}-build-${module.build}">
      <equals arg1="${nostable}" arg2="+"/>
    </condition>
    <property name="module.name.ver"
              value="${module.name.base}-release-${version.number}_${subversion.number}_${patch.number}_${bugfix.number}"/>
    <echo message="${module.name.ver}"/>

    <condition property="module.file.suffix" value="${module.version}-${module.build}-src">
      <equals arg1="${nostable}" arg2="+"/>
    </condition>
    <property name="module.file.suffix" value="${module.version}-src"/>


    <property name="module.file" value="${module.name.base}-${module.file.suffix}"/>

    <echo message="${module.file}"/>
  </target>


  <!-- Готовим архив исходников -->
  <target name="make_archive" depends="init,configure,pre_version_control,version_control">

    <property name="archive.dir" value="build/${module.file}"/>
    <property name="archive.name" value="${module.file}.tar.gz"/>

    <property name="archive.dir.src" value="${archive.dir}/src"/>
    <property name="archive.dir.dtd" value="${archive.dir}/dtd"/>
    <property name="archive.dir.lib" value="${archive.dir}/lib"/>

    <delete dir="${archive.dir}"/>
    <mkdir dir="${archive.dir.src}"/>
    <mkdir dir="${archive.dir.lib}"/>
    <mkdir dir="${archive.dir.dtd}"/>


    <copy todir="${archive.dir.src}">
      <fileset dir="${module.dir.src}"/>
    </copy>
    <copy todir="${archive.dir.lib}">
      <fileset dir="${module.dir.lib}"/>
      <fileset dir="${dir.jboss.client}"
               includes="jboss-client.jar jbosssx-client.jar jnp-client.jar jboss-j2ee.jar jboss-common-client.jar jboss-transaction-client.jar"
          />
    </copy>
    <copy todir="${archive.dir.dtd}">
      <fileset dir="${module.dir.dtd}"/>
    </copy>
    <chmod file="${archive.dir.src}/build.sh" perm="+x"/>
    <tar destfile="${archive.dir}.tar.gz" compression="gzip" basedir="${archive.dir}"/>
  </target>

  <target name="version_control_status" depends="init,configure">
    <delete file="build.properties"/>
    <svn>
      <update file="build.properties"/>
    </svn>
    <property file="build.properties"/>
<!--
    <svn>
      <status path="${module.dir}" textStatusProperty="vc.testStatus.textStatus"
              propStatusProperty="vc.testStatus.propStatus" lastChangedRevisionProperty="vc.testStatus.lastCommitRevision"
              revisionProperty="vc.testStatus.revision" lastCommitAuthorProperty="vc.testStatus.lastCommitAuthor"/>
    </svn>
    <echo message="${vc.testStatus.textStatus}"/>
    <condition property="vc.testStatus" value="ok">
      <and>
        <equals arg1="vc.testStatus.textStatus" arg2="normal"/>
        <equals arg1="vc.testStatus.propStatus" arg2="normal"/>
      </and>
    </condition>
-->

    <tempfile property="temp.file" destDir="${basedir}" prefix="tmpprop"/>
    <!--<propertyfile file="${temp.file}" message="vc.root=${vc.root.keyword}"/>-->
    <propertyfile file="${temp.file}">
      <entry key="vc.root" value="${vc.root.keyword}"/>
      <entry key="vc.branch" value="${vc.root.keyword}"/>
      <entry key="vc.project" value="${vc.root.keyword}"/>
      <!--<entry key="vc.root" value="$HeadURL: svn+ssh://localhost/usr/local/SVN/Project/trunk/build.properties $"/>-->
      <!--<entry key="vc.branch" value="$HeadURL: svn+ssh://localhost/usr/local/SVN/Project/trunk/build.properties $"/>-->
    </propertyfile>
    <replaceregexp file="${temp.file}" match="vc.root=\$HeadURL\\: (.*\/Project.*)\/build.properties \$$" replace="vc.root=\1"/>
    <replaceregexp file="${temp.file}" match="vc.branch=\$HeadURL\\: .*\/Project.*\/(trunk|branches)(\/(.*?))?\/build.properties \$$" replace="vc.branch=\3"/>
    <replaceregexp file="${temp.file}" match="vc.project=\$HeadURL\\: (.*\/Project).*\/build.properties \$$" replace="vc.project=\1"/>
    <property file="${temp.file}"/>
    <echo message="${vc.root}"/>
    <echo message="${vc.branch}"/>
    <echo message="${vc.project}"/>
    <delete file="${temp.file}"/>
  </target>

  <target name="version_control" depends="init,configure,version_control_status,pre_version_control">
    <input message="Enter commit message" addproperty="vc.commitmsg"/>
    <echo message=" ${vc.commitmsg}"/>
    <svn>
      <commit dir="${module.dir.vc}" message="${module.name.ver}
      ${vc.commitmsg}"/>
    </svn>
    <svn>
      <copy srcURL="${vc.root}" destURL="${vc.project}/tags/${module.name.ver}" message="${module.name.ver}
      ${vc.commitmsg}"/>
    </svn>
  </target>

  <target name="build" depends="init,increment_build,prepare_src,make_archive">
    <property name="task" value="build"/>
  </target>

  <!--<target name="nb" depends="build">-->
    <!--<property name="task" value="build"/>-->
  <!--</target>-->

  <target name="version" depends="init,increment_version,prepare_src,make_archive">
    <property name="task" value="version"/>
  </target>

  <target name="subversion" depends="init,increment_subversion,prepare_src,make_archive">
    <property name="task" value="subversion"/>
  </target>

  <target name="patch" depends="init,increment_patch,prepare_src,make_archive">
    <property name="task" value="patch"/>
  </target>

  <target name="bugfix" depends="init,increment_bugfix,prepare_src,make_archive">
    <property name="task" value="bugfix"/>
  </target>

  <!--<target name="test">-->
    <!--<echo message=""/>-->
  <!--</target>-->
</project>


Добавлено @ 06:19 
Он еще много чего интересного делает :-) 


--------------------
user posted image
PM MAIL Jabber   Вверх
vaz
Дата 20.4.2006, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 5.4.2006

Репутация: нет
Всего: нет



Хороший пример, попробую обстричь его для своих целей. 
PM MAIL   Вверх
drHip
Дата 27.9.2007, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 30.5.2007

Репутация: нет
Всего: нет



Цитата

Компиляция JSP
(необходимы библиотеки jasper.jar и jasper-runtime.jar)


Все добавил, нашел еще и commoms-logging.jar
но

Код

Compiling 18 source files to E:\Java\Portal\exploded
java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory
    at org.apache.jasper.JspC.<clinit>(JspC.java:98)
Exception in thread "main" 



смотрю в jasper, package org.apache.juli.logging существует, а самого LogFactory нет
И где его искать?

Tomcat 6.0, Ant 1.7.0

Добавлено через 11 минут и 19 секунд
вот что еще нашел, но перевести это не смог

Цитата

Package org.apache.juli.logging Description

Overview

This implementation of commons-logging uses a commons-logging.jar specific to a particular logging framework, instead of discovery. This takes out the guessing, is simpler, faster and more robust. Just like you chose a logging implementation, you should also use a matching commons-logging - for example you download log4j.jar and commons-logging-log4j.jar, or use jdk logging and use commons-logging-jdk.jar.

A similar packaging is used by Eclipse SWT - they provide a common widget API, but each platform uses a different implementation jar - instead of using a complex discovery/plugin mechanism.

This package generates commons-logging-jdk14.jar - i.e. the java.util implementation of commons-logging api.

PM MAIL   Вверх
batigoal
Дата 29.9.2007, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 11
Всего: 151



drHip, я пробовал тогда под Ant 1.6. В понедельник поэкспериментирую с семеркой, попробуем разобраться.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
drHip
Дата 1.10.2007, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 30.5.2007

Репутация: нет
Всего: нет



batigoal, ждем-с
PM MAIL   Вверх
batigoal
Дата 2.10.2007, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 11
Всего: 151



drHip, у меня сейчас скомпилировать не получилось, но с другой ошибкой (ArrayIndexOutOfBounds).

Я добавлял еще jasper-compiler.jar.
Цитата(drHip @  27.9.2007,  18:09 Найти цитируемый пост)
смотрю в jasper, package org.apache.juli.logging существует, а самого LogFactory нет
И где его искать?

Поиск утверждает, что в Томкат 5.5 он есть. Может, у тебя по версиям несинхрон? Откуда ты брал джасперовские библиотеки?

Добавлено через 4 минуты и 21 секунду
В шестерке тоже должен быть, судя по доке...


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
drHip
Дата 2.10.2007, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 30.5.2007

Репутация: нет
Всего: нет



я использую из Tomcat 5
jasper-compiler-jdt.jar
jasper-compiler.jar
jasper-runtime.jar
потому как в 6-ке не нашел jasper-runtime.jar
catalina-ant.jar  у меня из 6-ки (поменяв на 5-ку ничего не изменилось)

PM MAIL   Вверх
dive
Дата 25.10.2007, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 25.10.2007
Где: Санкт-Петербург

Репутация: нет
Всего: 5



может пригодится кому.
утилита для сборки Ant скриптов из командной строки http://divehome.blogspot.com/2007/10/ant.html
PM MAIL WWW Skype GTalk Jabber MSN   Вверх
LSD
Дата 25.10.2007, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 15
Всего: 538



Цитата(dive @  25.10.2007,  15:34 Найти цитируемый пост)
утилита для сборки Ant скриптов из командной строки

Не понял зачем эта утилита вообще нужна?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
dive
Дата 25.10.2007, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 25.10.2007
Где: Санкт-Петербург

Репутация: нет
Всего: 5



Цитата(LSD @ 25.10.2007,  18:42)
Цитата(dive @  25.10.2007,  15:34 Найти цитируемый пост)
утилита для сборки Ant скриптов из командной строки

Не понял зачем эта утилита вообще нужна?

к примеру, у меня build.xml содержит в себе 42 цели сборки (например по моделям телефонов, ибо ресурсы и код разнятся), чтобы запустить сборку конкретной модели мне необходимо писать следующее :
Код

ant "Build Nokia N80 (GMG On, All Lang) Master Build"

помнить все 42 цели мне не очень то хочется, а если проект не один то и не получится, поэтому я запускаю в каталоге со сриптом эту утилиту, она выводит на экран все таргеты для сборки, я выбираю нужную и жму Enter.

PM MAIL WWW Skype GTalk Jabber MSN   Вверх
LSD
Дата 25.10.2007, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 15
Всего: 538



Хм, весьма экзотическая ситуация.
Я бы ограничился батником или разными билдами.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java tools & IDE's | Следующая тема »


 




[ Время генерации скрипта: 0.1992 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.