Java 应用程序无处可去 - 我有版本控制问题吗?

标签 java maven tomcat

我在 Tomcat 7 和 OpenJDK Java 1.7 下运行的 Java 应用程序中有以下非常简单的代码

List<AnnotationNode> children = parent.getChildren();

LOGGER.debug("sorting ...");

children.sort(new Comparator<AnnotationNode>() {
    @Override
    public int compare(AnnotationNode o1, AnnotationNode o2) {

        int result;
        try {
            Annotation a1 = o1.getAnnotation();
            Annotation a2 = o2.getAnnotation();             
            LOGGER.debug("compare ..");
            result  = a1.getStart() - a2.getStart();
        } catch(Exception e) {
            LOGGER.debug("huh??", e);
            result =0;
        }

        return result;
    }           
});

请原谅那些 LOGGER 消息,但这是我追查问题根源的唯一方法。当我执行 GET 请求时,程序只是进入了无人区,请求被吞没了。

我已经在 Debug模式下启动了 Tomcat,以便从我的 Eclipse 远程调试应用程序。结果是它到达了 .sort() 但它永远不会到达我的 compare() 实现。所以我收到的最后一条调试消息是 sorting ... 就是这样。

我正在部署它的机器安装了 Java 8

openjdk version "1.8.0_111"
OpenJDK Runtime Environment (build 1.8.0_111-8u111-b14-2ubuntu0.16.04.2-b14)
OpenJDK 64-Bit Server VM (build 25.111-b14, mixed mode)

但是父 pom.xml 是为 Java 7 设置的:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>
        <!-- etc. -->
    </plugins>
</build>

这看起来像是我这里的 Java 版本有问题,尽管我不确定这个问题发生在哪里。有没有可能是我的应用程序是用错误的编译器构建的?

知道如何解决这个问题吗?


更新:

/var/log/tomcat7/catalina.out 中的最后一条消息说:

SEVERE: The exception contained within MappableContainerException could not be mapped to a response, re-throwing to the HTTP container
java.lang.NoSuchMethodError: java.util.List.sort(Ljava/util/Comparator;)V
    at at.company.enrichment.processor.AnnotatedDocumentTree.addNode(AnnotatedDocumentTree.java:104)
    at at.company.enrichment.processor.AnnotatedDocumentTree.initialize(AnnotatedDocumentTree.java:70)
    at at.company.enrichment.processor.AnnotatedDocumentTree.<init>(AnnotatedDocumentTree.java:41)
    at at.company.enrichment.processor.DocumentProcessor2.process(DocumentProcessor2.java:112)

为什么我在这里得到一个 NoSuchMethodError 异常?

最佳答案

List#sort(Comparator) 方法是 Java 8 中的新方法。如果您的 Tomcat 使用 Java 7,它将找不到该方法。您可以做的是使用 Java 7 和 Java 8 中存在的 Java 7 版本 Collections#sort(Collection, Comparator)

一般来说,最好使用您打算运行它的相同 Java 版本来编译您的代码。在那种情况下,编译器会给你错误,而不是运行时。

关于Java 应用程序无处可去 - 我有版本控制问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41545686/

相关文章:

linux - 在 linux 中使用 verbose 启动 tomcat

Apache ACE 与 Apache Felix 一起嵌入在 Tomcat 中?

java - 如何复制二维数组并添加新行来存储 Java 中列的总和?

java - java新手,需要帮助

java - 向 Jframe 添加控制台

java - 项目中的代码打包后如何编写调用Jar文件的Maven脚本?

Maven 原型(prototype)目录 : specify custom location(s)

maven - 如何更改部署在 TOMCAT 6.0 中的 Spring MVC 应用程序的上下文路径

java - 流编程 : subscriber and publisher to keep track of count?

Maven 插件依赖 - 在我所有的 poms 中使用源插件