我试图通过Ant使用javac编译大型Java项目。这是在使用Java 8的Yosemite操作系统的Mac上,如果这是相关的。
在没有详细说明的情况下,我的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的其他开发人员。
为什么每次运行时依赖都不会发生这种情况?我曾经在各种项目中看到过这种情况,但它从来都不是一个问题。
答案 0 :(得分:2)
编译器绝对会尝试在编译时找到你引用的类"通常" :(即直接使用类名符号,只是"引用"今后)到抓住以后可能出错的各种事情,并在编译之前警告你和/或让你修复它们。
你只有几个选择。
1)在构建时在类路径中包含依赖项,因此编译器可以找到它们。这是正常,理智的方式。为什么不想这样做呢?
2)使用反射访问和加载有问题的类,以便它们在运行时显式解析和验证,而不是类加载时间。这通常不是一个很好的方式。
3)(最好的imho)将您的项目迁移到像Maven这样的构建系统,该系统具有依赖性跟踪并处理所有这些细节"在我构建"等时,类路径应该是什么?可以使用"提供的"依赖范围向Maven表明您在特定依赖项中引用的类的实际实现不在您的应用程序中,但稍后将提供...(Ivy也很好,并且都在Ant之上构建工作)
如果其他开发人员正在编译引用类C
的代码,我向你保证他们在类路径的某个地方有一个C.class。