【问题标题】:Ant - build script does not find pathelement defined in a properties fileAnt - 构建脚本找不到属性文件中定义的路径元素
【发布时间】:2013-03-25 04:12:48
【问题描述】:

我有一个具有以下目标的 ant 构建脚本:

<target name="_initLiveProps">
        <property file="buildscripts/live.properties"/>
</target>

<target name="buildLive"  depends="_initLiveProps">
        <property file="buildscripts/live.properties"/>
</target>

在构建脚本中,我声明了几个路径元素,如下所示:

<path id="project.class.path">      
        <pathelement location="./../lib/log4j-1.2.16.jar" />
        <pathelement location="${product-def.jar}"/>
</path>

product-def.jar 定义在 buildscripts/live.properties 文件中定义为

product-def.jar=./../lib/product-def/live/product-def.jar

当我构建项目(使用 ant buildLive)时,我得到编译错误,主要是因为它找不到 product-def.jar 中定义的类。

我尝试打印出如下所示的类路径

<property name="myclasspath" refid="project.class.path"/>
<echo message="${myclasspath}" />

输出为c:\product\lib\log4j-1.2.16.jar;c:\product\${product-def.jar}

以上说明以下定义不正确

<pathelement location="${product-def.jar}"/>

定义属性文件中定义的路径元素的正确方法是什么?

编辑

我认为问题在于 project.class.path 的定义是在属性文件加载到 buildLive 目标之前初始化的。 有没有办法将 project.class.path 的初始化延迟到 buildLive 目标完成之后?

【问题讨论】:

    标签: java ant build


    【解决方案1】:

    有没有办法将 project.class.path 的初始化延迟到 buildLive 目标完成之后?

    &lt;path&gt; 定义放在&lt;target&gt;

    <target name="_initLiveProps">
            <property file="buildscripts/live.properties"/>
            <path id="project.class.path">      
                    <pathelement location="./../lib/log4j-1.2.16.jar" />
                    <pathelement location="${product-def.jar}"/>
            </path>
    </target>
    

    &lt;path&gt; 将对所有(直接或间接)依赖于此的目标可见。

    如果您有多个加载不同属性的不同目标,例如_initLiveProps_initDevProps 等,那么你可以将&lt;path&gt; 定义成一个公共目标,如下所示

    <target name="classpath">
            <path id="project.class.path">      
                    <pathelement location="./../lib/log4j-1.2.16.jar" />
                    <pathelement location="${product-def.jar}"/>
            </path>
    </target>
    
    <target name="_loadLiveProps">
            <property file="buildscripts/live.properties"/>
    </target>
    <target name="_initLiveProps" depends="_loadLiveProps, classpath" />
    
    <target name="_loadDevProps">
            <property file="buildscripts/dev.properties"/>
    </target>
    <target name="_initDevProps" depends="_loadDevProps, classpath" />
    

    【讨论】:

    • 是的,这可能会起作用,但是我有很多依赖于路径的目标,我不能真正将 定义放在每个目标上。也许我可以创建一个他们每个人都依赖的新目标。
    • @ziggy 这就是我的意思 - 将 &lt;path&gt; 定义放在加载属性文件的同一目标中,大概所有需要路径的目标都已经依赖。
    • 我的意思是还有其他不依赖于 _initLiveProps 目标的目标。例如,加载开发属性的目标不依赖于加载实时属性文件的目标。
    • @ziggy 我明白你现在的意思了。我已经用一种可能的方式编辑了我的答案 - 您需要将现有的 _init... 目标重命名为其他名称,然后声明一个依赖于旧 _init... 的新目标后跟创建&lt;path&gt; 的目标。仅仅让现有的 _init... 依赖于类路径目标是行不通的,因为它会以错误的顺序执行操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    相关资源
    最近更新 更多