java.lang.VerifyError при использовании vaadin и vaadin-server

Для проекта, над которым я работаю и зависит от vaadin-6.8.12, я хотел бы использовать классы Page/JavaScript, включенные в JAR-файл vaadin-server-7.0.6.

Однако, когда я включаю vaadin-server, я получаю java.lang.VerifyError при попытке использовать метод Page.getCurrent().

Чтобы проиллюстрировать это, я написал небольшую тестовую программу, которая демонстрирует такое же поведение:

import com.vaadin.server.Page;

public class Main
{
    public static void main(String[] args)
    {
            Page page = Page.getCurrent();
            System.out.println(page);
    }
}

Я установил путь к классам в файле (файлы JAR и Main.class находятся в одной папке):

vaadin-6.8.12.jar:vaadin-server-7.0.6.jar:vaadin-shared-7.0.6.jar:vaadin-
shared-deps-1.0.2.jar:vaadin-theme-compiler-7.0.6.jar

Затем запустите программу следующим образом:

java -cp $(cat vaadin.classpath):. Main

При запуске получаю следующую ошибку:

Exception in thread "main" java.lang.VerifyError: (class:
com/vaadin/server/Page, method: getJavaScript signature:
()Lcom/vaadin/ui/JavaScript;) Incompatible argument to function
at Main.main(Main.java:7)

Однако, если я изменю порядок vaadin-6.8.12 и vaadin-server-7.0.6, я не получу ошибку java.lang.VerifyError.

Я пробовал один и тот же тест для разных версий vaadin и vaadin-server, всегда с тем же результатом, что и выше.

vaadin не указан как зависимость от vaadin-server (и наоборот) в POM maven. Я использую JDK версии 1.6.0_32. Кто-нибудь знает, что может быть причиной этого?

Большое спасибо.


person deeMo    schedule 03.02.2015    source источник
comment
я не совсем уверен, что вы задумали, но на первый взгляд это выглядит очень неправильно. просто потому, что у вас нет показанных зависимостей, не означает, что у вас есть, например. одни и те же классы в одном и том же пакете, и этот код зависит от кода той же банки. простое смешивание пути к классам прекрасно объяснило бы это другое поведение: загрузчики классов выбирают первый класс, и вы получаете случайные ошибки.   -  person cfrick    schedule 03.02.2015
comment
я бы предпочел выбрать этот код по исходным файлам и поместить его в свой код (если позволяет лицензия), а не смешивать основные версии. ведь там еще есть код, скомпилированный GWT для клиента. если вы ожидаете, что что-то вроде аннотации @JavaScript будет работать между 6 и 7, вы можете принять вызов...   -  person cfrick    schedule 03.02.2015
comment
Спасибо за ответ cfrick. Я не рассматривал возможность включения кода непосредственно в свой проект. Также вы правы, вместо этого я должен был создать тестовый проект maven, чтобы убедиться, что все необходимые зависимости включены. Судя по вашему ответу и ответу Анри, я думаю, что главная ошибка состоит в том, чтобы пытаться смешивать версии Vaadin. Я просто запутался, почему в центральном репозитории maven нет совместимых версий.   -  person deeMo    schedule 04.02.2015


Ответы (1)


Вы не можете комбинировать Vaadin 6 и Vaadin 7 таким образом. Если вы хотите использовать функции Vaadin 7, вам необходимо перенести все приложение на использование Vaadin 7.

Если вы хотите выполнить какой-либо JavaScript на стороне сервера, в Vaadin 6 есть метод Window.executeJavaScript(), который вы можете попробовать использовать.

person Henri Kerola    schedule 04.02.2015
comment
Спасибо, Анри, это как раз то, что мне было нужно. Похоже, что в центральном репозитории maven нет общих версий vaadin и vaadin-server, поэтому я смешал версии. - person deeMo; 04.02.2015
comment
vaadin предназначен только для Vaadin 6 и vaadin-server для Vaadin 7. Тогда примите правильный ответ. - person Henri Kerola; 04.02.2015