我有一个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目录,所以我需要引用远程位置并从那里包含库。
答案 0 :(得分:1)
我建议您使用Apache ivy ANT插件。它可以通过两种方式帮助您:
使用您的项目的开发人员只需要将ivy jar安装到以下位置之一:
常春藤解决任务下载(和缓存)依赖项(可在 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-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>
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
文件。所需步骤:
在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
中,并按名称选择一个。