2015-12-31 2 views
1

Его очень странный случай, кажется, является повреждением файла .class. Наше приложение зависит от зависимости, предоставляемой другой командой. Имеются 2 java-файла: FTGService и FTGServiceLight implements FTGService.Метод отмечен как абстрактный, но не показан javap

Так что, когда я javap -p FTGService печатает:

.... 
public abstract java.util.List<munshi.transfers.domain.TransferredFile> getArchivedFilesByLastSyncTime(java.util.Date, java.util.Date, java.util.Date, java.util.Date, java.util.Date, java.util.List<java.lang.String>, java.util.List<java.lang.Integer>); 

Сделав javap -p FTGServiceLight, он печатает:

.... 
public java.util.List<munshi.transfers.domain.TransferredFile> getArchivedFilesByLastSyncTime(java.util.Date, java.util.Date, java.util.Date, java.util.Date, java.util.Date, java.util.List<java.lang.String>, java.util.List<java.lang.Integer>); 
.... 

Когда я javap -v FTGServiceLight, соответствующая информация может быть найдена here.

Но работает он выдает ошибку:

java.lang.AbstractMethodError: munshi.transfers.service.light.FTGServiceLight.getArchivedFilesByLastSyncTime(Ljava/util/Date;Ljava/util/Date;Ljava/util/Date;Ljava/util/Date;Ljava/util/Date;Ljava/util/List;Ljava/util/List;)Ljava/util/List; at broker.services.resolver.impl.FileSyncServiceImpl.fetchFiles(FileSyncServiceImpl.java:71) at broker.services.resolver.impl.TransferFileSync.run(TransferFileSync.java:71) at sun.reflect.GeneratedMethodAccessor129.invoke(Unknown Source) at

getArchivedFilesByLastSyncTime идет помеченный как abstract по какой-то причине. Кроме того, когда я его отладки, это то, что он показывает, как делать:

FTGServiceLight.getMethod("getArchivedFilesByLastSyncTime",Date.class,Date.class,Date.class,Date.class,Date.class, List.class, List.class)) 

enter image description here

Примечание modifiers показан как 1025 и делать Modifiers.isAbstract(1025) возвращается true. Таким образом, метод getArchivedFilesByLastSyncTime при отладке показан как abstract, но javap предлагает другое. Но когда я декомпилирую FTGServiceLight, он действительно показывает метод body, поэтому кажется, что он переопределен.

Что может быть причиной такого поведения

PS: Я проверил дерево МВН зависимостей, и альтернативный вариант для этого класса никогда не приходит в картине.

+0

Возможно, у вас несколько версий класса, лежащего вокруг, и один Javap видит, отличается от того, на который смотрит JVM. – Antimony

+0

Как упоминалось в почтовом скрипте. Существует только одна зависимость. – Jatin

ответ

2

Это похоже на проблему с несколькими зависимостями. Просто проверка дерева зависимостей Maven не гарантирует, что во время выполнения вы не будете иметь несколько версий одного и того же класса.

Это может быть в кэше, он может быть загружен из другого места, и т.д. В FileSyncServiceImpl, попытайтесь распечатать место, откуда FTGServiceLight был загружен:

System.out.println(
    FTGServiceLight.class.getClassLoader().getResource(
     FTGServiceLight.class.getName().replace('.', '/') + ".class")); 

И сравните с контекстом, где это класс:

System.out.println(
    FileSyncServiceImpl.class.getClassLoader().getResource(
     FileSyncServiceImpl.class.getName().replace('.', '/') + ".class")); 

Это тот же классlaoder?

Еще одна вещь, которую вы можете попробовать, - проверить, какие места, которые использует загрузчик классов для загрузки классов. В FileSyncServiceImpl сделать:

System.out.print(
    Arrays.toString(((URLClassLoader) 
     Test1.class.getClassLoader()).getURLs())); 

Это даст вам список файлов .jar (и каталогов), которые расположены по этому загрузчику классов. Затем вы можете проверить, находится ли FTGServiceLight в любом из них, и если он присутствует несколько раз.

+0

Спасибо @ Антон. Ваше первое предложение помогло мне решить проблему. Проблема заключалась в том, что многие из наших банок генерируются автоматически. Так получилось, что в моей зависимости была какая-то баночка, которая также содержала «FTGServiceLight» в той же структуре пакета. Но файл принадлежал предыдущей версии, а при автогенерации он включал предыдущий файл. И мое приложение подняло его, что привело к ошибке. – Jatin

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