Java 导入顺序似乎关系到编译的成功?

Java 导入顺序似乎关系到编译的成功?,java,eclipse,unit-testing,compilation,Java,Eclipse,Unit Testing,Compilation,我正在为Eclipse中的某个Java类编写一个单元测试。我总是让Eclipse自动处理我的导入,并且它根据任何默认方案对它们进行排序 现在,我有以下情况。单元测试在Eclipse中构建并运行良好。然而,当我在命令行上构建测试时(使用一些Ant目标),javac抱怨说它找不到我导入的类之一。因为我在用缓存测试某些东西,所以测试文件(test.java)的相关部分是: import com.abc.my.stuff.MyCacheLoader.Operation; 导入com.google.com

我正在为Eclipse中的某个Java类编写一个单元测试。我总是让Eclipse自动处理我的导入,并且它根据任何默认方案对它们进行排序

现在,我有以下情况。单元测试在Eclipse中构建并运行良好。然而,当我在命令行上构建测试时(使用一些Ant目标),javac抱怨说它找不到我导入的类之一。因为我在用缓存测试某些东西,所以测试文件(test.java)的相关部分是:

import com.abc.my.stuff.MyCacheLoader.Operation;
导入com.google.common.cache.CacheLoader;
公开课考试{
…测试代码,例如。。。
List recordedKeys=dummyLoader.getKeysFor(Operation.LoadAll);
}
//只记录密钥的虚拟缓存加载程序
类MyCacheLoader扩展了CacheLoader{
枚举操作{Load,LoadAll}
@凌驾
公共MyValue加载(MyKey key)引发异常{….无论如何..}
@凌驾
public MyValue loadAll(Iterable键)引发异常{….无论如何..}
公共列表getKeysFor(操作op){…impl…}
}
请注意,本地类的内部枚举的导入显示在Guava CacheLoader类的导入之前,因为它们是按字母顺序排列的。当我试图在命令行上使用Ant编译这个时,javac找不到“CacheLoader”。当我切换导入顺序时,构建成功(而Eclipse不在乎这两种方式)


我对这里发生的事情感到困惑。

显然,Eclipse中的编译器没有以下Sun bug:

我通过以下途径发现:


这解释了为什么翻转导入顺序对Eclipse没有影响,但对Sun编译器却有影响。Java 8解决了部分问题,但我的具体表现是针对Java 9的一个修复:

是在两个单独的文件中还是在一个文件中?一个文件不能包含多个顶级类。文件顶部的包声明是什么样子的?@JimGarrison只有一个类是public的,另一个是package private的,这完全有效。我懒得去查JLS部分,它详细说明了这一点。对。。。我忽略了
public
缺失的事实。
import com.abc.my.stuff.MyCacheLoader.Operation;
import com.google.common.cache.CacheLoader;

public class Test {
 ... test code, such as ...

     List<MyKey> recordedKeys = dummyLoader.getKeysFor(Operation.LoadAll);

}

// Dummy cache loader which just records the keys
class MyCacheLoader extends CacheLoader<MyKey, MyValue> {
   enum Operation { Load, LoadAll }

   @Override
   public MyValue load(MyKey key) throws Exception { .... whatever .... }

   @Override
   public MyValue loadAll(Iterable<MyKey> key) throws Exception { .... whatever .... }

   public List<MyKey> getKeysFor(Operation op) { ... impl ... }
}