cuiyi's blog(崔毅 crazycy)

记录点滴 鉴往事之得失 以资于发展
数据加载中……

ant脚本的javac怎么检测源码文件夹是否存在 ant javac check folder exists or not

遇到了问题,编译的时候,有一些目录,比如
tr\src
tr\src_x1 for prj X1
tr\src_x2 for prj X2
_______  for prj X3, X3中没有,怎么设置ant脚本呢?

<target name="compile-tr">
        <mkdir dir="${tr.classes.dir}" />
        <javac destdir="${tr.classes.dir}" debug="${compiler.debug}" optimize="${compiler.optimize}" source="${compiler.source}" target="${compiler.target}" deprecation="true">
            <classpath>
                <path refid="devel.lib" />
            </classpath>
            <src path="${tr.src.dir}" />
            <src path="${tr.src.dir}_${project.code}" />
        </javac>
</target>

在编译X3的时候,这肯定是失败的。

怎么办呢? 通过Condition和Avaliable来实现。(贴一个粗糙的示范实现)


<target name="compile-3tr" depends="dir.check" if="dir.exists">
        <mkdir dir="${tr.classes.dir}" />
        <javac destdir="${tr.classes.dir}" debug="${compiler.debug}" optimize="${compiler.optimize}" source="${compiler.source}" target="${compiler.target}" deprecation="true">
            <classpath>
                <path refid="devel.lib" />
            </classpath>
            <src path="${tr.src.dir}" />
            <src path="${tr.src.dir}_${project.code}" />
        </javac>
</target>
    
    <target name="dir.check">
        <condition property="dir.exists" value="true">
            <available file="${tr.src.dir}_${project.code}" type="dir"/>
        </condition>
        <mkdir dir="${tr.classes.dir}" />
    </target>

居然在网上找到一个更赞的招

<target name="go" depends="file-checks, do-something-with-first-file, do-something-with-second-file"/>

<target name="file-checks">
   <available file="/home/doc/somefile"  property="first.file.found"/>
   <available file="/usr/local/somefile" property="second.file.found"/>
</target>

<target name="do-something-with-first-file" if="first.file.found">
   ???
</target>

<target name="do-something-with-second-file" if="second.file.found">
   ???
</target>

原来if....then....else需要ant-contrib的支持,怪不得我一直失败
ant-contrib

<if>
    <available file="file1"/>
    <then>
      <property name="file.exists" value="true"/>
    </then>
    <else>
      <if>
        <available file="file2"/>
        <then>
          <copy file="file2" tofile="file1"/>
          <property name="file.exists" value="true"/>
        </then>
      </if>
    </else>
  </if>

最后我很生气的找到了apache本身的技术文档 

If/Unless Attributes

http://ant.apache.org/manual/properties.html#if+unless

If/Unless Attributes

The <target> element and various tasks (such as <fail>) and task elements (such as <test> in <junit>) support if and unless attributes which can be used to control whether the item is run or otherwise takes effect.

In Ant 1.7.1 and earlier, these attributes could only be property names. The item was enabled if a property with that name was defined - even to be the empty string or false - and disabled if the property was not defined. For example, the following works but there is no way to override the file existence check negatively (only positively):

<target name="-check-use-file">
    <available property="file.exists" file="some-file"/>
</target>
<target name="use-file" depends="-check-use-file" if="file.exists">
    <!-- do something requiring that file -->
</target>
<target name="lots-of-stuff" depends="use-file,other-unconditional-stuff"/>
  
As of Ant 1.8.0, you may instead use property expansion; a value of true (or on or yes) will enable the item, while false (or off or no) will disable it. Other values are still assumed to be property names and so the item is enabled only if the named property is defined.

Compared to the older style, this gives you additional flexibility, because you can override the condition from the command line or parent scripts:

<target name="-check-use-file" unless="file.exists">
    <available property="file.exists" file="some-file"/>
</target>
<target name="use-file" depends="-check-use-file" if="${file.exists}">
    <!-- do something requiring that file -->
</target>
<target name="lots-of-stuff" depends="use-file,other-unconditional-stuff"/>
  
Now ant -Dfile.exists=false lots-of-stuff will run other-unconditional-stuff but not use-file, as you might expect, and you can disable the condition from another script too:

<antcall target="lots-of-stuff">
    <param name="file.exists" value="false"/>
</antcall>
  
Similarly, an unless attribute disables the item if it is either the name of property which is defined, or if it evaluates to a true-like value. For example, the following allows you to define skip.printing.message=true in my-prefs.properties with the results you might expect:

<property file="my-prefs.properties"/>
<target name="print-message" unless="${skip.printing.message}">
    <echo>hello!</echo>
</target>

posted on 2013-04-16 14:52 crazycy 阅读(3553) 评论(3)  编辑  收藏 所属分类: JavaEE技术

评论

# re: ant脚本的javac怎么检测源码文件夹是否存在 ant javac check folder exists or not  回复  更多评论   

public static void setpartV() throws WTException, WTPropertyVetoException {

WTPart part = null;
String vers = "B";
String iteration = "2";
wt.series.MultilevelSeries multilevelseries = null;
part = (WTPart) wt.vc.VersionControlHelper.service.newVersion(part);
// 设置大版本
if (part.getMaster() != null) {
String vseries = part.getMaster().getSeries();
if (vseries == null) {
if (part instanceof wt.inf.container.WTContained
&& (wt.inf.container.WTContained) part.getContainer() != null) {
multilevelseries = wt.vc.VersionControlHelper
.getVersionIdentifierSeries(part);
wt.vc.VersionControlServerHelper.changeSeries(
part.getMaster(),
multilevelseries.getUniqueSeriesName());
}
} else {
multilevelseries = MultilevelSeries.newMultilevelSeries(vers);
}
if (multilevelseries == null)
multilevelseries = wt.series.MultilevelSeries
.newMultilevelSeries("wt.vc.VersionIdentifier", vers);
if (vers != null && !"".equals(vers))
multilevelseries.setValueWithoutValidating(vers);
wt.vc.VersionIdentifier versionidentifier = wt.vc.VersionIdentifier
.newVersionIdentifier(multilevelseries);
wt.vc.VersionControlServerHelper.setVersionIdentifier(part,
versionidentifier, false);
}
// 设置小版本
wt.series.Series series = wt.series.Series.newSeries(
"wt.vc.IterationIdentifier", iteration);
wt.vc.IterationIdentifier iterationid = wt.vc.IterationIdentifier
.newIterationIdentifier(series);
wt.vc.VersionControlHelper.setIterationIdentifier((Iterated) part,
iterationid);
part.setFederatableInfo(new FederatableInfo());

}
2013-04-16 16:24 | 11

# re: ant脚本的javac怎么检测源码文件夹是否存在 ant javac check folder exists or not  回复  更多评论   

感谢博主分享,学到了很多,利博亚洲www.libofun.com
2013-04-16 16:45 | sdfsda

# re: ant脚本的javac怎么检测源码文件夹是否存在 ant javac check folder exists or not  回复  更多评论   

他 们 在那?
2013-05-04 09:21 | 张治仕

只有注册用户登录后才能发表评论。


网站导航: