2017-01-09 3 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 здесь, хотя я не уверен, где эта проблема. Возможно ли, что мое приложение создается с помощью неправильного компилятора здесь?

Любая идея, как я могу решить эту проблему?


Update:

Последнее сообщение в /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

Вы пытались поставить LOG перед вызовом '.getAnnotation()' в компараторе? Просто чтобы убедиться, что это не тот метод, который «висит», и фактически вводится код-компаратор. – Fildor

ответ

1

Метод List#sort(Comparator) является новым в Java 8. Если ваш Tomcat работает с Java 7, он не найдет метод. Что вы можете сделать, так это использовать версию Java 7 Collections#sort(Collection, Comparator), которая существует в Java 7 и Java 8.

Вообще говоря, лучше скомпилировать свой код с той же версией Java, которую вы собираетесь запустить. В этом случае компилятор даст вам ошибку, а не время выполнения.

+0

Спасибо, это была действительно проблема! – displayname

0

Мое предположение - это недостающая зависимость от используемой библиотеки (используете ли вы ASM?) При развертывании веб-приложения на tomcat.

Чтобы быть более точным, мне нужно будет увидеть полные журналы tomcat и импорта вашего класса.

+0

Какая библиотека может быть? Это просто 'List # sort', что я вызываю, но где я могу получить журналы tomcat? – displayname

+0

на самом деле вы используете AnnotationNode и Annotation в своем методе сортировки, поэтому, если загрузчик классов не загружает эти классы, он может объяснить тайм-аут – mrtexaz

+0

журналы tomcat: попробуйте в/var/log/tomcat (при использовании linux) – mrtexaz

Смежные вопросы