Java — Проблема с совместимостью


Проблема совместимости версий Java

У меня есть клиентский jar, созданный с использованием java 1.6 и использующий enum и другие новые функции java, мое приложение построено на java 1.4. Я хочу использовать этот клиентский jar в моем приложении.

Это возможно сделать?

5 ответов

Обычно: нет, ты не можешь.

Вы можете использовать библиотеку / переписчик байт-кода, например Retroweaver, чтобы переписать библиотеку, чтобы она была 1.4 совместимой. Есть также Retrotranslator, который делает то же самое и другие инструменты. В последний раз я использовал Retroweaver сразу после выхода Java 5, поэтому я не могу говорить о его текущем состоянии.

Но это будет в лучшем случае взломать. Использование древней версии Java в лучшем случае является обязательным условием, и вам следует как можно скорее перейти на версию Java 5 как минимум.

Вашему клиентскому банку понадобится JRE 1.6. Что касается вашего приложения, в идеале вы должны быть в состоянии запустить его на JRE 1.6, поскольку Java обратно совместима.

Поэтому вам нужно перенести ваше приложение на JRE 6, перекомпилировать, и тогда вы сможете использовать клиентский jar.

Тем не менее, обновление и портирование имеет свои сложности и последствия.

Не можете ли вы перейти на JDK1.6?

иначе вам нужно добавить rt.jar из JDK1.6 в ваш путь к классам, но это вызовет конфликты для классов, общих для JDK1.4 и JDK1.6

Вы можете попробовать сделать JAR доступным через интерфейс веб-сервиса и запустить его как 1.6; должен работать, но я не скажу вам, что это будет легко.

Очевидно, вам нужен JRE 1.6 или выше для запуска кода вашей библиотеки. Из-за обратной совместимости часть 1.4 вашего приложения должна работать и на том же JRE. Как вы взаимодействуете между вашей 1.6 lib и вашим приложением 1.4 — другой вопрос.

Ваше приложение не может использовать перечисления или другие функции 1.5 напрямую. Я думаю, что если все, к чему у вас есть прямой доступ в вашей библиотеке, совместимо с 1.4, это должно работать. Например, если ваше приложение определяет интерфейс, а библиотека обеспечивает реализацию этого. (Т.е. типичный шаблон плагина.) Если интерфейсу вашей библиотеки необходимо, чтобы приложение использовало 1.5 функции, например, передайте значение enum в качестве параметра метода, которое, очевидно, не будет работать с вашим существующим байтовым кодом.

Влияет ли на собственный интерфейс Java (JNI) проблема совместимости с C ++ ABI?


Влияет ли на собственный интерфейс Java (JNI) проблема совместимости с C ++ ABI?

Я занимаюсь разработкой приложения на Java. Я хотел бы использовать собственный интерфейс Java (JNI) для вызова функций в библиотеке C ++. У меня есть доступ к коду для библиотеки C ++, и я могу перестроить его, однако мне может понадобиться. (Например, я могу статически связать среду выполнения C ++.)

Я могу требовать, чтобы мои пользователи имели JRE 6 или выше, но я не могу требовать, чтобы у них была какая-то конкретная среда выполнения C ++.

Коллега указал мне на эту статью в блоге: http: //www .trilithium.com /johan /2005/06 /static-libstdc /, который запрещает использование динамически загружаемого кода C ++.

Другой сотрудник указал мне на это сообщение об ошибке: http: //bugs. sun.com/bugdatabase/view_bug.do?bug_ >

Суть проблемы, насколько я понимаю, состоит в том, что двоичный интерфейс libstdc ++ часто изменяется. Если приложение C ++ загружает разделяемую библиотеку C ++, созданную с помощью другого компилятора, две несовместимые библиотеки libstdc ++ будут загружены в память одновременно.

В отчете об ошибке объясняется решение для Java 1.4.2: «Мы статически связываем среду выполнения C ++ в JDK и включаем скрипт компоновщика, чтобы скрыть символы из libstdc ++ и других внутренних символов. В результате эти символы становятся невидимыми для кода JNI, и когда некоторый нативный код должен вызываться во время выполнения C ++, вызов будет разрешен с помощью соответствующего libstdc ++. итак. Есть еще два libstdc ++., поэтому загружаются одновременно, но это должно быть мягко. «

У меня есть несколько вопросов по этому поводу.

Во-первых, продолжает ли OpenJDK использовать этот подход?

[ РЕДАКТИРОВАТЬ . Я задал этот вопрос в списке рассылки для разработчиков OpenJDK. Ответ — да, HotSpot все еще статически связывает libstdc ++, но, очевидно, «большинство дистрибутивов Linux исправляют это». Другой разработчик отмечает, что для этого даже не требуется патч: «Настройка STATIC_CXX = false должно быть достаточно (по умолчанию true). «]

Цукерберг рекомендует:  Qa_engineer - В чем разница между специальностями для тестировщиков

Во-вторых, даже в этом случае действительно ли полезно иметь два несовместимых libstdc ++., загружаемых одновременно?

В-третьих, позволяет ли этот подход (скрыть символы в JDK) решить все проблемы совместимости?

В статье блога, на которую ссылаются выше, предупреждает, что «код, скомпилированный для разных ABI, просто не совместим двоично». И позже, что «поддержка языковой среды выполнения обычно полагается на то, что некоторые данные используются совместно, например, для доступа к какой-либо блокировке или глобальной структуре данных (аналогично тому, как программам на C требуется общий номер ошибки)».

Похоже, проблема не может быть решена.

Опять же, возможно, несовместимость ABI больше не является проблемой. Статья в блоге старше шести лет. Один ответ на другой вопрос stackoverflow ( Совместимость ABI GCC ) утверждает, что «начиная с gcc-3.4.0, ABI совместим с прямым интерфейсом Это было успешно?


Буду признателен за любые рекомендации по этим вопросам. (И эй, спасибо, что прочитали все это!)

редактирует

Мой вопрос становился довольно длинным, поэтому я не дал всех подробностей. Чтобы ответить на комментарии Уилла:

  1. Мне нужно только вызвать внешние функции «C». (Например, я использую javah для генерации файла заголовка C.)
  2. Мне не нужно взаимодействовать со средой выполнения C ++ в JVM. (Мне просто нужно отправить строки в библиотеку C ++.)

Java — Проблема с совместимостью

В Яве 1.5 и класа Стринг появился такой класный метод.

где :
getPairName(0) и getIgral(gameNumber, dealNumber) две строчки.
и даже откомпилил в Идейке — всё супер.

но вот после того как собрал\заобфусцировал аплетик то юзверя(и я в томже числе) видят

Может у когонить есть мысли по этому поводу

ЗЫ Я конечно понимаю что есть такая штучка у стринга как indexOf != -1. но тогда спрашиваеться накой сану париться и выпускать новые версии.

Да, тут налицо пример несовместимость версий. При разработке приложения нужно ориентироваться на версию Java, которая стоит у юзеров. Или требовать от них конкретной версии.

С этим в джаве туго. Так как тут не только несовместимость сверху вниз. Тут может быть даже несовместимость снизу вверх! То есть, прога, написанная для 1.3, может не работать на 1.4. Почему? Потому, что могут меняться определения интерфейсов — прибавляться новые методы. И если ты имплементировал какой-то интерфейс, к которому в более новой версии джавы прибавился метод, то твой класс уже не имплементирует все методы интерфейса, то есть имплементирует неправильно! И это будет причиной ошибки при исполнении.

всем спасобо. как в идейку посмотреть я знал. и там всё в поряде так как компилилось и запускалось из идейки всё НА УРА. а вот с готовым апплетом так и не разобрался прийдёться откатиться к версии 1.4 хотя (спасибо Lamer George) в Ява консоле:

Java Plug-in 1.5.0_04
Using JRE version 1.5.0_04 Java HotSpot(TM) Client VM


вот и объясните мне как эта версия не знает:

contains
public boolean contains(CharSequence s)
Returns true if and only if this string contains the specified sequence of char values.

Parameters:
s — the sequence to search for
Returns:
true if this string contains s, false otherwise
Throws:
NullPointerException — if s is null
Since:
1.5

Проблемы с совместимостью версий?

Я новичок в среде opentaps. У меня есть некоторые сомнения в opentaps. У меня есть версия opentaps1.5. Он содержит версию apache 6.0.26 и ofbiz 10. Я хочу работать с помощью jdk1.8. При компиляции программы с использованием jdk1.6 или 1.7 она обеспечивает ожидаемые результаты. Когда я использовал jdk1.8 Он показывал

Пожалуйста, расскажите, как решить эту проблему. Мне нужно работать opentaps1.5 с jdk1.8. Заранее благодарю.

Привет @chandu, Спасибо за вашу информацию, у меня возникла проблема с использованием jdk1.8, только когда я изменил jdk 1.6 или 1.7, он работает хорошо. – Vignesvar Asokkumar 17 авг. 15 2015-08-17 11:26:15

1 ответ

Apache OFBiz, являющийся базой opentaps, только что представил совместимость Java 1.8 в предстоящей ветке 14.12. OFBiz 10 очень старый и не поддерживается больше. Он несовместим с Java 1.8.

Насколько я знаю, opentaps разветвляется из OFBiz и может иметь более новые версии, совместимые с Java 1.8.

Чтобы получить более точную информацию, обратитесь в службу поддержки (http://www.opentaps.org/services-support).

Создан 17 авг. 15 2015-08-17 10:38:30 Michael Brohl

Спасибо @MichaelBrohi. Это полезно для меня. Но мне нужны Opentaps1.5 и jdk1.8. Я знаю версию apache и ofbiz через wiki, поэтому я не мог знать, какие версии существуют в opentaps1.5. Извините за выше. Пожалуйста, дайте мне совместимость между opentaps1.5 и jdk1.8. еще раз спасибо – Vignesvar Asokkumar 17 авг. 15 2015-08-17 11:59:30

Почему не работает Java и как его включить в браузере?

Многие пользователи интернет зачастую сталкиваются с тем, что на сайтах не работает выпадающее меню, не проигрываются видеоролики, ничего не происходит при нажатии на кнопки и пр. Или, к примеру, не показываются картинки, а вместо них появляется надпись: «В этом плагине имеются уязвимости безопасности. Щелкните здесь для включения плагина Java(TM) Platform SE 7 U». Всё это связано с работой плагина Java, который присутствует в браузерах.

Цукерберг рекомендует:  Страница из двух слайдов

Opera


1) Нажимаем сочетание клавиш «Ctrl+F12»
2) В разделе «Содержимое» активируем пункт «Включить JavaScript»
3) Нажимаем «OK»

Mozilla Firefox

1) Нажимаем сочетание клавиш «Ctrl+Shift+A»
2) Переходим в раздел «Плагины»
3) Напротив модуля Java(TM) Platform ставим переключатель в положение «Всегда включать»
4) Закрываем вкладку «Управление дополнениями»

Apple Safari

1) Нажимаем сочетание клавиш «Ctrl+,»
2) Переходим на вкладку «Безопасность»
3) В разделе «Веб-содержимое» активируем опции «Включить Java» и «Включить JavaScript»
4) Закрываем окошко

Теперь Вы знаете не только как проверить, работает ли JavaScript в Вашем браузере (достаточно открыть эту статью и прочитать результат), но и как включить Java в Firefox, Chrome, IE, Opera и Safari!

Java 7 SE — не запускаются программы

Сообщений 4

1 Тема от Antares 07-09-2011 11:29:40

Тема: Java 7 SE — не запускаются программы

Совсем недавно, буквально неделю назад вышло долгожданное некоторыми обновление Java 7, но после установки непонятным образом вдруг перестали запускаться некоторые программы (апплеты). После нажатия «двойным-кликом» на приложение оно просто не запускалось и никаких сообщений об ошибках.

Первым делом начал искать информацию в поисковиках на предмет решений, но. решений нет, как будто такой проблемы не было и вовсе ни у кого. Что только ни делал, но программы упорно не желали работать. В конечном итоге это окончательно достало и я решил «добить» эту «несговорчивую» джаву.

Проблема как оказалось в непонимании новой версией кириллицы, а вернее по всей видимости вообще любого языка отличного от английского. То есть как только программа перемещается в папку с английским названием, и если в пути так-же не присутствует отличных от английских символов, всё сразу начинает работать. Решение оказалось простое — замена «запускателя» (лаунчера) программ от предыдущей версии 1.6 Update 27. Это ни коим образом не сказывается на работе Java программ, так-как это обычный «стартер», в задачи которого входит подготовка и передача приложения на исполнение виртуальной машине Java.

Кто столкнулся с такой же проблемой, предлагаю скачать корректный «стартер». Просто замените им файл «javaw.exe» в папке куда вы установили Java. Обычно это — «C:\Program Files\Java\jre7\bin«. Да, «стартер» для 32 битной редакции Java , поэтому не ошибитесь.

При копировании или цитировании материала ссылайтесь пожалуйста на источник.


Будущее Java или ломаем backward compatibility полностью

Как известно, за 20 лет существования Жабы, накопилось и обнаружилось целая охапка проблем, связанных с кривым дизайном, реализцией, отсутствием нужных фишек и синтаксического сахара.

А что если с 10-й версии исправить все эти проблемы, полностью игнорируя обратную совместимость? Назвать например новую версию Жабы как Java X и развивать данную версию парралельно со «старой». Те, кому нужна обратная совместимость, будут сидеть на старых версиях, а те, кто начинает проект с нуля — пересядут на новую. Со временем все перекочуют на Java X, и необходимость в старых версиях отпадет навсегда.

Текущие проблемы Java:

  • checked exceptions
  • Отсутствие беззнаковых типов, вследствии чего имеем кривой API и трудности работой с сетью.
  • Убогие Generics, которые дженериками и не являются
  • Примитивные типы не являются объектами. Существуют убогие костыли-обертки, которые уродуют концепцию
  • Длина массивов не может превышать Integer.MAX. Огромные массивы не поддерживаются
  • Отсутствие Properties. Геттеры и сеттеры раздувают код и делают его нечитабельным
  • Кривой дизайн Cloneable и Serializable
  • Целый зоопарк всяких языков (Scala, Kotlin etc), которые по факту используют legacy JVM со всеми ее недостатками, пытаясь как-то выправить ситуацию и облегчить жизнь разрабов.

В общем комментируем, кто что думает по этому поводу.

Каково Java Native Interface (JNI), пострадавших от проблем совместимости C ++ ABI?

Каково Java Native Interface (JNI), пострадавших от проблем совместимости C ++ ABI?

Я занимаюсь разработкой приложений Java. Я хотел бы использовать Java Native Interface (JNI) для вызова функций в библиотеке C ++. У меня есть доступ к коду для библиотеки C ++, и я могу восстановить его, однако я, возможно, потребуется. (Например, я статический можно связать среды выполнения C ++).

Я могу требовать, чтобы мои пользователей имеет JRE 6 или больше, но я не могу требовать от них, чтобы иметь какую-либо конкретную среду выполнения C ++.

Коллега указал мне на этот блоге статью: http://www.trilithium.com/johan/2005/06/static-libstdc/ , который советует с использованием динамически загруженным C ++ кода.

Другой коллега указал мне на этот отчет об ошибке: http://bugs.sun.com/bugdatabase/view_bug.do?bug_ >

Суть проблемы, как я понимаю, что двоичный интерфейс libstdc ++ часто меняется. Если приложение C ++ загружает C ++ разделяемой библиотеки, которая была построена с другим компилятором, две несовместимой libstdc ++ библиотека будет загружена в память одновременно.

Цукерберг рекомендует:  Готовая страница 'Сайт в разработке' с возможностью сбора почтовых адресов

Сообщение об ошибке объясняет решение для Java 1.4.2:. «Мы статически связать C ++ выполнения в JDK и включен линкер скрипт, чтобы скрыть символы из libstdc ++ и других внутренних символов В результате, эти символы становятся невидимыми для JNI кода, и когда некоторые нативный код должен вызвать в режим исполнения C ++, то вызов будет разрешен с соответствующей libstdc ++. так. Есть еще два libstdc ++. так загружаются в то же время, но оно должно быть доброкачественным.»


У меня есть несколько вопросов по этому поводу.

Во-первых, это OpenJDK продолжать принимать этот подход?

[ EDIT: Я задал этот вопрос на список рассылки билд-DEV OpenJDK в. Ответ : да, HotSpot еще статически связывает libstdc ++, но , видимо , « в большинстве дистрибутивов Linux патч на это». Другой разработчик отмечает , что это даже не требует исправления: «Установка STATIC_CXX = ложь должна быть достаточно ( по умолчанию это так)»]

Во-вторых, даже в этом случае, это действительно доброкачественная иметь две несовместимые libstdc ++. Так загружены в то же время?

В-третьих, это такой подход (скрыть символы в JDK) решения всех проблем с совместимостью?

Блог статьи ссылка выше предупреждает, что «код скомпилирован с различным АБИС просто двоично не совместимы.» И потом, что «языковая поддержка во время выполнения, как правило, полагаются на некоторые данные, общие, например, для доступа к какой-то замок или глобальной структуры данных (аналогично тому, как программы C нужен общий ERRNO).»

Это делает его звук, как эта проблема не может быть решена.

Опять же , может быть , ABI несовместимость больше не проблема. В блоге статьи за шесть лет. Один ответ на другой вопрос StackOverflow ( совместимость GCC ABI ) утверждает , что «Поскольку GCC-3.4.0, то ABI поступательно совместимы.» Имеет , что был успешным?

Я бы признателен за любые рекомендации по этим вопросам. (И эй, спасибо за чтение всего этого!)

редактирует

Мой вопрос был уже довольно долго, так что я не давал всю специфику. Для решения комментариев Уиллы:

  1. Мне нужно только позвонить Экстерн функции «C». (Например, я использую javah для создания файла заголовка C).
  2. Мне не нужно, чтобы взаимодействовать с выполнением в C ++ в JVM. (Я в основном просто нужно отправить строки в библиотеку C ++.)

Проблема совместимости с Java

Я написал код Java и скомпилирован с jdk1.8.0_60. После того , как .class файл генерируется я побежал , и это работает должным образом. Для распределения целей, я извлекал путь в JDK от PATH (переменная окружения) и дал путь jre1.8.0_60 , который установлен в отдельном каталоге. Когда я пытаюсь запустить тот же скомпилированный файл, он показывает следующее сообщение об ошибке.
Пожалуйста , помогите мне решить эту проблему. Если есть что — то другое , что требуется, пожалуйста , дайте мне знать. Благодаря!


Java-приложения с Windows 7 — есть ли проблемы с совместимостью?

November 2020

4.1k раз

с каким-то пушком вокруг Windows 7, знает ли кто имеет опыт работы с совместимостью Java с Windows 7? Если это будет беспокойство или же программа, вероятно, работает нормально?

Я бы особенно интересно, если кто-нибудь имеет опыт работы с Swing-приложений?

Эти версии доступны, как представляется, бета-версии, так что они не обеспечивают идеальную основу для оценки, но некоторые из них.

5 ответы

Есть несколько проблем свинга применения в windows7 там указаны ниже:

JCheckBoxMenuItem не будет показывать изображение

Ключевые вопросы. Иногда бежать не будет работать

У меня проблема с моим приложением качаться на Windows 7 (и, предположительно, Vista — не пробовал), является то, что Java Runtime указывает Windows, что UAC-известно, в то время как мое приложение, которое работает в JVM на самом деле не является , В результате, если кто-то устанавливает его в традиционном месте (например, C: \ Program Files \ MyApp), приложение не потому, что он не может записывать данные конфигурации и файлы журнала ошибок в его каталоге установки. Поскольку я использую некоторые сторонние библиотеки, которые пишут свои собственные файлы на текущий (т.е. установить) каталог, и у меня есть много более важных вещей, чтобы сделать, чем копаться в эти библиотеки просто, чтобы сделать их отчеты об ошибках и хранение конфигурации контроля учетных записей в курсе Я пошел по пути наименьшего сопротивления и изменил мой установки по умолчанию каталог на C: \ MyApp.

Я использую различные Java приложения на моем Win 7 x64 поле просто отлично и никогда не было никаких проблем. Даже некоторые из моих oldt плохо закодированных распашных приложения работали без проблем.

По большей части, Win 7 является Vista, в новой одежде. не должен иметь много проблем из-за этого.

Обновление информации, связанной с вопросом:

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

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

Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих