2017-01-09 46 views
0

,在Java應用程序非常簡單的代碼,我的Tomcat 7的OpenJDK的Java下運行1.7Java應用程序無處不在 - 我有版本問題嗎?我有以下

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請求,程序只是進入無人區域,請求正在被吞噬。

我已經在調試模式下啓動了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例外嗎?

+0

「...進入無人地帶」 - 這是否意味着您正在進入暫停狀態?該名單有多大? – Fildor

+0

@Fildor該列表相當小,所以絕對不是它花的時間太長。 – displayname

+0

在比較器中調用'.getAnnotation()'之前,您是否嘗試過使用LOG?只是爲了確保它不是那種「懸掛」的方法,並且實際上輸入了比較器代碼。 – Fildor

回答

1

List#sort(Comparator)方法在Java 8中是新的。如果Tomcat與Java 7一起工作,它將找不到該方法。你可以做的是使用Java 7的版本Collections#sort(Collection, Comparator)存在於Java的7和Java 8

一般來說最好是與您要運行相同的Java版本編譯代碼。在這種情況下,編譯器會給你錯誤,而不是運行時。

+0

發現了謝謝,這的確是問題所在! – displayname

0

在Tomcat上部署Web應用程序時,我的猜測是您正在使用的庫(您是否使用ASM?)缺少依賴關係。

更確切地說,我需要看到tomcat的完整日誌和您的班級的進口。

+0

什麼庫可以這樣做?這只是'List#sort'我所調用的 - 但是我可以在哪裏獲得tomcat的日誌? – displayname

+0

實際上,您在排序方法中使用AnnotationNode和Annotation,因此如果類加載器無法加載這些類,它可以解釋超時值 – mrtexaz

+0

tomcat日誌:嘗試在/ var/log/tomcat中(如果使用linux) – mrtexaz

相關問題