我有一个我从Jenkins调用的Ant构建。 Jenkins作业有参数,其中一个是密码字符串(Jenkins中的“密码参数”)。
在属性文件中写入密码的Ant目标指定为:
<target name="pwd-properties">
<echo>Password is: ${password}</echo>
<propertyfile file="data.properties" comment="property file">
<entry key="Pwd" value="${password}" />
</propertyfile>
</target>
密码是
我是密码!
但是,在构建机器中它显示为
我是密码\!
在属性文件中。然而,回声显示正确。
有人能说出它是如何在密码字符串中获得额外的转义字符的吗?
答案 0 :(得分:2)
它与Ant无关 - 这只是Properties.store
记录的行为:
然后写出此Properties表中的每个条目,每行一个。对于每个条目,写入密钥字符串,然后是ASCII =,然后是关联的元素字符串。对于密钥,所有空格字符都使用前面的
\
字符编写。对于元素,前导空格字符,但不是嵌入或尾随空格字符,使用前面的\
字符编写。键和元素字符#
,!
,=
和:
使用前面的反斜杠编写,以确保它们已正确加载。
示例代码:
import java.io.*;
import java.util.*;
public class Test {
public static void main(String[] args) throws Exception {
StringWriter writer = new StringWriter();
Properties props = new Properties();
props.setProperty("key", "value!");
props.store(writer, "Demo");
System.out.println(writer);
}
}
输出:
#Demo
#Wed Feb 04 22:38:55 GMT 2015
key=value\!
换句话说,一切都很顺利。
转义的原因是因为!
用于评论。来自Properties.load
:
注释行有ASCII'#'或'!'作为它的第一个非白色空间角色;注释行也会被忽略,不会对关键元素信息进行编码。
现在它可以有条件地转义 - 换句话说,只有它本来可以充当注释字符 - 但最简单的就是一直逃避它。