Использование регулярного выражения ant scriptdef, получение javascript.EvaluatorException

Среда: ANT 1.9.4, использование javascript scriptdef для получения номера версии из имени файла.

В выбранном каталоге найдите имена файлов с расширением .jar, получите все имена файлов, переберите каждое имя файла, чтобы получить определенную строку, и извлеките номер версии из этой строки. Для этого я использовал javascript scriptdef. Код скопирован ниже.

Формат имени файла: «GeneralService_V1.2.jar» и «GeneralService_V10.6_SSL.jar».

Выражение регулярного выражения, используемое для извлечения Vx.x, имеет вид "\V\[0-9]+\.\[0-9]+\" (это только для второй формат имени файла).

Я получаю сообщение об ошибке - javax.script.ScriptException: sun.org.mozilla.javascript.EvaluatorException: отсутствует; перед оператором (#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}"/> 

person Lola    schedule 06.01.2015    source источник


Ответы (1)


В этом коде много чего не так... Во-первых, вы объявили его JavaScript, но используете конструкции Java, такие как объявления типизированных переменных (Pattern pat = ...), которые JavaScript не допускает. Во-вторых, регулярное выражение неверно, у вас слишком много вещей, экранированных обратной косой чертой. В-третьих, метод создания Matcher из Pattern называется matcher, а не match. В-четвертых, вы не можете применить регулярное выражение к FileSet, как это, вам нужно будет извлечь список имен файлов, которым соответствует FileSet, а затем применить регулярное выражение к каждому из них по очереди. И наконец, это не то, как вы устанавливаете свойства Ant из скрипта.

Я бы предложил вообще отказаться от scriptdef, так как вы можете сделать сопоставление гораздо проще с помощью родных средств Ant, таких как pathconvert

<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>
person Ian Roberts    schedule 06.01.2015
comment
Это первый раз, когда я столкнулся с pathconvert, он работал отлично. Спасибо. - person Lola; 06.01.2015
comment
@Lola Рада, что это помогло, и добро пожаловать в Stack Overflow. Обратите внимание, что когда вы получаете ответ, решающий вашу проблему, хорошим тоном будет принять, щелкнув галочку слева. Это сразу показывает другим читателям, что проблема решена (а также дает бонус к репутации как спрашивающему, так и отвечающему). - person Ian Roberts; 07.01.2015
comment
Извините, новичок на этом сайте, я нажал на галочку. Спасибо еще раз. - person Lola; 07.01.2015