使用ant scriptdef regex,获取javascript.EvaluatorException

时间:2015-01-06 16:15:37

标签: regex ant

环境:ANT 1.9.4,使用scriptdef javascript从文件名中检索版本号。

在选定的目录中,找到扩展名为.jar的文件名,获取所有文件名,遍历每个文件名以检索特定字符串并从该字符串中提取版本号。我使用scriptdef javascript来实现这一点。代码复制如下。

文件名格式是               " GeneralService_V1.2.jar" &安培;               " GeneralService_V10.6_SSL.jar&#34 ;.

用于检索 Vx.x 的正则表达式是" \ V \ [0-9] + \。\ [0-9] + \ & #34; (这仅适用于第二种文件名格式)。

我收到错误 - javax.script.ScriptException:sun.org.mozilla.javascript.EvaluatorException:missing;在第11行的声明(#11)之前

它在模式行上失败了,我使用正确的Pattern语句还是正则表达式是错误的?

    <scriptdef name="jarFiles" language="javascript"> 
    <element name="fileset" type="fileset"/>            
        <![CDATA[           
            importClass(java.io.File);
            importClass(org.apache.commons.io.FilenameUtils);
            importClass(java.util.regex.Pattern);
            importClass(java.lang.System);
            filesets = elements.get("fileset");
              for (i = 0; i < filesets.size(); ++i) {
                fileset = filesets.get(i);                  
                Pattern pat = Pattern.compile("_\\V\\[0-9]+\\.\\[0-9]+\\_");
                Matcher matcher = pat.match(fileset);
                if (matcher.find()) {
                    System.out.println(matcher.group(0)); //prints _Vx.x_
                    String currJarVersion = matcher.group(0);
                } else {
                    System.out.println("Match not found");
                }                
        ]]>
    </scriptdef> 
    <jarFiles>
        <fileset id="jars" dir="${svn.jar.path}">
              <include name="**/*.jar" />
        </fileset>  
    </jarFiles>                 

    <propertyregex property="currJarVersion"                       
                   regexp="_V"
                   replace=""
                   global="true" /> 
    <echo message="${currJarVersion}"/> 

1 个答案:

答案 0 :(得分:2)

这段代码有很多问题......首先,你已经宣布它是JavaScript但是你正在使用Java构造,比如类型化的变量声明(Pattern pat = ...),JavaScript没有允许。其次,正则表达式是错误的,你有太多的东西反斜杠逃脱。第三,从Matcher创建Pattern的方法称为matcher,而不是match。第四,你不能像这样对FileSet应用正则表达式,你需要提取FileSet匹配的文件名列表,然后将正则表达式应用于每个反过来。最后,你不是如何从脚本中设置Ant属性的。

我建议完全放弃scriptdef,因为您可以使用pathconvert

等本机Ant工具轻松完成映射
<pathconvert pathsep="&#10;" property="currJarVersion">
  <fileset dir="${svn.jar.path}">
    <include name="**/*.jar" />
  </fileset>
  <regexpmapper from="^.*_V([0-9]+\.[0-9]+).*$$" to="\1" /><!-- $ doubled for Ant -->
</pathconvert>