Могу ли я использовать параметры времени выполнения, чтобы исправить неправильные вызовы API в Java?

Не уверен, что это подходящее место, чтобы спросить, но у меня проблема с Java. У меня есть код Java, который работает в Java 6, но не в Java 7, ошибка:

java.lang.IllegalStateException: This function should be called while holding treeLock

Использование Java6 работает, но некоторые из наших внешних пользователей используют Java 7. Я понял, что ошибка была вызвана вызовом validateTree(), который работает в java6, но в Java7 нам нужно вызвать validate(). Когда я тестирую его локально, он работает.

Вот моя проблема: я начал работать в большой компании, и они не позволят нам вносить какие-либо изменения в код, пока он не будет тщательно изучен (мои рабочие изменения вступят в силу в апреле 2013 года), но до тех пор наши пользователи раздражается. Я плохо разбираюсь в Java, и мне было интересно, есть ли способ передать параметры времени выполнения, чтобы это изменилось? или я могу что-нибудь сделать, не касаясь базы кода?

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

Обновление: в идеале я ищу что-то, что я могу получить за поддержку, чтобы добавить параметр времени выполнения java, который изменил бы все ссылки validateTree () на validate ().


person user1735075    schedule 10.10.2012    source источник
comment
Чтобы быстрее получить помощь, опубликуйте SSCCE, который показывает поведение (желательно в гибридном приложении / апплете).   -  person Andrew Thompson    schedule 10.10.2012
comment
В этом случае просто скажите клиентам, что он работает только под Java 6, тем более что ваша компания не тестировала под 7 - Какие еще проблемы возникают с Java 7. Для обновлений основных версий требуется серьезное тестирование   -  person mmmmmm    schedule 10.10.2012
comment
хороший поиск :-) Нет идей для решения, хотя   -  person kleopatra    schedule 10.10.2012
comment
@AndrewThompson не нужен - просто посмотрите на код validateTree: они добавили проверку для treeLock, таким образом, выполняя предварительное условие Синхронизация должна обеспечиваться методом, вызывающим это   -  person kleopatra    schedule 10.10.2012
comment
Прямо сейчас служба поддержки советует клиентам использовать Java7, но проблема заключается в Chrome, и другие системы автоматически обновляют пользователей до последней версии, поэтому сообщение об удалении заканчивается тем, что программное обеспечение устанавливается снова через несколько недель. Мне жаль пользователей, поэтому я попытался исправить это самостоятельно (я не несу ответственности за этот код), просто хочу помочь. Извините, я не хочу нарваться на проблемы, публикуя реальный код.   -  person user1735075    schedule 10.10.2012
comment
@Mark Или разверните апплет с помощью JNLP и используйте атрибут версии J2SE 1.6*. Подробнее см. Java Web Start - Управление версиями времени выполнения.   -  person Andrew Thompson    schedule 10.10.2012
comment
@kleopatra Спасибо за ваше (всегда эрудированное) разъяснение. :) Никакого SSCCE на этом, ребята!   -  person Andrew Thompson    schedule 10.10.2012
comment
вам следует попытаться вызвать экстренный выпуск: код вашей компании был неправильным (из-за того, что блокировка дерева не была получена до вызова validateTree) всегда, только теперь это явно видно.   -  person kleopatra    schedule 10.10.2012
comment
Если служба поддержки советует пользователям использовать Java 7, а программа не работает под Java 7, у вашей компании есть проблема - за это менеджеры платят.   -  person mmmmmm    schedule 10.10.2012
comment
@Mark, вероятно, просто отсутствует not, судя по дальнейшим пояснениям об автоматических обновлениях jdk :-)   -  person kleopatra    schedule 10.10.2012
comment
opps, извините .. означает, что поддержка говорит пользователям использовать java 6 .. извините   -  person user1735075    schedule 10.10.2012
comment
возможно, больше похоже на эта ветка, не о правильных (были какие-то ошибки ???) изменениях в API Java7 ???   -  person mKorbel    schedule 10.10.2012


Ответы (4)


Могу ли я использовать параметры времени выполнения, чтобы исправить неправильные вызовы API в Java?

Как правило, нет.

В конкретном случае вы можете посмотреть исходный код соответствующих классов Java 7 версии библиотеки классов, чтобы узнать, есть ли свойство обратной совместимости.


Предполагая, что вы не можете найти решение, вы в каком-то смысле застряли. Я бы посоветовал:

  • Рекомендуйте своим клиентам использовать Java 6, пока не будет выпущено исправление.
  • Обсудите со своим руководством, могут ли они сделать исключение из своей политики, чтобы разрешить эту проблему в срочном порядке.

Если ни один из этих вариантов не работает, то настоящая проблема - между вашими клиентами и вашим руководством. Вы сделали все, что могли. Предоставьте это «высшему руководству».


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

Исходя из этого, вы могли бы сделать более веские доводы в пользу выпуска внеполосного исправления. Исправление для замены вызовов validateTree() на вызовы validate() на самом деле является необходимым исправлением для всех платформ Java, а не только для Java 7.

person Stephen C    schedule 10.10.2012
comment
Да, это была опечатка ... спасибо, что ваш ответ был очень полезным, я не смог найти никакого свойства обратной совместимости, означает ли это, что мне совсем не повезло, или я могу каким-то образом передать параметр, который заменил бы все validateTree () для проверки ( ). Я не думаю, что это возможно, но я думаю о чем-то вроде символической ссылки в * nix - person user1735075; 10.10.2012
comment
История моей жизни. Спасибо за советы, хотя, Стивен! - person user1735075; 11.10.2012

У меня есть код Java, который работает в Java 6, но не в Java 7, ..

Один «обходной путь» (я вижу, что это непопулярно):

Разверните апплет с помощью JNLP и используйте J2SE атрибут версии 1.6*. Подробнее см. Java Web Start - Управление версиями времени выполнения.

Обратите внимание, что он будет работать только встроенным в Plug-In 2 JRE (подмножество 1.6 JRE), и даже в этом случае клиент, скорее всего, получит предупреждения о том, что «использует более раннюю JRE». Если апплет можно запустить в свободном плавании с использованием JWS, он будет работать (предположительно) примерно с 1.4.2+.

Исправьте это, чтобы изменить код апплета, чтобы он был совместим с обеими JRE, как указано во 2-м комментарии Клеопатры и ответе Стивена С.

person Andrew Thompson    schedule 10.10.2012
comment
Я думаю, что предлагал это, но по умолчанию в панели управления Java включены java 6 и 7, и Java7 берет на себя и выдает ошибку (если java7 не отмечен, он работает). Это та область, где я понял, что могу изменить поведение java во время выполнения, поэтому я искал способ отправки параметров. Думаю, мне нужно дождаться, пока наша корпорация внедрит исправление. :-( - person user1735075; 10.10.2012

Объект, возвращаемый Component#getTreeLock() < / a> используется как монитор синхронизации потоков. Документированная потокобезопасность некоторых методов устарела при переходе с версии 6 на 7; пример можно увидеть здесь. В общем, убедитесь, что объекты Swing GUI создаются и управляются только на поток отправки событий. Один из подходов, упомянутых здесь, может быть полезен для автоматизации поиска нарушений.

person trashgod    schedule 10.10.2012
comment
конечно, правда ... просто проблема здесь не в этом: документация не менялась - она ​​всегда перекладывала ответственность за получение монитора на вызывающий код (validateTree). С 7 по какой-то причине добавлена ​​только проверка предварительного условия. - person kleopatra; 11.10.2012

person    schedule
comment
Я сделал это, и это работает, проблема в том, что продвижение этого кода в продакшн займет целую вечность. В промежутке я пытался увидеть, могу ли я что-то на стороне клиента (например, использовать параметры или настройки, чтобы преодолеть это). - person user1735075; 10.10.2012