Как узнать, скомпилирован ли класс с openjdk или sunjdk? - PullRequest
0 голосов
/ 10 декабря 2018

Я хочу использовать в своем продукте несколько банок сторонних производителей, например саксонику.Ранее мы использовали Oracle JDK.Теперь мы удаляем Oracle JDK для использования OpenJDK.Могу ли я использовать тот же jar.

В этом контексте я хочу знать, построен ли мой jar с Oracle JDK или OpenJDK?Как я могу это знать?

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Поскольку вы пометили вопрос «Saxon»: Saxonica в настоящее время создает выпущенные JAR-файлы с использованием Oracle JDK, хотя это может измениться в будущем из-за изменений в лицензировании Oracle.Если мы переключаемся, пользователи никак не могут заметить разницу.

Уровень совместимости между различными JVM настолько высок, что мы даже не потрудимся тестировать несколько JVM.Я не помню, чтобы когда-либо была ошибка, когда все работало на одной JVM, а не на другой.Конечно, вам нужно использовать JVM / JDK в правильном диапазоне версий: Saxon 9.8 работает с Java 6 и более поздними версиями, Saxon 9.9 с Java 8 и более поздними версиями.поддерживается, а какие нет.В Саксонике это никогда не было бинарно поддерживаемым / не поддерживаемым решением.Если вы обнаружите проблему, которую мы можем воспроизвести в лаборатории, мы постараемся решить ее, если сможем;если вы обнаружите проблему, которую вы можете воспроизвести только с помощью какой-то экзотической платформы, мы скажем, что не можем ее исправить: но это не значит, что вы «не поддержаны».То же самое относится к «и позже» в версии Java - вы можете использовать Saxon с версией Java 17 в день его выпуска, и если вы обнаружите, что использование японского календаря больше не работает, то мыприму к сведению факт;мы не обязательно исправим это, но не скажем вам, что продукт (или клиент, или платформа) не поддерживается.

0 голосов
/ 10 декабря 2018

Не имеет значения, был ли класс скомпилирован с помощью OpenJDK или Sun / Oracle JDK.Компиляторы байт-кода Java в данном выпуске OpenJDK и соответствующем выпуске Oracle JDK должны производить идентичный код 1 , если он вызывается с эквивалентными параметрами, и так далее.Компиляторы построены из того же дерева исходного кода.

Кроме того, насколько мне известно, компиляторы OpenJDK и Oracle JDK не помещают эту информацию в скомпилированные классы.И глубокое погружение дерева исходных текстов OpenJDK / Oracle JDK 8 подтверждает это.Нет соответствующих недокументированных атрибутов, испускаемых стандартными компиляторами javac 3 .


Могу ли я использовать те же (сторонние) банки?

Да.Не должно иметь значения, что классы в JAR были скомпилированы с OpenJDK по сравнению с Oracle JDK.

Однако, предостережение - это Java версии .Если сторонний файл jar поддерживает, скажем, Java 7, и вы пытались использовать его с Java 8 (OpenJDK или Oracle), то у вас могут возникнуть проблемы, и вам может потребоваться использовать более новую версию jar.Проверьте сайт поддержки на наличие библиотек, от которых вы зависите 2 .

И ... конечно ... вы должны тщательно протестировать свое приложение, чтобы выявить любые проблемы, которые могут (гипотетически)может быть связано с переходом на OpenJDK.


1 - файлы могут не совпадать побайтно, потому что компиляторы байт-кода добавляют пару недокументированных атрибутов, содержащих метки времени исходного и целевого файлов.Это можно подавить при компиляции.

2 - Вы можете обнаружить, что поставщик библиотеки сертифицирует свою библиотеку только для Oracle JDK.Если вы обнаружите это, вам, вероятно, следует поговорить с ними напрямую, чтобы понять причины этого и последствия для использования вами библиотеки.Это может быть только краткосрочной проблемой.(Если поставщик отказывается поддерживать OpenJDK или Oracle JDK в долгосрочной перспективе, он может потерять значительный процент своих клиентов.)

3 - я смутно напоминаю, что старыеКомпилятор GNU Jikes раньше помещал другие нестандартные атрибуты в файл «.class» для идентификации компилятора, но это не поможет вам различить компиляторы Oracle JDK и OpenJDK.

...