Maven cli给出语法错误,但在eclipse中没问题。 java语法是否正确?真奇怪

时间:2013-04-04 19:20:58

标签: java eclipse maven compiler-errors

我的java应用程序中有一个非常奇怪的问题。我正在用maven构建它并在Eclipse IDE中开发它。这可能是一个有点冗长的解释,但请坚持到底,导致问题真的很奇怪,我不知道它可能是什么原因。

以下是我正在撰写的代码示例:

假设我们有一个“处理程序”界面。它可以处理特定的对象类型:

public interface Handler<T> {
    public void handle(T obj);
}

现在让我们说我们想要Handler链接。我们可以这样做:

public class HandlerChain<T> implements Handler<T> {

private Handler<? super T> h;

@Override
public void handle(T obj) {
            //h can handle T objects
    h.handle(obj);  
}

private HandlerChain(Handler<? super T> h) {
    super();
    this.h = h;
}

    //syntax sugar to start the chain
public static <T> HandlerChain<T> start(Handler<? super T> h){
    return new HandlerChain<T>(h);      
}

    //add another handler to the chain
public HandlerChain<T> next(final Handler<? super T> handler){
    return new HandlerChain<T>(new Handler<T>() {
        @Override
        public void handle(T obj) {
            h.handle(obj);
            handler.handle(obj);                
        }
    });     
}

}

现在让我们为String处理程序创建一些处理程序工厂:

 public class Handlers {
public static Handler<String> h1(){
    return new Handler<String>(){

        @Override
        public void handle(String obj) {
            // do something

        }

    };
}

public static Handler<String> h2(){
    return new Handler<String>(){

        @Override
        public void handle(String obj) {
            // do something

        }

    };
}
}

所以最后我们创建了一个使用链中的两个处理程序处理一些字符串的类:

public class Test { 
public void doHandle(String obj){
    HandlerChain.start(Handlers.h1()).next(Handlers.h2()).handle(obj);
}
}

所以,对我而言,这段代码似乎没有错。 Eclipse IDE也不介意。它甚至正确地运行它。但是当我尝试用cli中的maven编译这段代码时,我收到了一个错误:

Test.java:[7,50] next(Handler<? super java.lang.Object>) in HandlerChain<java.lang.Object> cannot be applied to (Handler<java.lang.String>)

有没有人偶然发现类似的问题?我真的想知道这种语法在java中是否有效,或者由于设置错误或某些原因,这是一些奇怪的编译器错误?重复Eclipse编译并正确运行此代码,但maven cli无法编译它。

最后,这是我在pom.xml中的maven-compiler-plugin设置。它可能与整个问题有关。

    <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.0</version>
        <executions>
          <execution>
            <id>default-testCompile</id>
            <phase>test-compile</phase>
            <goals>
              <goal>testCompile</goal>
            </goals>
            <configuration>
              <encoding>UTF-8</encoding>
              <source>1.6</source>
              <target>1.6</target>
            </configuration>
          </execution>
          <execution>
            <id>default-compile</id>
            <phase>compile</phase>
            <goals>
              <goal>compile</goal>
            </goals>
            <configuration>
              <encoding>UTF-8</encoding>
              <source>1.6</source>
              <target>1.6</target>
            </configuration>
          </execution>
        </executions>
        <configuration>
          <encoding>UTF-8</encoding>
          <source>1.6</source>
          <target>1.6</target>
        </configuration>
      </plugin> 

提前致谢!

1 个答案:

答案 0 :(得分:1)

  

有没有人偶然发现类似问题?

是的,并且在使用泛型类型做奇怪的和不寻常的(可能是不正确的)时也是如此。

问题是eclipse编译器不会在这些奇怪的构造上报告编译错误,而Sun JDK的标准javac会抱怨类型擦除。 (这是JDK 1.6)。 (如果我记得很清楚:eclipse报告只是一个警告)

我的解决方案是设置maven以使用eclipse编译器。另一个(更好的)选择是修复代码,但由于这是一个非常复杂的任务,因为我在运行时没有任何问题,所以选择“快速而肮脏”的第一个选项。

以下是设置编译器的方法:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
            <source>${compiler.source}</source>
            <target>${compiler.target}</target>
            <encoding>${source.encoding}</encoding>
            <fork>false</fork>
            <compilerId>jdt</compilerId>
    </configuration>
    <dependencies>
            <dependency>
                    <groupId>org.eclipse.tycho</groupId>
                    <artifactId>tycho-compiler-jdt</artifactId>
                    <version>0.13.0</version>
            </dependency>
    </dependencies>
</plugin>