我正在尝试通过 Ant 使用 javac 编译一个大型 Java 项目。这是在装有 Yosemite OS 的 Mac 上,使用 Java 8(如果相关的话)。
无需详细说明,我的 A 类依赖于包含在第三方库中的 B 类。第三方 JAR 库在类路径中。我不拥有它的源代码。 B 类显然依赖于 C 类,它将在运行时出现在应用程序服务器的类路径中,但在构建期间不存在。
编译失败,提示找不到类 C。如果我在我的类路径中包含包含类 C 的服务器 JAR,构建工作正常。但是,其他开发人员可以在不将服务器 JAR 包含在类路径中的情况下构建项目,如果可以避免的话,我宁愿不在我的构建中包含服务器 JAR。
下面的模拟 Ant 输出:
compile:
[javac] Compiling 180 source files to /some/directory/output
[javac] /some/directory/src/A.java:123: error: cannot access C
[javac] return B.build();
[javac] ^
[javac] class file for C not found
[javac] 1 error
所以我的问题是:
有没有办法总是说服 Java 忽略这种类型的运行时依赖性?它适用于主要使用 Java 7 的其他开发人员。
为什么不是每个运行时依赖项都会发生这种情况?我在过去的各种项目中都看到过这种情况,但这从来都不是一个问题。
最佳答案
编译器绝对会尝试在编译时找到您“正常”引用的类:(即直接使用类名符号,以后只是“引用”),以捕获以后可能出错的各种事情,并在编译前警告您和/或让您修复它们。
您只有几个选择。
1) 在构建时将依赖项包含在类路径中,以便编译器可以找到它们。这是解决此问题的正常、理智的方法。你为什么不想这样做呢?
2) 使用反射访问和加载有问题的类,以便它们在运行时而不是类加载时显式解析和验证。这通常不是处理事情的好方法。
3)(恕我直言)将你的项目迁移到像 Maven 这样的构建系统,它具有依赖跟踪并处理“我构建时类路径应该是什么”等所有这些细节。你可以使用“提供的” "依赖范围向 Maven 表明你在特定依赖项中引用的类的实际实现不在你的应用程序中,但稍后会提供......(Ivy 也很好,两者都在 Ant 之上构建工作)
如果其他开发人员正在编译引用类 C
的代码,我向您保证他们的类路径中某处有一个 C.class。
关于java - 是否可以在编译时忽略 Java 类路径 JAR 中的运行时导入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30106233/