我正在开发一个应该通过另一个应用程序(Oxygen XML编辑器)调用的ANT构建脚本。此应用程序传递一些属性,其中一个是路径,编码为URL(注意:我无法控制此输入;它只是 一个URL)。例如,属性${project.url}
已分配file:/F:/projectpath/
。在我的ANT脚本中,我正在剥离file:/
部分以获取我可以在<mkdir dir="${project.path}/_temp/>
等ANT任务中使用的路径。
然而,对于更复杂的网址来说,这似乎过于简单了。假设项目路径包含空格。然后,${project.url}
属性将被分配file:/F:/project%20path/
。只需剥离“file:/
部分就会产生一条对ANT任务仍有问题的路径。在这种情况下,URL编码的空格字符(%20
)应该再次解码到上面的<mkdir/>
任务的空间。
当然,此问题不仅限于空格,而是适用于最终在编码网址中转义的所有字符。因此,应该正确解码URL以便在ANT任务中使用。
ANT中是否有一种简单的方法(最好没有ANT-contrib):
...因此,如果属性${project.url}
的值为file:/F:/project%20path/
,我可以使用值${project.path}
派生另一个属性F:/project path/
?
答案 0 :(得分:1)
您始终可以运行<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>
答案 1 :(得分:1)
FoggyDay的优秀suggestion让我走上正确的道路来解决我的问题。我已经定义了一个<scriptdef>
任务,可用于:
我无法编写Java程序,因此我使用了JavaScript并使用了decodeURIComponent()函数。由于此任务与<makeurl>
ANT任务相对应,因此我将其命名为“makepath&#39;”。
这是一个工作样本构建文件:
<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上下文有用的东西的一种方便方法。