【发布时间】:2011-05-29 12:12:46
【问题描述】:
我正在 Ant 中定义一个新任务。 我将它导出为 jar 并添加到我的构建文件中:
<taskdef classname="X" classpath="Y.jar"/>
问题是这在运行时会失败。 它告诉我它没有找到课程。 通过将 jar 添加到类路径,它被更正了。
我的问题是:有没有一种方法可以在不更改类路径的情况下从 Ant 构建文件中引用我的 jar?
【问题讨论】:
我正在 Ant 中定义一个新任务。 我将它导出为 jar 并添加到我的构建文件中:
<taskdef classname="X" classpath="Y.jar"/>
问题是这在运行时会失败。 它告诉我它没有找到课程。 通过将 jar 添加到类路径,它被更正了。
我的问题是:有没有一种方法可以在不更改类路径的情况下从 Ant 构建文件中引用我的 jar?
【问题讨论】:
如果您知道 jar 的路径,则可以在 ant 脚本中为自己的任务定义类路径。
<taskdef name="myTaskName" classname="com.myorg.myclass">
<classpath>
<pathelement location="pathToMyJar.jar"/>
</classpath>
</taskdef>
【讨论】:
是的。我假设您查看了doc 的taskdef,它只显示了任务名称和实现类。但是,taskdef 是 typedef 的子类,如果您查看后者的 doc,您会发现还有一个 classpath 属性。
但是,使用此属性意味着您的 ant 脚本与特定环境相关联;它们不是很便携。更好的方法是使用 -lib invocation option 将类路径传递给 Ant。
【讨论】:
CLASSPATH 环境变量,请不要这样做。从您的环境设置中删除它,并养成明确指定类路径的习惯。因为否则,您会发现自己遇到了一个难以调试的问题,即从您的类路径中加载了一个库,而您却没想到会出现这种情况。或者其他人无法运行您的代码,因为他/她没有相同的 CLASSPATH 环境变量。
-lib 选项指定类路径只会让用户知道这些路径。您仍然需要告诉用户在哪里查找它们(例如,在自述文件、帮助文件或回显消息中)。或者,您可以决定重新构建项目目录层次结构以将这些库包含在特定的子目录中,从而“独立于环境”。构建脚本应该注意这些细节,并在理想情况下使用默认的 ant 调用生成一个合理的对象。