当我将 1.7 版本复制到 Ant lib 文件夹时,为什么 Ant 使用 Velocity 1.4?

Why is Ant using Velocity 1.4 when I copy an 1.7 version into the Ant lib folder?

我有一个用 Ant 构建的项目。我的问题是它需要 Velocity 才能正确构建,但是当我将 Velocity 复制到 ant lib 文件夹 (1.7) 时,我可以在 Velocity 日志中看到它出于某种原因使用 1.4

Tue May 03 10:16:29 CEST 2016 [info] Starting Jakarta Velocity v1.4

这怎么可能?我检查了 MANIFEST 文件,我复制到 Ant 的版本确实是 1.7。如果我删除它,Ant 构建将失败,所以我确定正在使用此 .jar,但在 velocity.log 文件中我看到 Velocity 1.4 启动。可能是什么问题?

1.4 以上的 Velocity 版本从 "Jakarta Velocity" 更名为 "Apache Velocity"。代码片段:1.4, 1.6.4, 1.7

显然你在 classpath 中有 Velocity 1.4,即使在 classpath 中也有 1.7。

回答更笼统的问题: "Why version x.y is used if version x.z should be used instead?"

解决方案 #1(运行时)

  • 获取您的 java 进程的 ID:jps -v
  • 获取class路径(和其他信息):jinfo $pid
  • 寻找多个速度罐。很可能速度 1.4 会在 1.7
  • 之前

解决方案 #2(离线,假设您正在寻找 RuntimeInstance class)

  • 导航到您的 ant 发行版
  • 运行 for i in **/*.jar; do jar -tvf "$i" | grep -Hsi RuntimeInstance && echo "$i"; done 命令将在所有 jar 中查找给定的 class 名称。这有助于万一 velocity 被打包在另一个罐子里(而不是作为单独的人工制品存在)

当然,您可以通过其他几种方式查看不同的版本 - 也许您修补了错误的 ant 分布,也许您的速度在系统 class 路径中的某个地方偷偷摸摸。然而,以上两者的组合应该突出版本不匹配的根本原因。