Я работаю над небольшой библиотекой, и по понятным причинам я хотел бы создать код, используя все функции Java 11 (за исключением модулей, которые я предполагаю на данный момент), но я бы хотел, чтобы библиотека была совместима с Java 8 и выше.
Когда я пытаюсь это сделать:
javac -source 11 -target 1.8 App.java
я получаю следующее сообщение:
warning: source release 11 requires target release 11
... и когда я смотрю на байт-код, я вижу, чтоверсия класса 0x37
(Java 11):
$ xxd App.class
00000000: cafe babe 0000 0037 ...
И Java 8 не может его загрузить:
Exception in thread "main" java.lang.UnsupportedClassVersionError: App has been
compiled by a more recent version of the Java Runtime (class file version 55.0),
this version of the Java Runtime only recognizes class file versions up to 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:495)
Как люди обеспечивают такую совместимость?Я открыт для всех инструментов сборки.
Мне кажется, просто преобразовать язык высокого уровня (Java) в язык низкого уровня (байт-код).Мне кажется, что когда меняется язык высокого уровня, уровень низкого уровня должен оставаться прежним.Вот почему я подумал, что это возможно.
ОБНОВЛЕНИЕ
Ребята, я не думаю, что этот ответ дублирует Перейдите в OpenJDK-11, но скомпилируйте вJava 8 , потому что там ОП спрашивает, как продолжать создавать код с Java 8
функциями, но ориентироваться на Java 11 (что является просто известной обратной совместимостью).Мой вопрос наоборот: я хочу создать код на Java 11, но нацеливаться на Java 8. Я столкнулся с этим вопросом, когда изучал эту тему, прежде чем сформулировать вопрос.Я не нашел это применимым к моей ситуации.
Другой вопрос Можно ли скомпилировать код Java 8 для запуска на Java 7 JVM действительно похоже на мой вопрос, но он был задан в2013 и байт-код явно изменились между Java 7 и Java 8.
Я не думал, что байт-код изменился так сильно после Java 8, поэтому я задал этот вопрос.