我正在开发一个ANT构建脚本,该脚本应该通过另一个应用程序(Oxygen XML编辑器)调用。这个应用程序传递一些属性,其中一个是路径,编码为URL(注意:我不能控制这个输入;它只是是一个URL)。例如,特性${project.url}
被指定为file:/F:/projectpath/
。在我的ANT脚本中,我剥离了file:/
部分,以获得一个可以在像<mkdir dir="${project.path}/_temp/>
这样的ANT任务中使用的路径。
然而,对于更复杂的URL来说,这似乎过于简单化了。假设项目路径包含一个空间。然后${project.url}
属性将被指定为file:/F:/project%20path/
。仅仅去掉"file:/
"部分,就会产生一条对ANT任务仍然有问题的路径。在这种情况下,URL编码的空间字符(%20
)应该被再次解码到用于上述<mkdir/>
任务的空间。
当然,这个问题并不局限于空格,而是适用于最终在编码的URL中转义的所有字符。因此,URL应该被正确解码,以便在ANT任务中使用。
在ANT中有没有一种简单的方法(最好没有ANT contib):
- 解码URL
- 将此解码的URL分配给另一个属性
因此,给定值为file:/F:/project%20path/
的属性${project.url}
,我可以导出值为F:/project path/
的另一个属性${project.path}
?
您可以始终运行<script>
任务来设置变量,然后在稍后的build.xml中使用该变量。
例如:
https://ant.apache.org/manual/Tasks/script.html
<script language="groovy">
xmlfiles = new java.io.File(".").listFiles().findAll{ it =~ ".xml$"}
xmlfiles.sort().each { self.log(it.toString())}
</script>
FoggyDay的出色建议让我走上了解决问题的正确道路。我定义了一个<scriptdef>
任务,它可以用于:
- 将URL解码为路径,以及
- 将它们存储在ANT文件中可以使用的属性中
我不会编程Java,所以我使用了JavaScript并使用了它的decodeURIComponent()函数。由于此任务与<makeurl>
ANT任务类似,因此我将其命名为"makepath"。
以下是一个工作示例构建文件:
<project>
<property name="project.url" value="file:/F:/project%20path"/>
<scriptdef name="makepath" language="javascript">
<attribute name="url"/>
<attribute name="property"/>
<![CDATA[
var decodedUrl = decodeURIComponent(attributes.get("url"));
var path = decodedUrl.replace(/^[^:]+:/+/g, "");
self.project.setProperty( attributes.get("property"), path )
]]>
</scriptdef>
<makepath url="${project.url}" property="project.path"/>
<echo>$project.path: ${project.path}</echo>
</project>
当然,这只是一个说明性的例子(否则,如果您需要一个路径,那么显式声明URL就没有多大意义了)。但是,当您无法控制${project.url}
属性的值(在我的情况下,它是通过外部程序传递的)时,这似乎是一种将其转换为对ANT上下文有用的东西的方便方法。