我正在尝试将所有JAR从一个目录复制到另一个目录。在此过程中,我想删除文件名末尾的版本号。 (例如my-jar-1.2.3.jar to my-jar.jar)
我试图绕过mapper,但我找不到正则表达式来实现它。我试过这个:
<copy todir="lib" flatten="true">
<mapper type="regexp" from="(.*)-[^.]*(\.jar)" to="\1\2" />
<fileset dir="my.files.dir">
<include name="**/*.jar" />
<type type="file" />
</fileset>
</copy>
答案 0 :(得分:2)
这是以下答案的更好版本:
<project>
<mkdir dir="lib"/>
<copy todir="lib"
verbose="true">
<fileset dir="jars/">
<include name="*.jar"/>
</fileset>
<mapper type="regexp"
from="^(.+?)-[0-9]+.*\.jar$"
to="\1.jar"/>
</copy>
</project>
处理“最后一个是麻烦制造者”
答案 1 :(得分:1)
这应该可以正常运作:
<copy todir="lib" flatten="true">
<mapper type="regexp" from="(.*)-[^-]*(\.jar)" to="\1\2" />
<fileset dir="my.files.dir">
<include name="**/*.jar" />
<type type="file" />
</fileset>
</copy>
答案 2 :(得分:0)
这是maven-ant-task-lib中的一个映射器,它可以做到这一点。
答案 3 :(得分:0)
试试这个......
<project>
<mkdir dir="lib"/>
<copy todir="lib"
verbose="true">
<fileset dir="jars/">
<include name="*.jar"/>
</fileset>
<mapper type="regexp"
from="^(.+?)-[0-9].*$"
to="\1.jar"/>
</copy>
</project>
在regex
映射器中,from
参数必须与整个名称匹配。我使用+?
非贪婪模式匹配器。这匹配.
的模式,这意味着任何字符但不贪婪。通常,这将匹配整条线。但是,我正在捕捉到第一次发现破折号后跟一个数字。
如果jar没有版本号,或者以非数字值开头,则会出现问题。我可以成功地做到这些:
foo-2.3.2.jar
foo-2r1.jar
但不是这些:
foo-alpha.jar
foo.jar
所以,我稍微调整了模式:
<project>
<mkdir dir="lib"/>
<copy todir="lib"
verbose="true">
<fileset dir="jars/">
<include name="*.jar"/>
</fileset>
<mapper type="regexp"
from="^(.+?)-[0-9]*.*\.jar$"
to="\1.jar"/>
</copy>
</project>
$ ant
[mkdir] Created dir: lib
[copy] Copying 5 files to lib
[copy] Copying jars/bar-3.4.5.jar to lib/bar.jar
[copy] Copying biff-86.4.2.jar to lib/biff.jar
[copy] Copying jars/boff-2.31.2.jar to lib/boff.jar
[copy] Copying jars/foo-1.2.3.jar tolib/foo.jar
[copy] Copying jars/foo-bar-3.3.2.3.jar to lib/foo.jar
最后一个是麻烦制造者......
这可能值得一两个副本:一个是在找到版本号时要小心,另一个是用来处理没有版本号的罐子。