生成动态选择.jar文件的类路径

时间:2015-07-21 12:16:45

标签: java ant classpath

我有一个项目,我们存储一些客户端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的选项,它们是否有效?

如果有人有更好的方法做到这一点,我会非常乐意听到它!

3 个答案:

答案 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

的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”任务确保它安装在第一个ant run
  • “cachepath”任务将创建用于javac,junit和java任务的类路径。
  • “报告”和“清理缓存”任务是有用的附加任务。

的ivy.xml

<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更受青睐。

答案 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>

在这里找到

https://ant.apache.org/manual/using.html#path