如何将Ant路径转换为FileSet?

时间:2009-11-09 08:28:29

标签: ant java-ee

我正在编写一个Ant脚本来将项目打包到WAR文件中。该软件包含几个具有自己的源目录,库等的项目。

WAR任务有一个我正在处理的嵌套元素lib。我目前将所需的库引用为Path(包含几个FileSets,我在类路径引用中使用。lib希望输入为{{{ 1}},它拒绝FileSet

我尝试将Path转换为Path,但后来我没有把它作为其他地方的类路径工作。

有没有办法将FileSet转换为Path?我不想复制粘贴目录。

FileSet

...与<path id="compile.libs"> <fileset dir="${common.path}/lib" includes="*.jar"/> <fileset dir="${data.path}/lib" includes="*.jar"/> <fileset dir="${gui.path}/lib" includes="*.jar"/> <fileset dir="${gui.path}/WebContent/WEB-INF/lib" includes="*.jar"/> </path> 一起使用时会导致:

BUILD FAILED
build.xml:173: compile.libs doesn't denote a zipfileset or a fileset

4 个答案:

答案 0 :(得分:13)

假设路径是绝对路径,您可以先使用Path<pathconvert>转换为以逗号分隔的列表,然后将列表转换回Fileset

<!-- create path -->
<path id="foo.path">
    <pathelement location="/foo/bar/baz.txt"/>
    <pathelement location="/qux/quux/quuux.txt"/>
</path>

<!-- convert foo.path to foo.list -->
<pathconvert 
    refid="foo.path" 
    property="foo.list"
    pathsep=","
    dirsep="/"
>
    <!-- 
        <fileset> will want relative paths, so we need to strip 
        the leading /. result: "foo/bar/baz.txt,qux/quux/quuux.txt"
    -->
    <map from="/" to=""/> 
</pathconvert>

<!-- convert foo.list to fileset -->
<fileset id="foo.fileset" dir="/" includes="${foo.list}"/>

(注意上面假设是Unix;如果您使用的是Windows,或者您希望使其与平台无关,那么您可能需要对分隔符进行一些操作。

答案 1 :(得分:8)

您可能有多种选择。

  1. 您可以提供多个 <lib>嵌套元素<war> 任务。也许这就足够了。
  2. 您可以预先组装所有人 lib个文件在一个临时文件中 目录,然后只是引用它 目录作为文件集。
  3. 有一个ant-contrib PathToFileSet任务,但它 需要一个中央根目录, 这可能不是你的情况 compile.libs布局。
  4. 从Ant 1.8.0开始,您可以使用mappedresources。资料来源:Ant script: Prevent duplication of JAR in javac-classpath war-lib
  5. 我想我会尝试选项1。

答案 2 :(得分:4)

我通过暂存这样的lib来解决这个问题:

<copy todir="stage/libs" flatten="true">
<path refid="classpath" />
</copy>

然后在WAR task.simple中使用a。

答案 3 :(得分:-1)

用于编译的类路径中的jar与需要在war中打包的不一样。例如:我确定你需要 servlet-api.jar 来编译你的项目,但你不需要在战争中使用它,因为容器提供了它。编译时不需要一些罐子,但在运行时不需要 我知道我没有回答你的问题,只是想让你想想你在做什么。