使用propertyregex替换字符串

时间:2014-05-07 03:06:00

标签: ant

需要使用ant propertyregex函数来更换字符串。

我实际上需要通过将文件夹的某些部分替换为新文件夹来操作类路径文件内容,并删除一些文件夹路径。

类路径的实际内容如下:

/usr/home/folder1/com/codahale/metrics/metrics-core/3.0.2/metrics-core-3.0.2.jar:/usr/home/folder1/javax/ws/rs/javax.ws.rs-api/2.0-m10/javax.ws.rs-api-2.0-m10.jar:/etc/lib/:/usr/java/lib

最终应该是

/var/home/newfolder/metrics-core-3.0.2.jar:/var/home/newfolder/javax.ws.rs-api-2.0-m10.jar:/etc/lib/:/usr/java/lib

基本上,无论哪个字符串包含/ usr / home / folder1,新文件夹名称都应该以jar文件作为前缀。类路径包含500个不同的groupId,artifactId,其中/ usr / home / folder1作为基础

我正在尝试将classpath属性中的字符串从/ usr / home / folder1 /替换为/ var / home / newfolder /,如下所示。不确定这里是否有问题,但这完全不起作用..

<target name="classpath-generate">
        <propertyregex property="compileclasspath" input="${compileclasspath}" regexp="/usr/home/folder1/" replace="/var/home/newfolder/" defaultValue="${compileclasspath}"/>
</target>

另外,需要一些帮助来解决如何只提取jar文件名并为新的foldername添加前缀。

非常感谢您对此的意见!!

2 个答案:

答案 0 :(得分:2)

不需要像antcontrib或正则表达式这样的额外库 通过脚本任务使用ant api和内置的JavaScript引擎(自JDK 1.6.0_06起)就像这样:

<project>

<property name="compileclasspath" value="/usr/home/folder1/com/codahale/metrics/metrics-core/3.0.2/metrics-core-3.0.2.jar:/usr/home:/usr/home/folder1/com/codahale/metrics/metrics-core/bla.jar"/>
<property name="replacefrom" value="/usr/home/folder1/com/codahale/metrics/metrics-core"/>
<property name="replaceto" value="/var/home/newfolder"/>

 <echo>
 $${compileclasspath} initial : 
 ${compileclasspath}
 </echo>

 <script language="javascript">
  //set newProperty
  project.setProperty('foobar', project.getProperty('compileclasspath').replace(project.getProperty('replacefrom'), project.getProperty('replaceto')));

  // overwrite existing property
  project.setProperty('compileclasspath', project.getProperty('compileclasspath').replace(project.getProperty('replacefrom'), project.getProperty('replaceto')));
 </script>


 <echo>
 $${compileclasspath} changed :
 ${compileclasspath}
 new Property $${foobar} :
 ${foobar}
 </echo>

</project>

输出:

[echo]  ${compileclasspath} initial : 
[echo]  /usr/home/folder1/com/codahale/metrics/metrics-core/3.0.2/metrics-core-3.0.2.jar:/usr/home:/usr/home/folder1/com/codahale/metrics/metrics-core/bla.jar
[echo]  
[echo]  ${compileclasspath} changed :
[echo]  /var/home/newfolder/3.0.2/metrics-core-3.0.2.jar:/usr/home:/var/home/newfolder/bla.jar
[echo]  new Property ${foobar} :
[echo]  /var/home/newfolder/3.0.2/metrics-core-3.0.2.jar:/usr/home:/var/home/newfolder/bla.jar
[echo]  

要提取jar名称,您可以使用以下内容:

<project>

<property name="compileclasspath" value="/usr/home/folder1/com/codahale/metrics/metrics-core/3.0.2/metrics-core-3.0.2.jar:/usr/home:/usr/home/folder1/com/codahale/metrics/metrics-core/bla.jar"/>

 <script language="javascript">
 <![CDATA[
 var cpitems = project.getProperty('compileclasspath').split(':');
 var jars = "";
 for (i=0; i < cpitems.length; i++) {
  if(cpitems[i].split('/')[(cpitems[i].split('/')).length -1].endsWith('.jar'))
  {
   jars += cpitems[i].split('/')[(cpitems[i].split('/')).length -1] + ','
  }
 }
 project.setProperty('cpjars', jars.substring(0, jars.length - 1));
 ]]>
 </script>

 <echo>$${cpjars} => ${cpjars}</echo>

</project>

输出:

[echo] ${cpjars} => metrics-core-3.0.2.jar,bla.jar

答案 1 :(得分:1)

下面是一个Ant脚本,它使用Ant的内置文件名映射功能:

的build.xml

<project name="ant-classpath-mapper" default="run">
    <property 
        name="original-classpath" 
        value="/usr/home/folder1/com/codahale/metrics/metrics-core/3.0.2/metrics-core-3.0.2.jar:/usr/home/folder1/javax/ws/rs/javax.ws.rs-api/2.0-m10/javax.ws.rs-api-2.0-m10.jar:/etc/lib/:/usr/java/lib"
    />

    <target name="run">
        <pathconvert property="modified-classpath">
            <path>
                <pathelement path="${original-classpath}"/>
            </path>
            <firstmatchmapper>
                <regexpmapper 
                    from="/usr/home/folder1/.*?([^/]+\.jar)$" 
                    to="/var/home/newfolder/\1" 
                />
                <identitymapper/>
            </firstmatchmapper>
        </pathconvert>

        <echo>${modified-classpath}</echo>
    </target>
</project>

输出

run:
     [echo] /var/home/newfolder/metrics-core-3.0.2.jar:/var/home/newfolder/javax.ws.rs-api-2.0-m10.jar:/etc/lib:/usr/java/lib

<regexpmapper>匹配以“/ usr / home / folder1”开头的路径。

<regexpmapper>与“/ etc / lib /”和“/ usr / java / lib”等路径不匹配。 <firstmatchmapper>可确保这些路径与以下<identitymapper>匹配。