用于在多个版本的类路径之间进行选择的 Ant 脚本



我是 Ant 脚本的新手。

以下是需求说明

在我的工作区中,有各种各样的项目,我必须在RAD和eclipse IDE以及Websphere,tomcat和jboss环境中进行项目工作。 我已经做了项目特定的设置,使项目在RAD和Websphere以及Eclipse和Tomcat n jboss上工作。

但是有几个文件发生了变化,例如类路径和几个配置文件。

这给我留下了三个版本的工作区。

但我的想法是拥有一个工作区,其中包含多个版本的类路径,例如classpath_eclipse、classpath_rad等,并有一个 ant 脚本,该脚本将在构建过程中根据哪个 IDE 在正确的文件之间进行选择。

所以伙计们请提出一些方法,我该如何实施这种方法。 对蚂蚁来说是全新的。

我建议使用Apache ivy来管理复杂的类路径。它将生成依赖项外部化为单独的 ivy.xml 文件。

其次,ivy 可以自动下载此类依赖项,从而在源代码管理下减小项目的大小。

最后,乍一看,这个解决方案可能看起来非常复杂。它的优点是它与其他构建技术(如Maven)兼容。

常春藤.xml

Ivy使用"配置"来管理jar的逻辑分组。

在此示例中,代码针对 SLF4J api jar 进行编译,但在运行时使用不同的日志记录实现:

<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>

笔记:

  • 扩展属性允许创建 jar 联合集
  • 默认情况下,ivy 将从 Maven Central(一个开放的存储库,现在托管大约 90% 的 Java 开源软件)下载。
  • 使用 conf 属性,您可以将一个 depedency 与一个或多个本地定义的配置相关联。
  • 常春藤还可用于管理第三方 ANT 任务依赖关系

构建.xml

常春藤 ANT 任务作为 antlib 导入。常春藤缓存路径任务用于将常春藤托管配置转换为正常的 ANT 路径,常春藤报告任务生成依赖项报告。

<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 检索任务用于在应用程序的打包阶段填充目录:

<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插件是可用的。

  • http://ant.apache.org/ivy/ivyde/

也可以使用嵌入式时髦任务生成 IDE 配置文件。下面是一个 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>

我想分享我最终实施的方法。

classpathsettings和一些依赖于运行时的project config xmls

在每个项目中,我们为每个文件创建了一个runtime_classpah runtime_settingsconfigxml_runtime版本。

ant年创建了一个target,该将runtime作为参数,迭代每个项目并将classpath_runtime的内容复制到classpathsetting_runtime to settings

以及一个用configxml_runtime的内容覆盖configxml的目标

相关内容

  • 没有找到相关文章

最新更新