java项目不会根据源代码顺序编译类引用枚举

noa*_*hlz 5 java compilation maven

我有一种情况,一些Java 1.6源代码不能在Maven中编译,只有在我按照特定顺序指定源代码时才在javac中编译.

pom.xml是赤裸裸的但指定1.6 -source-target1.6:

 <build>
     <plugins>
         <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-compiler-plugin</artifactId>
             <version>3.1</version>
             <configuration>
                 <source>1.6</source>
                 <target>1.6</target>
             </configuration>
         </plugin>
     </plugins>
 </build>
Run Code Online (Sandbox Code Playgroud)

ComputeOperation.java

package test.domain;

public interface ComputeOperation<T> {

    public T compute(T arg1, T arg2);
}
Run Code Online (Sandbox Code Playgroud)

Computations.java

 package test.domain;

 public enum Computations implements ComputeOperation<Integer> {

     ADD {
         @Override
         public Integer compute(Integer arg1, Integer arg2) {
             return arg1 + arg2;
         }
     },

     SUBTRACT {
         @Override
         public Integer compute(Integer arg1, Integer arg2) {
             return arg1 - arg2;
         }
     }

 } 
Run Code Online (Sandbox Code Playgroud)

App.java

package test.app;    

import test.domain.*;    

public class App {
    public static void main( String[] args ) {
        System.out.println(Computations.ADD.compute(1, 1));
    }
}
Run Code Online (Sandbox Code Playgroud)

Maven构建失败如下(完整的调试日志):

[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] /home/nzucker/projects/maven-test/src/main/java/test/app/App.java:[7,44] cannot find symbol
symbol : method compute(int,int)
location: class test.domain.Computations
[INFO] 1 error
Run Code Online (Sandbox Code Playgroud)

javac如果App.java在Computations.java之前出现,那么普通的旧编译将失败成功:

[nzucker:maven-test]$ javac -source 1.6 -target 1.6 -g -d target/classes src/main/java/test/app/App.java src/main/java/test/domain/Computations.java src/main/java/test/domain/ComputeOperation.java
src/main/java/test/app/App.java:7: cannot find symbol
symbol  : method compute(int,int)
location: class test.domain.Computations
    System.out.println(Computations.ADD.compute(1, 1));
                                       ^
1 error
Run Code Online (Sandbox Code Playgroud)

但是如果我把App.java放在输入源中,那么构建会成功:

[nzucker:maven-test]$ javac -source 1.6 -target 1.6 -g -d target/classes  src/main/java/test/domain/Computations.java src/main/java/test/domain/ComputeOperation.java src/main/java/test/app/App.java 
[nzucker:maven-test]$ java -cp target/classes/ test.app.App
2
Run Code Online (Sandbox Code Playgroud)

最后,如果我将importApp.java更改为静态导入,则编译成功:

package test.app;

import static test.domain.Computations.*;

public class App {
    public static void main( String[] args ) {
        System.out.println(ADD.compute(1, 1));
    }
}
Run Code Online (Sandbox Code Playgroud)

问题:

我知道" maven中的javac编译命令错误的解决方法 " - 所以我的问题是为什么会发生这种情况?这是Maven的真正缺陷吗?如果是这样,那么JIRA问题是什么?

另外,为什么编译失败?我认为javac在预处理阶段解决了类之间的依赖关系和编译顺序?我猜我错了?是否有规范涵盖这一点?

好吧,我链接的另一个问题有一个响应,指出Java 1.6中的错误.答案是升级到Java 1.7或实现解决方法.