我有一个项目,我们存储一些客户端API jar的本地副本。这些jar文件可能与客户机使用的最终运行时版本相同,也可能不同。当我在本地构建项目进行测试时,我希望使用jar的本地副本。但是,当我与客户端在现场时,我想查看项目中的外部位置,并检查客户端更新的jar是否可用。如果是,我们就使用它们,如果不是,我们就返回到本地副本。
我已经找到了一种有条件地构建包含给定jar的文件集的方法,但是我不知道如何将文件集放入我的类路径中。
下面是我到目前为止生成的脚本。我没有访问anti -contrib IF语句的权限,所以这是我找到的有条件地构建文件集的唯一方法。
<condition property="externalFileExists">
<available file="[path to external file]"/>
</condition>
<target name="buildExternalFileset" if="externalFileExists">
<fileset id="fileset" includes="[path to external library]"/>
</target>
<target name="buildInternalFileset" unless="externalFileExists">
<fileset id="fileset" includes="[path to internal library]"/>
</target>
<target name="buildFileset depends="buildExternalFileset, buildInternalFileSet>
</target>
一旦我构建了这个文件集,我如何将它包含在类路径中?
<path id="classpath">
<!-- other filesets -->
<!-- line that includes the conditional fileset by ID -->
</path>
根据类路径结构的文档,您可以在另一个路径中包含路径,但我没有看到包含外部文件集的示例。也许我已经回答了我的问题——我应该构建路径而不是文件集吗?此外,文件集文档实际上不包括添加id的选项,它们有用吗?
如果有人有更好的方法来做到这一点,我将非常高兴听到它!
我建议使用依赖项管理器,而不是尝试构建自己的依赖项管理器。
Apache ivy能够从配置的位置下载依赖。它还缓存下载的文件,如果它们在Maven Central中普遍可用,则无需将它们存储在本地。
<标题> 例子这个项目有一个ivy设置文件,它从本地"lib"目录或Maven中心提取依赖项。
├── build.xml
├── ivysettings.xml
├── ivy.xml
└── lib
├── hamcrest-core-1.3.jar
├── junit-4.11.jar
├── log4j-1.2.17.jar
├── slf4j-api-1.7.5.jar
└── slf4j-log4j12-1.7.5.jar
build . xml
<project name="demo" default="resolve" xmlns:ivy="antlib:org.apache.ivy.ant">
<property name="build.dir" location="target"/>
<available classname="org.apache.ivy.Main" property="ivy.installed"/>
<target name="install-ivy" unless="ivy.installed">
<mkdir dir="${user.home}/.ant/lib"/>
<get dest="${user.home}/.ant/lib/ivy.jar" src="http://search.maven.org/remotecontent?filepath=org/apache/ivy/ivy/2.4.0/ivy-2.4.0.jar"/>
<fail message="Ivy installed run build again"/>
</target>
<target name="resolve" depends="install-ivy" description="Use ivy to resolve classpaths">
<ivy:resolve/>
<ivy:report todir='${build.dir}/ivy-reports' graph='false' xml='false'/>
<ivy:cachepath pathid="compile.path" conf="compile"/>
<ivy:cachepath pathid="test.path" conf="test"/>
</target>
<target name="clean">
<delete dir="${build.dir}"/>
</target>
<target name="clean-all" depends="clean">
<ivy:cleancache/>
</target>
</project>
指出:
- Ivy没有捆绑在ANT中。"install-ivy"任务确保它在第一次运行 时被安装。
- "cachepath"任务将创建用于javac, junit和java任务的类路径。 "report"one_answers"cleancache"任务是有用的附加任务。
中
<ivy-module version="2.0">
<info organisation="com.myspotontheweb" module="demo"/>
<configurations>
<conf name="compile" description="Required to compile application"/>
<conf name="runtime" description="Additional run-time dependencies" extends="compile"/>
<conf name="test" description="Required for test only" extends="runtime"/>
</configurations>
<dependencies>
<!-- compile dependencies -->
<dependency org="org.slf4j" name="slf4j-api" rev="1.7.5" conf="compile->default"/>
<!-- runtime dependencies -->
<dependency org="org.slf4j" name="slf4j-log4j12" rev="1.7.5" conf="runtime->default"/>
<!-- test dependencies -->
<dependency org="junit" name="junit" rev="4.11" conf="test->default"/>
</dependencies>
</ivy-module>
指出:
- 使用配置来保持依赖分离。注意"cachepath"任务是如何使用它来控制依赖类路径的
ivysettings.xml
<ivysettings>
<settings defaultResolver="my-resolvers"/>
<resolvers>
<chain name="my-resolvers" returnFirst="true">
<filesystem name="local-lib">
<artifact pattern="${ivy.settings.dir}/lib/[artifact]-[revision].[ext]"/>
</filesystem>
<ibiblio name="central" m2compatible="true"/>
</chain>
</resolvers>
</ivysettings>
指出:
- 这个文件是可选的。默认情况下,Ivy将从Maven Central 检索
- 特殊的链解析器控制使用哪个依赖源。在这种情况下,本地"lib"目录比Maven Cental更受青睐。
我不是很熟悉ant,但是如何在ant上构建配置呢?
试试这个网站的教程:http://ant.apache.org/easyant/history/trunk/howto/BuildConfigurations.html
试试这样
<classpath>
<fileset dir="[external-path1]">
<include name="**/*.jar"/>
</fileset>
<fileset dir="[external-path2]">
<include name="**/*.jar"/>
</fileset>
<fileset dir="[external-path3]">
<include name="**/*.jar"/>
</fileset>
</classpath>
在这里找到
https://ant.apache.org/manual/using.html路径