解码ANT中的URL



我正在开发一个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):

  1. 解码URL
  2. 将此解码的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>任务,它可以用于:

  1. 将URL解码为路径,以及
  2. 将它们存储在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上下文有用的东西的方便方法。

相关内容

  • 没有找到相关文章

最新更新