Ant / XML, экранирующий автономную кавычку в значении свойства - PullRequest
0 голосов
/ 06 ноября 2018

В моем файле сборки ant есть свойство:

<property name="pwd" value="" description="value set external"/>

Это свойство устанавливается через графический интерфейс пользователя. Позже я хочу вызвать задачу Java и указать значение свойства "pwd" в качестве аргумента для класса Java:

<java classname="package.and.classname" dir="${directory}" fork="yes" failonerror="true">
     <arg line="-u ${user}"/> 
     <arg line="-p ${pwd}"/> 
     <classpath>
        <pathelement path="[...]"/>            
     </classpath>
  </java>

Это работает нормально, пока у пользователя нет пароля, содержащего одну кавычку (') или одну двойную кавычку (").

несбалансированные кавычки в -p pass'word

Ладно - легко обойти это:

     <arg line="-p &quot;${pwd}&quot;"/> 

Но следующий случай - это слово pwd = pass ". Ошибка тогда: "The syntax of the command is incorrect." И что произойдет, когда оба ('и ") будут использованы?

Я пытался избежать кавычек с &quot; и / или &apos;, но в конце концов ничего не изменилось в поведении. Даже если я обменяю <arg line> на <arg value> для каждого параметра, проблема все еще сохраняется (но на самом деле теперь только для двойной кавычки или в смешанном регистре).

Например:

<arg value="-u"/>
<arg value="${user}"/>
<arg value="-p"/>
<arg value="${pwd}"/> 

может работать с pwd=pass'word, но не с pwd=pass"word или pwd=pass&quot;word.

Есть ли способ сообщить муравью, что значение pwd не должно оцениваться?

1 Ответ

0 голосов
/ 23 ноября 2018

Просто используйте одинарные кавычки для значения атрибута с ", f.e.:

<project> 
   <property name="foo" value='b"ar'/>
    <echo>$${foo} => ${foo}</echo>
</project>

выход

[echo] ${foo} => b"ar

EDIT

со смешанным регистром

<project> 
   <property name="foo" value="b&quot;a&apos;r"/>
   <echo>$${foo} => ${foo}</echo>
</project>

выход

[echo] ${foo} => b"a'r

Кажется, что ant может справиться с этим смешанным регистром, но ваш класс Java - нет.

EDIT

с таким классом

public class Foobar
{
  public static void main(String[] args)
  {
    System.out.println("args[0] => " + args[0] );
    System.out.println("args[1] => " + args[1] );
    System.out.println("args[2] => " + args[2] );
  }
}

и этот скрипт муравья:

<project>   
 <java classname="Foobar" classpath=".">
   <arg value="b&quot;a&apos;r"/> 
   <arg value="ba&apos;r"/>
   <arg value="b&quot;ar"/>
 </java>  
</project>

все работает как положено, вывод:

 [java] args[0] => b"a'r
 [java] args[1] => ba'r
 [java] args[2] => b"ar

Примечание = работает только со значением arg, например ::1010*

<project>   
 <java classname="Foobar" classpath=".">
   <arg value="-p b&quot;a&apos;r"/> 
   <arg value="-p ba&apos;r"/>
   <arg value="-p b&quot;ar"/>
 </java>  
</project>

выход

 [java] args[0] => -p b"a'r
 [java] args[1] => -p ba'r
 [java] args[2] => -p b"ar
* +1039 * тогда
<project> 
 <java classname="Foobar" classpath=".">
   <arg line="-p b&quot;a&apos;r"/> 
   <arg line="-p ba&apos;r"/>
   <arg line="-p b&quot;ar"/>
 </java>
</project>

Результат:

unbalanced quotes in -p b"a'r 
...