Сценарий Ant для выбора между несколькими версиями путей к классам

Я новичок в скриптах Ant.

ниже описание требования

в моем рабочем пространстве есть различные проекты, и мне нужно, чтобы мой проект работал в RAD и eclipse IDE, а также в среде Websphere, tomcat и jboss. кот и jboss..

но есть изменения в нескольких файлах, таких как путь к классам и несколько файлов конфигурации.

это оставляет мне три версии рабочей области.

но моя идея состоит в том, чтобы иметь одно рабочее пространство с несколькими версиями пути к классам, например. classpath_eclipse, classpath_rad и т. д. и иметь скрипт ant, который будет выбирать между правильными файлами во время сборки в зависимости от того, какой ide.

Итак, ребята, предложите какой-нибудь подход, как я могу реализовать этот подход. совершенно новый для муравья. .:/


person Mukul Goel    schedule 29.05.2012    source источник
comment
Хотите управлять средой IDE или целевыми средами сборки? Подробности: Пути к классам управляются по-разному в Eclipse и ANT... Хотите ли вы, чтобы ANT генерировал для вас файлы .classpath? В качестве альтернативы требуется ли управлять разными путями к классам, связанными с разными целевыми средами? Например, у Tomcat могут быть не все банки, упакованные с веб-сферой?   -  person Mark O'Connor    schedule 29.05.2012
comment
Мне нужно, чтобы мое рабочее пространство работало на двух IDEs Eclipse as well as RAD. so I want ANT to generate the ".classpath" files. Yes the requirement for different classpaths is associated with different target environments as well as IDE. the dependency on environment is as u said. on IDE it occurs because i have some project related plugins that are RAD compatible but not eclipse. those plugin provide me with a set of library in RAD. whereas in eclipse i have to create a "User Library". so requirement to manage different classpaths is associated with different target environments as well as IDE   -  person Mukul Goel    schedule 30.05.2012


Ответы (2)


Я бы предложил использовать Apache ivy для управления сложными путями к классам. Он выносит зависимости вашей сборки в отдельный файл ivy.xml.

Во-вторых, ivy может автоматически загружать такие зависимости, уменьшая размер вашего проекта под контролем исходного кода.

Наконец, это решение на первый взгляд может показаться ужасно сложным. Его преимущество в том, что он совместим с другими технологиями сборки, такими как Maven.

Пример

плющ.xml

Ivy использует «конфигурации» для управления логическими группами банок.

В этом примере код компилируется с помощью API-файлов SLF4J, но во время выполнения используются разные реализации ведения журнала:

<ivy-module version="2.0">
    <info organisation="com.myspotontheweb" module="demo"/>

    <configurations>
        <conf name="compile" description="Required to compile application"/>
        <conf name="runtime.simple"  description="Runtime environment with minimal logging" extends="compile"/>
        <conf name="runtime.complex" description="Runtime environment with logback enabled" extends="compile"/>
        <conf name="test"    description="Required for test only" extends="runtime.simple"/>
        <conf name="build"   description="ANT tasks used by build"/>
    </configurations>

    <dependencies>
        <!-- compile dependencies -->
        <dependency org="org.slf4j" name="slf4j-api" rev="1.6.4" conf="compile->default"/>

        <!-- simple runtime dependencies -->
        <dependency org="org.slf4j" name="slf4j-simple" rev="1.6.4" conf="runtime.simple->default"/>

        <!-- complex runtime dependencies -->
        <dependency org="ch.qos.logback" name="logback-classic" rev="1.0.3" conf="runtime.complex->default"/>

        <!-- test dependencies -->
        <dependency org="junit" name="junit" rev="4.10" conf="test->default"/>

        <!-- Build dependencies -->
        <dependency org="org.codehaus.groovy" name="groovy-all" rev="1.8.6" conf="build->default"/>
    </dependencies>

</ivy-module>

Примечания:

  • Атрибут extends позволяет создавать наборы объединений jar.
  • По умолчанию ivy загружается из Maven Central (открытый репозиторий, в котором сейчас размещено около 90% программного обеспечения Java с открытым исходным кодом). .
  • Используя атрибут conf, вы можете связать зависимость с одной или несколькими вашими локально определенными конфигурациями.
  • Ivy также можно использовать для управления зависимостями сторонних задач ANT.

build.xml

Задачи Ivy ANT импортируются как antlib. Задача ivy cachepath используется для превращения управляемого ivy конфигурации в обычные ANT пути и ivy report создает отчет о зависимостях.

<project name="demo" default="build" xmlns:ivy="antlib:org.apache.ivy.ant">

    <target name="init">
        <ivy:resolve/>

        <ivy:report todir='${ivy.reports.dir}' graph='false' xml='false'/>

        <ivy:cachepath pathid="compile.path" conf="compile"/>
        <ivy:cachepath pathid="runtime.simple.path" conf="runtime.simple"/>
        <ivy:cachepath pathid="runtime.complex.path" conf="runtime.complex"/>
        <ivy:cachepath pathid="test.path"    conf="test"/>
        <ivy:cachepath pathid="build.path"   conf="build"/>
    </target>
    ..
    ..

Задача ivy retrive используется для заполнения каталога во время этап упаковки вашего приложения:

<target name="war">
    <ivy:retrieve pattern="${build.dir}/libs/[artifact].[ext]" conf="runtime.complex"/>

    <war destfile="myapp.war" webxml="src/metadata/myapp.xml">
        <fileset dir="${src.dir}/html/myapp"/>
        <fileset dir="${src.dir}/jsp/myapp"/>
        <lib dir="${build.dir}/libs"/>
        <classes dir="${build.dir}/classes"/>
    </war>
</target>

Файлы конфигурации IDE

Доступен плагин Eclipse для ivy.

Также можно создавать файлы конфигурации IDE с помощью встроенной задачи groovy. Ниже приведен пример Eclipse:

<target name="eclipse">
    <taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy" classpathref="build.path"/>

    <ivy:cachefileset setid="libfiles" conf="compile"/>

    <groovy>
    <arg value="${src.dir}"/>
    <arg value="${build.dir}/classes"/>

    import groovy.xml.MarkupBuilder

    //
    // Generate the project file
    //
    project.log("Creating .project")

    new File(".project").withWriter { writer ->
        def xml = new MarkupBuilder(writer)

        xml.projectDescription() {
            name(project.name)
            comment()
            projects()
            buildSpec() {
                buildCommand() {
                    name("org.eclipse.jdt.core.javabuilder")
                    arguments()
                }
            }
            natures() {
                nature("org.eclipse.jdt.core.javanature")
            }
        }
    }

    //
    // Generate the classpath file
    //
    // The "lib" classpathentry fields are populated using the ivy artifact report
    //
    project.log("Creating .classpath")

    new File(".classpath").withWriter { writer ->
        def xml = new MarkupBuilder(writer)

        xml.classpath() {
            classpathentry(kind:"src",    path:args[0])
            classpathentry(kind:"output", path:args[1])
            classpathentry(kind:"con",    path:"org.eclipse.jdt.launching.JRE_CONTAINER")

            project.references.libfiles.each {
                classpathentry(kind:"lib", path:it)
            }
        }
    }
    </groovy>        
</target>
person Mark O'Connor    schedule 30.05.2012
comment
эй, Марк, я не знал, что снова задаю тот же вопрос, новичок на этом форуме .. извиняюсь. - person Mukul Goel; 28.06.2012
comment
использование ivy и groovy выглядит довольно сложным, и ill have to redo all current implementation.. could u suggest some approach to implement what i asked in that second question ? because thats how the architect has suggested and the approach has been approved.. ill придется пройти очень долгий путь, чтобы предложить новый подход.. :( - person Mukul Goel; 28.06.2012
comment
Проблема, которую вы пытаетесь решить, нетривиальна. Прежде всего, вы пытаетесь поддерживать несколько экземпляров двух разных инструментов сборки. У каждого свой формат файла. Во-вторых, по сути, вы создаете свою собственную систему управления зависимостями... Я видел очень большие проекты ANT, использующие файлы свойств для управления путями к классам модулей.... В конечном итоге это становится индивидуальным решением, которое поймут один или два инженера по сборке. ...... Подумайте еще раз об использовании плюща. Наконец, есть также плагин ivy для взаимодействия с eclipse. Это может избежать необходимости в заводных вещах. - person Mark O'Connor; 28.06.2012
comment
эй Марк .. я понял , что вы сказали. подготовил проект и предложил изменения моей команде и архитектору. что мне предложили (и СКАЗАЛИ:/), что мы не собираемся изменять процесс сборки. нам просто нужен скрипт, который пользователь запускает в первый раз, который устанавливает пути к классам, время выполнения и другие настройки и т. д., и после этого мы можем использовать наш обычный процесс сборки. Я покопался в плюще, и он выглядит круто. Но ничего не могу с этим поделать. Спасибо за знакомство с этой технологией. -С уважением Мукул - person Mukul Goel; 03.07.2012
comment
Привет, Марк. Как я уже говорил, я должен использовать предыдущий подход. Это то, что мне нужно обработать: пути к классам и конфигурации времени выполнения. Не могли бы вы дать некоторые рекомендации. Спасибо - Мукул - person Mukul Goel; 10.07.2012
comment
@MukulGoel продолжайте читать stackoverflow :-) Например: stackoverflow.com/questions/11417304/ - person Mark O'Connor; 10.07.2012
comment
хотя мое предложение использовать плющ было отклонено. Но я приложил свои усилия к изучению этой структуры, и это хороший подход к моему решению. - person Mukul Goel; 29.09.2012
comment
Я хотел бы поделиться подходом, который я реализовал. Были пути к классам, настройки и некоторые XML-файлы конфигурации проекта, которые зависели от времени выполнения. В каждом проекте мы создали версию runtime_classpah & runtime_settings и configxml_runtime каждого файла. Создал цель в ant, которая принимает время выполнения в качестве параметра, перебирает каждый проект и копирует содержимое classpath_runtime в classpath, settings_runtime в настройки. И цель, которая перезаписывает configxml содержимым configxml_runtime - person Mukul Goel; 29.09.2012

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

Были classpath, settings и некоторые project config xmls, которые зависели от времени выполнения.

В каждом проекте мы создали версии runtime_classpah, runtime_settings и configxml_runtime каждого файла.

Создал target в ant, который принимает runtime в качестве параметра, перебирает каждый проект и копирует содержимое classpath_runtime в classpath, setting_runtime to settings.

И цель, которая перезаписывает configxml содержимым configxml_runtime

person Mukul Goel    schedule 26.10.2012
comment
Это проблема, которую фреймворки управления зависимостями призваны решить за вас. - person Mark O'Connor; 26.10.2012
comment
@MarkO'Connor, вы правы, сэр, и, как я уже говорил, я читал о ivy, и мне это понравилось. но решение о выборе было не в моих руках, и выше был предложен подход, который мне предложили использовать, учитывая усилия, которые потребовал ivy, и ограничения по времени доставки. - person Mukul Goel; 26.10.2012