在Ant构建任务中包含外部资源

时间:2011-12-05 12:46:12

标签: ant resources include external task

我有一个Ant构建脚本来生成一些类。该过程需要外部库。由于我需要为许多不同的模块执行此任务,所以我不想每次都复制lib,我不想将其引用到localy,因为这需要所有开发人员首先下载lib。 如何引用和包含外部资源? 到目前为止这是我的设置

<project name="generate" basedir=".">

    <property name="src" location="src/main/java"/>
    <property name="generated" location="target/classes"/>
    <property name="build" location="src/main/java"/>

    <path id="cp">
        <fileset dir="path/to/lib" includes="**/querydsl-jpa-2.2.3-apt-one-jar.jar"/>
    <fileset dir="path/to/.m2" includes="**/*.jar"/>
    </path>


  <target name="compile" >
    <!-- Compile the java code from ${src} into ${build} -->
    <javac srcdir="${src}" classpathref="cp" includeantruntime="false">
      <compilerarg value="-proc:only"/>      
      <compilerarg value="-processor"/>
      <compilerarg value="com.mysema.query.apt.QuerydslAnnotationProcessor"/>
      <compilerarg value="-s"/>
      <compilerarg value="${generated}"/>
    </javac>

    <!-- compilation -->
    <javac classpathref="cp" destdir="${build}" includeantruntime="false">      
      <src path="${src}"/>
      <src path="${generated}"/>
    </javac>  
  </target>

</project>

现在我在某个远程位置有querydsl-jpa-2.2.3-apt-one-jar.jar,我也想引用我们的内部maven存储库而不是本地的.m2目录,所以我需要引用远程位置并从那里包含库。

2 个答案:

答案 0 :(得分:1)

我建议您使用Apache ivy ANT插件。它可以通过两种方式帮助您:

  1. Ivy可以像Maven
  2. 一样下载库
  3. 您的图书馆已经可以从Maven Central获取(无需将其存储在您自己的网站上)
  4. 使用您的项目的开发人员只需要将ivy jar安装到以下位置之一:

    • $ HOME /赵军阳张志利/ lib中
    • $ ANT_HOME / lib中

    的build.xml

    常春藤解决任务下载(和缓存)依赖项(可在 ivy.xml 文件中找到)。 缓存路径任务会自动填充类路径:

    <project name="generate" basedir="." xmlns:ivy="antlib:org.apache.ivy.ant">
    
        <property name="src" location="src/main/java"/>
        <property name="generated" location="target/classes"/>
        <property name="build" location="src/main/java"/>
    
        <target name="resolve" >
            <ivy:resolve/>
            <ivy:cachepath pathid="cp" conf="compile"/>
        </target>
    
        <target name="compile" depends="resolve">
        ..
    

    的ivy.xml

    在此声明依赖关系:

    <ivy-module version="2.0" xmlns:e="http://ant.apache.org/ivy/extra">
    
        <info organisation="com.myspotontheweb" module="demo"/>
    
        <configurations defaultconfmapping="compile->default"/>
    
        <dependencies>
            <!-- Your jar -->
            <dependency org="com.mysema.querydsl" name="querydsl-jpa" rev="2.2.3" >
                <artifact name="querydsl-jpa" type="jar" m:classifier="apt-one-jar"/>
            </dependency>
    
            <!-- Other Maven dependencies -->
            <dependency org="commons-lang" name="commons-lang" rev="2.6"/>
            ..
    
        </dependencies>
    
    </ivy-module>
    

    querydsl-jpa-2.2.3-apt-one-jar.jar jar特别需要额外的classifier规范。如果它是Maven依赖项,则将声明如下:

    <dependency>
        <groupId>com.mysema.querydsl</groupId>
        <artifactId>querydsl-jpa</artifactId>
        <version>2.2.3</version>
        <classifier>apt-one-jar</classifier>
    </dependency>
    

    ivysettings.xml

    Ivy可以配置为使用您的Maven存储库(就像Maven客户端一样):

    <ivysettings>
        <settings defaultResolver="maven-repo"/>
        <resolvers>
            <ibiblio name="maven-repo" m2compatible="true" root="http://myrepo.mycompany.com/maven-central-proxy"/>
        </resolvers>
    </ivysettings>
    

答案 1 :(得分:0)

一种替代方法是使用Maven Artifact Resolver Ant Tasks

此选项基本上与使用Ivy类似。主要区别:

  • 相关性是在build.xml文件中定义的,而不是使用单独的ivy.xml文件。
  • 下载的依赖项缓存在本地Maven存储库中,供其他项目(包括基于Maven的项目)使用。
  • Maven存储库可以存储同一工件的多个版本,而无需额外的配置。

所需步骤:

  • 在ant可以找到它的JAR中安装Maven Artifact Resolver Ant Tasks(例如在上一个答案中安装Ivy)。可以从here下载JAR。

  • 将此属性添加到ant项目定义中: xmlns:resolver="antlib:org.apache.maven.resolver.ant"

  • 添加一个解析目标,该目标标识您需要的工件并将标识符与创建的类路径相关联(见下文)

  • 与Ivy一样,使您的javac任务依赖于resolve任务并引用类路径,例如classpathref="cp"

以下是使用Maven解决的目标:

<target name="resolve-maven">
    <resolver:resolve>
      <dependencies>
        <dependency coords="org.jetbrains:annotations:20.1.0"/>
      </dependencies>
      <path refid="cp" classpath="compile"/>
    </resolver:resolve>
</target>

为进行比较,以下是使用Ivy解决的类似目标:

<target name="resolve-ivy">
    <ivy:retrieve/>
    <ivy:cachepath pathid="cp" conf="compile"/>
</target>

如果愿意,可将两者都放在build.xml中,并按名称选择一个。