进口顺序似乎对编译成功至关重要?

时间:2014-10-23 03:29:36

标签: java eclipse unit-testing compilation

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

现在,我有以下情况。单元测试在Eclipse中构建并运行得很好。但是,当我在命令行上构建测试时(使用一些Ant目标),javac抱怨它无法找到我导入的其中一个类。由于我正在使用缓存测试某些内容,因此测试文件的相关位(Test.java可以说是):

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 ... }
}

请注意,我的本地类的内部枚举的导入出现在导入Guava CacheLoader类之前,因为它们按字母顺序排序。当我尝试在命令行上使用Ant编译它时,javac无法找到&#39; CacheLoader&#39;。当我切换导入的顺序时,构建成功(而Eclipse并不关心)。

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

1 个答案:

答案 0 :(得分:1)

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

http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6391197

我通过以下方式找到:

http://unimplemented.blogspot.com/2007/08/my-java-puzzle-does-order-of-import.html

这解释了为什么翻转导入顺序对Eclipse没有任何影响,但它对Sun编译器没有影响。部分问题已在Java 8中修复,但我的特定表现形式针对Java 9中的修复:http://bugs.java.com/bugdatabase/view_bug.do?bug_id=7101822