当前位置: 首页 > 面试题库 >

Maven中Javac编译顺序错误的解决方法

乜昆
2023-03-14
问题内容

我在Java编译器中遇到一个错误,该错误中提交用于编译的文件顺序可能导致代码无法编译。我对代码进行了深入研究,以找出可以重现该问题的最小代码量,从而生成了三个源文件(每个源文件一个类)。

public interface ActionSpec {
    public abstract int run(String param);
}


public enum Actions implements ActionSpec {
    SKIP {
        public int run(String d) {
            return 0;
        }
    };
}

public class Program {

    public static void main(String[] args) {
        Actions.SKIP.run("hello");
    }
}

通过以特定顺序使用javac参数可以重现该问题。简而言之,为了成功,必须始终在使用该Actions类的Program类之前对其进行编译,否则javac不能以一种明智的方式对其进行处理:

# this case fails
echo "Trying order: javac Program.java Actions.java ActionSpec.java"
rm *class
javac -verbose Program.java Actions.java ActionSpec.java

# this case fails
#rm *class
#javac Program.java Actions.java ActionSpec.java

# this case fails
#rm *class
#javac ActionSpec.java Program.java Actions.java

# this case succeeds
#rm *class
#javac ActionSpec.java Actions.java Program.java

# this case succeeds
#rm *class
#javac Actions.java ActionSpec.java Program.java

# this case succeeds
#rm *class
#javac Actions.java Program.java ActionSpec.java

发生编译错误时,它始终是相同的-找不到Actions枚举实例上的run方法,即使它们都实现了具有该run方法的接口。

Program.java:6: cannot find symbol
symbol  : method run(java.lang.String)
location: class problem.Actions
        Actions.SKIP.run("hello");

该错误似乎与Oracle网站上报告的错误有关。我在mac
os x 10.7.2 x86_64上使用javac 1.6.0_29,但也在Linux上重现了它。

当我使用Maven进行构建时,这个问题变得很明显,并且似乎对编译顺序没有任何控制权。因此,我正在寻找一种解决方法,以强制Maven以避免该编译器错误的顺序编译文件,或摆弄编译器标志(或类似的东西)来避免这种情况。这个问题在工作站和持续集成环境中都会出现,因此必须全盘工作。有什么建议?

编辑:尝试了以下变通办法,尽管仅将问题枚举分配给具有其实现的接口类型的变量,却令人惊讶地导致错误消失。

public class Program {

    public static void main(String[] args) {
        ActionSpec a = Actions.SKIP;
        a.run("hello");
    }
}

仍然对其他意见感兴趣。


问题答案:

我玩了一下,发现添加了简单的演员表:

public static void main(String[] args) {
    ((ActionSpec)Actions.SKIP).run("hello");
}

解决了这个问题。将此枚举作为方法参数传递给接口也可以解决问题



 类似资料:
  • 我有一个应用程序,它使用Maven构建一个带有Maven汇编插件的JAR。 该项目包括一个依赖项列表,其中一个是另一个Maven项目。我正在使用Eclipse开发,当我运行该项目时,一切都正常。当我使用Maven目标构建时,它会生成JAR,但当我运行JAR时,它会给我这个错误: 这是pom。主项目的xml文件: 这是my utils项目依赖项的pom: 这个问题与Java邮件依赖性有关。如你所见,

  • 问题内容: 尝试执行mvn全新安装时出现编译错误。 Java版本是 Maven版本 Pom.xml 任何帮助,将不胜感激。 问题答案: 问题是您的maven使用的是Java 5(正如您的评论所述)。您必须将JAVA_HOME变量更改为指向jdk 6或更高版本。看着 : 使用javac时出错:“javac:无效标志:-s”

  • 我在尝试执行mvn clean安装时遇到编译错误。 Java版本是 Maven版本 Pom.xml 任何帮助将不胜感激。

  • 我使用的是jaxb-api,V2.2.9如果有关系的话。Maven依赖项是 下面是正在发生的事情的更详细的输出... mojoSuccedeord.codehaus.mojo:sql-maven-plugin:1.5(create-test-db)mojoStarted org.apache.maven.plugin:maven-compiler-plugin:2.3.2(default-comp

  • 问题内容: 当我在Netbeans中构建并运行程序时,它可以正常工作。但是当我尝试“ mvn compile”时,使用相同的pom.xml文件会出现以下错误: 我的Java版本不是1.3,这里是“ mvn -version”的结果 这是第53行: 问题答案: 问题是在Maven2中默认使用和 您可以通过将其添加到pom中来解决此问题: 将其放在最顶层的父pom中是很实际的,这样您派生的pom不需要

  • 编译模块com。实例我的包裹。GWT。HelloGWT [INFO]验证新编译的单元 [INFO]在第一次过程中忽略了1个单元,其中包含编译错误 [INFO]编译时将-strict或-logLevel设置为TRACE或DEBUG以查看所有错误 [INFO]在文件:/home/ilsurih/Projects/maven hibernate/src/main/java/com/example/myP