为什么Eclipse会编译这些Java代码而不是Ant?

为什么Eclipse会编译这些Java代码而不是Ant?,java,eclipse,ant,compilation,Java,Eclipse,Ant,Compilation,这将使用Eclipse编译find: abstract class CollectionView implements Collection<Object> { ... public Object[] toArray(Object[] o) { if (fast) { return get(map).toArray(o); } else { synchro

这将使用Eclipse编译find:

abstract class CollectionView implements Collection<Object> {

...
        public Object[] toArray(Object[] o) {
            if (fast) {
                return get(map).toArray(o);
            } else {
                synchronized (map) {
                    return get(map).toArray(o);
                }
            }
        }
...
}

    class KeySet extends CollectionView implements Set<Object> {

        protected Collection<Object> get(Map<Object, Object> map) {
            return map.keySet();
        }

        protected Object iteratorNext(Map.Entry entry) {
            return entry.getKey();
        }   
    }
抽象类CollectionView实现了集合{
...
公共对象[]到阵列(对象[]o){
如果(快速){
返回get(map.toArray(o);
}否则{
同步(地图){
返回get(map.toArray(o);
}
}
}
...
}
类键集扩展了CollectionView实现集{
受保护的集合获取(映射){
返回map.keySet();
}
受保护对象iteratorNext(Map.Entry){
return entry.getKey();
}   
}
但使用Ant时无法编译:

错误:键集不是抽象的且不重写 集合中数组(T[])的抽象方法

我可以理解为什么代码将使用Eclipse进行编译:KeySet已经从CollectionView继承了toArray(T[])方法的实现

但是为什么我使用Ant编译时失败了呢

    <javac srcdir="src" destdir="bin" debug="on"> 
        <compilerarg value="-Xlint:unchecked"/>
        <compilerarg value="-Xlint:deprecation"/>
    </javac>

首先,我们应该注意,预期实现的方法的确切签名是:

<T> T[] toArray(T[] a);

有几种情况下eclipse编译得很好,而javac编译得不好。如果您不介意的话,我知道有三种使用eclipse编译器构建的方法

  • 包eclipse预编译类(有黑客行为,不推荐)

  • 将eclipse编译器适配器与Ant一起使用。当您指定build.compiler属性时,以后的所有javac任务都将在Ant构建中受到影响。您可以将其设置为“org.eclipse.jdt.core.JDTCompilerAdapter”。注意,您必须在ant构建类路径中包含这个类(以及它所依赖的类)。最简单的方法是将必要的JAR添加到Ant安装的lib文件夹中

  • 使用maven构建时,请配置此

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <compilerId>eclipse</compilerId>
                    <compilerVersion>1.6</compilerVersion>
                    <source>1.6</source>
                    <target>1.6</target>
                    <optimize>true</optimize>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>org.codehaus.plexus</groupId>
                        <artifactId>plexus-compiler-eclipse</artifactId>
                        <version>2.2</version>
                    </dependency>
                </dependencies>
            </plugin>
    
    
    org.apache.maven.plugins
    maven编译器插件
    3.1
    日食
    1.6
    1.6
    1.6
    真的
    org.codehaus.plexus
    plexus编译器eclipse
    2.2
    

  • 在pom.xml的build部分的plugins部分,这是一个困难的问题。依赖项或依赖项顺序一定有一些不同?不确定。但是这两个类都是同一类的内部类。@JSmith:您能为我们提供一个简短但完整的示例()吗,这样我们就可以重现您得到的错误?Eclipse中设置了什么编译器符合性级别(工作区首选项或项目属性->Java->编译器)以及使用什么JRE系统库,你在调用哪个javac?你确定在Eclipse和Ant中使用的是相同的JDK版本吗?(另外:众所周知,Eclipse编译器和JDK编译器并不总是同意正确的语法)
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <compilerId>eclipse</compilerId>
                    <compilerVersion>1.6</compilerVersion>
                    <source>1.6</source>
                    <target>1.6</target>
                    <optimize>true</optimize>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>org.codehaus.plexus</groupId>
                        <artifactId>plexus-compiler-eclipse</artifactId>
                        <version>2.2</version>
                    </dependency>
                </dependencies>
            </plugin>