我有一个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一样下载库
- 您的库已经可以从Maven Central(无需将其存储在您自己的网站上)
使用项目的开发人员只需要将Ivy jar安装到以下位置之一:
- $ HOME/.ant/lib
- ANT_HOME美元/lib
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存储库可以存储同一工件的多个版本,而无需额外配置。
所需步骤:
-
安装Maven Artifact Resolver Ant Tasks uber JAR, Ant可以找到它(就像在前面的答案中安装Ivy一样)。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
中,并按名称选择一个