我有一个项目,我们存储一些客户端API jar的本地副本。这些jar可能与客户端使用的最终运行时版本相同或不同。当我在本地构建项目进行测试时,我想使用jar的本地副本。但是,当我在客户端现场时,我想查看项目中的外部位置,并检查客户端更新的jar是否可用。如果他们是我们使用它们,如果不是,我们会回到我们的本地副本。
我找到了一种有条件地构建包含给定jar的文件集的方法,但是我无法弄清楚如何将文件集放入我的类路径中。
以下是我到目前为止生成的脚本。我无法访问ant-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>
根据documentation for path-like structures,您可以在其他路径中包含路径,但我没有看到包含外部文件集的示例。也许我已经回答了我的问题 - 我应该建立路径而不是文件集吗?此外,file-set documentation实际上并未包含添加ID的选项,它们是否有效?
如果有人有更好的方法做到这一点,我会非常乐意听到它!
答案 0 :(得分:1)
我建议使用依赖管理器,而不是尝试构建自己的。
Apache ivy能够从配置的位置下载依赖项。它还会缓存下载的文件,如果它们可以从Maven Central普遍使用,则无需在本地存储它们。
此项目有一个常春藤设置文件,可以从本地“lib”目录或Maven central中提取依赖项。
├── 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
<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-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>
注意:
<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>
注意:
答案 1 :(得分:0)
我对ant不是很熟悉,但是在ant上构建配置怎么样?
尝试使用此网站获取有关如何操作的教程:http://ant.apache.org/easyant/history/trunk/howto/BuildConfigurations.html
答案 2 :(得分:0)
尝试这样的事情
<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>
在这里找到