我有一种情况,一些 Java 1.6 源无法在 Maven 中编译,只有在我按特定顺序指定源时才能在 javac 中编译。
pom.xml 是准系统,但指定了 1.6 的-source
和:-target
<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>
计算操作.java
package test.domain;
public interface ComputeOperation<T> {
public T compute(T arg1, T arg2);
}
计算.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;
}
}
}
应用程序.java
package test.app;
import test.domain.*;
public class App {
public static void main( String[] args ) {
System.out.println(Computations.ADD.compute(1, 1));
}
}
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
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
但是,如果我将 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
最后,如果我将import
App.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));
}
}
问题:
我知道“ maven 中 javac 编译顺序错误的解决方法” -所以我的问题是为什么会发生这种情况?这是 Maven 的真正缺陷吗?如果是这样,如果是这样,JIRA 问题是什么?
另外,为什么编译失败?我认为 javac 在预处理阶段解决了类之间的依赖关系和编译顺序?我想我错了?是否有涵盖此的规范?
好的,我链接到的另一个问题的响应指向 Java 1.6 中的错误。答案是升级到 Java 1.7 或实施变通方法。