Лямбда-выражения java 8 исключение: java.lang.NoSuchMethodError: java.lang.invoke.LambdaMetafactory.metaFactory

У меня проблема с запуском следующего кода:

    public class LambdaTesting {
        public static void main(String[] args){
             new LambdaTesting();    
        }
        public LambdaTesting(){
            test1();
        }
        private void test1(){
            Runnable x = () -> System.out.println("ok"); //error
        }
    }

что вызывает следующее исключение:

*Exception in thread "main" java.lang.IncompatibleClassChangeError 
at java.lang.invoke.MethodHandleNatives.linkMethodHandleConstant(MethodHandleNatives.java:383)
    at LambdaTesting.test1(LambdaTesting.java:24)
    at LambdaTesting.<init>(LambdaTesting.java:20)
    at LambdaTesting.main(LambdaTesting.java:15)
Caused by: java.lang.NoSuchMethodException: no such method: java.lang.invoke.LambdaMetafactory.metaFactory(Lookup,String,MethodType,MethodHandle,MethodHandle,MethodType)CallSite/invokeStatic
    at java.lang.invoke.MemberName.makeAccessException(MemberName.java:765)
    at java.lang.invoke.MemberName$Factory.resolveOrFail(MemberName.java:882)
    at java.lang.invoke.MethodHandles$Lookup.resolveOrFail(MethodHandles.java:1019)
    at java.lang.invoke.MethodHandles$Lookup.linkMethodHandleConstant(MethodHandles.java:1284)
    at java.lang.invoke.MethodHandleNatives.linkMethodHandleConstant(MethodHandleNatives.java:381)
    ... 3 more
Caused by: java.lang.NoSuchMethodError: java.lang.invoke.LambdaMetafactory.metaFactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
    at java.lang.invoke.MethodHandleNatives.resolve(Native Method)
    at java.lang.invoke.MemberName$Factory.resolve(MemberName.java:854)
    at java.lang.invoke.MemberName$Factory.resolveOrFail(MemberName.java:879)
    ... 6 more*

Я установил jdk8, загруженный с: http://jdk8.java.net/lambda/ (Windows x64 версия)

Я запускаю его в Eclipse. Версия: 4.4.0 загружена с: http://downloads.efxclipse.org/eclipse-java8/2013-06-30/ (файл: org.eclipse.sdk.ide-win32.win32.x86_64.zip 30 июня 2013 г. 17:35 180M)

файл eclipse.ini:

-vm
C:\Program Files\Java\jre8\bin\java.exe
-startup
plugins/org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.200.v20130521-0416
-showsplash
org.eclipse.platform
--launcher.defaultAction
openFile
--launcher.appendVmargs
-vmargs
-Xms40m
-Xmx512m

Свойства проекта -> Компилятор Java -> Уровень соответствия компилятора: 1.8 (БЕТА) (установлен флажок Использовать параметры соответствия по умолчанию).

Свойства проекта -> Путь сборки Java -> Библиотеки: Системная библиотека JRE [jre8]

Конфигурации запуска проекта:

[Вкладка JRE] Project JRE (jre8) отмечен

[Вкладка «Путь к классам»] Записи Boostrap: Системная библиотека JRE [jre8]

Я также попытался запустить LambdaTesting.class из командной строки в каталоге jre8 / bin, но появилось то же исключение.

Версия Java:

C:\Program Files\Java\jre8\bin>java.exe -version
java version "1.8.0-ea"
Java(TM) SE Runtime Environment (build 1.8.0-ea-b102)

Моя операционная система: Windows 7 x64

Какие-нибудь подсказки?

Благодаря @assylias я решил проблему компиляции из командной строки с помощью jdk1.8.0 / bin / javac.exe, но все еще безрезультатно в Eclipse. Похоже, у Eclipse неправильный компилятор. Я попытался изменить настройки в: «Настройки» -> «Java» -> «Компилятор», но я могу выбрать только версию 1.7 в «Совместимость сгенерированных файлов .class» (в этом параметре нет версии 1.8). "Использовать настройки соответствия по умолчанию" вызывает вышеупомянутое исключение.


person DominikStyp    schedule 12.08.2013    source источник
comment
У меня ваша программа компилируется и работает нормально (b100). Вы пробовали скомпилировать его с помощью javac из командной строки? Похоже, это проблема конфигурации затмения.   -  person assylias    schedule 13.08.2013
comment
@assylias. Да, работает без подтяжек. Спасибо. :)   -  person Rohit Jain    schedule 13.08.2013
comment
Eclipse не показывает никаких ошибок, но если я запускаю этот код как приложение Java, он генерирует исключение.   -  person DominikStyp    schedule 13.08.2013
comment
@assylias: Спасибо, javac решил проблему компиляции, но я все еще не могу правильно скомпилировать код в Eclipse. Есть какие-нибудь подсказки для Eclipse?   -  person DominikStyp    schedule 13.08.2013
comment
@ user2676480 Нет, я никогда не любил eclipse ;-) Кажется, вы не одиноки, у вас проблемы с eclipse + java8: stackoverflow.com/questions/17366615/   -  person assylias    schedule 13.08.2013
comment
Учитывая, что это бета, я бы подумал, что было бы более чем несправедливо делать какие-либо суждения о затмении на этом бейсисе.   -  person TechTrip    schedule 14.11.2013


Ответы (1)


Я обнаружил, что ваш пример хорошо компилируется для последней бета-версии. Не уверен, что вы пытаетесь оценить, но я провел похожий тест:

public class LambdaTesting {
    public static String[] strs = { "a", "aa", "aaa"};

    public static void main(String args[]) throws Exception {
        ExecutorService pool = Executors.newFixedThreadPool(3);
        Set<Future<Integer>> set = new HashSet<Future<Integer>>();
        for (String word : strs) {

            Callable<Integer> c = (() -> word.length());

            Future<Integer> future = pool.submit(c);
            set.add(future);
        }
        int sum = 0;
        for (Future<Integer> future : set) {
            sum += future.get();
        }
        System.out.printf("The sum of lengths is %s%n", sum);
        System.exit(sum);
    }
}

Я использовал пример исполнителя, который нашел здесь: метод java Runnable run (), возвращающий значение в качестве базовой программы и заменил количество слов лямбда-выражением. Все это отлично работало с последней бета-версией Java 8 и сборкой eclipse Kepler от сентября 2013 года, как показано здесь: http://downloads.efxclipse.org/eclipse-java8/ - Поездка

person TechTrip    schedule 14.11.2013