在ANT中解码URL

时间:2014-10-23 23:54:12

标签: java url ant urldecode

我正在开发一个应该通过另一个应用程序(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):

  1. 解码网址
  2. 将此解码后的网址指定给其他媒体资源
  3. ...因此,如果属性${project.url}的值为file:/F:/project%20path/,我可以使用值${project.path}派生另一个属性F:/project path/

2 个答案:

答案 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>任务,可用于:

  1. 解码路径的网址,
  2. 将它们存储在可在ANT文件中使用的属性中。
  3. 我无法编写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上下文有用的东西的一种方便方法。