Javac无法用内部类编译内部类,但当类移动到自己的代码文件时,它就可以工作了——为什么



我遇到过一种特殊的构建情况,java项目在eclipse中编译,但在构建机器上失败(Ant 1.8.2和JDK 1.6)

对名为"DestinationList"的类的编译失败,该类是一个具有内部类的内部类。结构如下。

public class MappingDetail {
    public class DestinationList extends AbstractGrowingScrollTable {
        public class DestinationListRow {
        }
    }
}

使用如上所述布局的类,编译失败,抱怨找不到"AbstractGrowingCrollTable"。如果删除内部内部类"DestinationListRow",则编译成功。如果我将"DestinationList"移动到它自己的代码文件中,编译也会成功。

这是怎么回事?由于我有工作要做,出于兴趣我问。我不明白为什么会失败。

"AbstractGrowtableScrollTable"在一个单独的jar中,但这个jar肯定在类路径上,事实上,在启用详细日志记录后,我可以看到javac很快就找到了这个类。摘录如下。请注意,在日志的最后一个列表中,它确实加载了AbstractGrowtableScrollTable。

[javac] C:WorkDecisivBUILD_AREAcodesourceAPEI01cominitechsdapei01uiMappingDetail.java:551: cannot find symbol
[javac] symbol  : class AbstractGrowingScrollTable
[javac] location: class com.initech.sd.ap.ei01.ui.MappingDetail
[javac]     public class DestinationList extends AbstractGrowingScrollTable {  
[javac]                                          ^
[javac] [loading cominitechsdksta01resourceIResourceable.class(cominitechsdksta01resource:IResourceable.class)]  
[javac] [loading cominitechsdzart01resourcesResources.class(cominitechsdzart01resources:Resources.class)]  
[javac] [loading cominitechsdzash01sharedPair.class(cominitechsdzash01shared:Pair.class)]
[javac] [loading cominitechsdzauicomponentCheckBox.class(cominitechsdzauicomponent:CheckBox.class)]
[javac] [loading cominitechsdzauicomponentGrid.class(cominitechsdzauicomponent:Grid.class)]
[javac] [loading cominitechsdzauicomponentImage.class(cominitechsdzauicomponent:Image.class)]
[javac] [loading cominitechsdzauicomponentLabel.class(cominitechsdzauicomponent:Label.class)]
[javac] [loading cominitechsdzauicomponentRow.class(cominitechsdzauicomponent:Row.class)]
[javac] [loading cominitechsdzauicomponentlayoutdataGridLayoutData.class(cominitechsdzauicomponentlayoutdata:GridLayoutData.class)]
[javac] [loading cominitechsdzauicomponentlayoutdataRowLayoutData.class(cominitechsdzauicomponentlayoutdata:RowLayoutData.class)]
[javac] [loading cominitechsdzauicomponentpropertiesAlignment.class(cominitechsdzauicomponentproperties:Alignment.class)]
[javac] [loading cominitechsdzauicomponentpropertiesFont.class(cominitechsdzauicomponentproperties:Font.class)]
[javac] [loading cominitechsdzauicomponenttableScrollTableColumn.class(cominitechsdzauicomponenttable:ScrollTableColumn.class)]
[javac] [loading cominitechsdzauicomponenttableScrollTableRow.class(cominitechsdzauicomponenttable:ScrollTableRow.class)]
[javac] [loading cominitechsdzauiresourceDefaultStyle.class(cominitechsdzauiresource:DefaultStyle.class)]
[javac] [loading cominitechsdzauiresourceImageResources.class(cominitechsdzauiresource:ImageResources.class)]
[javac] [loading cominitechsduicfAbstractGrowingScrollTable.class(cominitechsduicf:AbstractGrowingScrollTable.class)]

原来这是一个编译器错误。

http://bugs.sun.com/view_bug.do?bug_id=6707323

最新更新