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



我有一个Ant构建脚本来生成一些类。该过程需要一个外部库。因为我需要这个任务的很多不同的模块,我不想每次复制库,我不想引用它的本地,因为这将要求所有的开发人员首先下载库。如何引用和包含外部资源?这是我目前的设置

<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目录,所以我需要引用远程位置并从那里包含库。

建议您使用Apache Ivy Ant插件。它可以在两个方面帮助你:

    Ivy可以像Maven一样下载库
  1. 您的库已经可以从Maven Central(无需将其存储在您自己的网站上)

使用项目的开发人员只需要将Ivy jar安装到以下位置之一:

  • $ HOME/.ant/lib
  • ANT_HOME美元/lib
<标题> build . xml

Ivy 解析任务下载(和缓存)依赖(在 Ivy .xml文件中找到)。cachepath任务自动填充类路径:

<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-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特别需要一个额外的分类器规范。如果它是一个Maven依赖,它将被声明如下:

<dependency>
    <groupId>com.mysema.querydsl</groupId>
    <artifactId>querydsl-jpa</artifactId>
    <version>2.2.3</version>
    <classifier>apt-one-jar</classifier>
</dependency>
<标题> ivysettings.xml h1> vy可以配置为使用您的Maven存储库(就像Maven客户端一样):
<ivysettings>
    <settings defaultResolver="maven-repo"/>
    <resolvers>
        <ibiblio name="maven-repo" m2compatible="true" root="http://myrepo.mycompany.com/maven-central-proxy"/>
    </resolvers>
</ivysettings>

另一种选择是使用Maven工件解析器Ant任务。

这个选项基本上类似于使用Ivy。主要区别:

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

所需步骤:

  1. 安装Maven Artifact Resolver Ant Tasks uber JAR, Ant可以找到它(就像在前面的答案中安装Ivy一样)。JAR可以从这里下载。

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

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

  4. 与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中,并按名称选择一个

相关内容

  • 没有找到相关文章