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

标签 java ant dependencies javac

我正在尝试通过 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

所以我的问题是:

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

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

最佳答案

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

您只有几个选择。

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

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

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

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

关于java - 是否可以在编译时忽略 Java 类路径 JAR 中的运行时导入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30106233/

相关文章:

java - 确保java方法是线程安全的

java - 将文本添加到具有条件的目录中的多个文件 (Java)

java - 调试期间大写与大写的环境变量名称

java - 使用 Eclipse 声明编译和运行时之间的暂时依赖关系的最佳方法是什么?

C++:即使缺少第 3 方 DLL,也允许程序运行?

java - View 的 animate() 无法正常工作

java - 使用与 Eclipse 不同的 JRE 的 Ant Javac 目标? - "java.lang.UnsupportedClassVersionError: Unsupported major.minor version 51.0"

java - 如何使用 Jenkins 参数化构建?

java - maven - 如何解决此错误 : "The POM for XXX is invalid"?

javascript - peer dependencies 和 plugins 到底是什么