taskdef的类路径?

com*_*lot 11 ant classpath taskdef

我在Ant中定义了一个新任务.我将其导出为jar并添加到我的构建文件中:

<taskdef classname="X" classpath="Y.jar"/>
Run Code Online (Sandbox Code Playgroud)

问题是这在运行时失败了.它告诉我它没有找到班级.通过将jar添加到类路径,它已得到纠正.

我的问题是:有没有办法可以从Ant构建文件中引用我的jar,而不更改类路径?

小智 10

如果您知道jar的路径,则在ant脚本中可以为自己的任务定义类路径.

<taskdef name="myTaskName" classname="com.myorg.myclass">
  <classpath>
    <pathelement location="pathToMyJar.jar"/>
  </classpath>
</taskdef>
Run Code Online (Sandbox Code Playgroud)


Ano*_*non 1

是的。我假设您查看了的文档taskdef,其中仅显示任务名称和实现类。但是,taskdef子类typedef,如果您查看后者的文档,您会发现还有一个classpath属性。

然而,使用此属性意味着您的 ant 脚本与特定环境相关联;它们不太便携。更好的方法是使用-lib 调用选项将类路径传递到 Ant 。

  • 我不明白为什么这是_更好的方法_。使用“-lib”选项指定类路径只会让用户知道这些路径。您仍然需要告诉用户在哪里查找它们(例如,在自述文件、帮助文件或回显消息中)。或者,您可以决定重组项目目录层次结构,将这些库包含在特定的子目录中,从而变得“独立于环境”。构建脚本应该处理这些细节,并理想地使用默认的“ant”调用生成一个合理的对象。 (3认同)
  • 如果您使用的是“CLASSPATH”环境变量,则不要使用。从环境设置中删除它,并养成显式指定类路径的习惯。因为否则,您会发现自己遇到了一个难以调试的问题,即从您的类路径加载了一个库,而您却没有预料到它。或者其他人无法运行您的代码,因为他/她没有相同的“CLASSPATH”环境变量。 (2认同)