是否可以在编译时忽略Java类路径JAR中的运行时导入?

时间:2015-05-07 16:01:47

标签: java ant dependencies javac

我试图通过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

所以我的问题是:

  1. 有没有办法总是说服Java忽略这种类型的运行时依赖?它适用于主要使用Java 7的其他开发人员。

  2. 为什么每次运行时依赖都不会发生这种情况?我曾经在各种项目中看到过这种情况,但它从来都不是一个问题。

1 个答案:

答案 0 :(得分:2)

编译器绝对会尝试在编译时找到你引用的类"通常" :(即直接使用类名符号,只是"引用"今后)到抓住以后可能出错的各种事情,并在编译之前警告你和/或让你修复它们。

你只有几个选择。

1)在构建时在类路径中包含依赖项,因此编译器可以找到它们。这是正常,理智的方式。为什么不想这样做呢?

2)使用反射访问和加载有问题的类,以便它们在运行时显式解析和验证,而不是类加载时间。这通常不是一个很好的方式。

3)(最好的imho)将您的项目迁移到像Maven这样的构建系统,该系统具有依赖性跟踪并处理所有这些细节"在我构建"等时,类路径应该是什么?可以使用"提供的"依赖范围向Maven表明您在特定依赖项中引用的类的实际实现不在您的应用程序中,但稍后将提供...(Ivy也很好,并且都在Ant之上构建工作)

如果其他开发人员正在编译引用类C的代码,我向你保证他们在类路径的某个地方有一个C.class。