是否可以在编译时忽略Java Class Path Jars中的运行时导入



我正在尝试使用Javac通过ANT编译一个大型Java项目。如果相关,则使用Java 8在带有优胜美地OS的Mac上。

没有详细说明,我的A类对B类具有依赖性,该类别包含在第三方库中。第三方JAR库是class Path上的。我不拥有它的源代码。B类显然对C类有一个依赖性,将在应用程序服务器的类Path上的运行时出现,但在构建过程中不存在。

汇编未能说它找不到C类。但是,其他开发人员可以构建该项目,而无需包括classPath上的服务器jar ,如果我可以避免的话,我宁愿在构建中不包括服务器罐。

下面类似的蚂蚁输出:

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忽略这种类型的运行时依赖性?它为其他开发人员工作,他们主要使用Java7。

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

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

您只有几个选择。

1)在构建时包括您类路径上的依赖关系,以便编译器可以找到它们。这是正常的理智方式。你为什么不想这样做?

2)访问和加载与反射的类中有关的类,以便它们在运行时明确解决和验证,而不是classload Lime。这通常不是去做事情的好方法。

3)(最好的恕我直言)将您的项目迁移到像Maven这样的构建系统,该系统具有依赖性跟踪,并照顾所有这些详细信息"我的构建时应该是什么"等。您可以使用提供的"提供的"依赖性范围向Maven表明您的特定依赖性中所引用的类的实际实施不在您的应用程序中,但将在稍后提供……(IVY也很好,并且两者都在ANT上建立工作)

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

最新更新