Как использовать устаревший импорт в Java? - PullRequest
0 голосов
/ 07 марта 2019

У меня есть .jar библиотека, которая использует устаревший импорт "sun.misc.ref", но теперь она должна быть "java.lang.ref.SoftReference", как я могу указать на это?

Ниже я публикую полученную ошибку.Я использую Acrobat Reader Api 1.1, и да, я хотел бы открыть файл .pdf внутри моего приложения, а не снаружи.

    Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: sun/misc/Ref
    at java.base/java.lang.ClassLoader.defineClass1(Native Method)
    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
    at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
    at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:802)
    at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:700)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:623)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    at com.adobe.pe.notify.VValuePurgeable.<init>(VValuePurgeable.java:92)
    at com.adobe.acrobat.gui.VOrnamentList.<init>(VOrnamentList.java:16)
    at com.adobe.acrobat.gui.PageView$VGalleyOrnaments.<init>(PageView.java:1083)
    at com.adobe.acrobat.gui.PageView.<init>(PageView.java:1081)
    at com.adobe.acrobat.gui.AcroViewContext.commonInit(AcroViewContext.java:166)
    at com.adobe.acrobat.gui.AcroViewContext.<init>(AcroViewContext.java:99)
    at com.adobe.acrobat.Viewer.createViewer(Viewer.java:243)
    at com.adobe.acrobat.Viewer.<init>(Viewer.java:211)
    at screens.PdfReader_AcrobatReader.<init>(PdfReader_AcrobatReader.java:38)
    at screens.Main.pdf(Main.java:344)
    at screens.Library_Book.tblMouseLeftBtn(Library_Book.java:101)
    at screens.Library_Book.access$000(Library_Book.java:22)
    at screens.Library_Book$2.mousePressed(Library_Book.java:56)
    at java.desktop/java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:288)
    at java.desktop/java.awt.Component.processMouseEvent(Component.java:6629)
    at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3342)
    at java.desktop/java.awt.Component.processEvent(Component.java:6397)
    at java.desktop/java.awt.Container.processEvent(Container.java:2263)
    at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5008)
    at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
    at java.desktop/java.awt.Component.dispatchEvent(Component.java:4840)
    at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4918)
    at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4544)
    at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4488)
    at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
    at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2772)
    at java.desktop/java.awt.Component.dispatchEvent(Component.java:4840)
    at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
    at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
    at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:743)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
    at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
    at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Caused by: java.lang.ClassNotFoundException: sun.misc.Ref
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    ... 53 more

Ответы [ 2 ]

2 голосов
/ 07 марта 2019

Невозможно просто указать на новую ссылку; предупреждение об устаревании означает чуть больше, чем просто то, что мы раньше называли sun.misc.ref, теперь называется java.lang.ref.SoftReference '; весь API изменился.

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

Если вы должны запустить этот код, а альтернативы нет, найдите (устаревшую и поэтому неподдерживаемую) старую версию JVM и запустите ее на этом. Не используйте эту виртуальную машину для запуска случайных java-файлов (т.е. не делайте ее виртуальной машиной по умолчанию, если вы дважды щелкнете по банке или еще чем-нибудь), не используйте для этого доступ к произвольным интернет-ресурсам (т.е. не используйте эту программу просмотра PDF для просмотра URL-адреса), и загружать только PDF-файлы от надежных лиц. В конце концов, если есть проблемы безопасности с библиотекой или виртуальной машиной, они не будут подтверждены или исправлены.

Для чего бы то ни было, JDK8 должен иметь sun.misc.ref; попробуйте запустить это. Есть даже варианты JDK8, которые все еще поддерживаются, такие как coretto . Я бы начал там, и только если вы не можете запустить это на JDK8, попробуйте даже более старые виртуальные машины.

1 голос
/ 07 марта 2019

Поиск по исходному дереву Java 11 говорит мне, что класс sun.misc.Ref больше не существует в Java 11. Он не устарел.Это было полностью удалено.И еще нет пакета с именем sun.misc.ref.

Суть в том, что Acrobat API не будет работать на Java 11. Ваш выбор ограничен:

  • Используйте старую версиюJava до удаления ... пока не выйдет эта версия EOL.Java 8 или более ранняя версия.
  • Попробуйте найти более новую версию этого API, совместимого с Java 11.
  • Попробуйте найти источник API и перенести его.
  • Найдите альтернативный API.
  • Удалите эту функциональность из вашего продукта.

(Есть несколько других идей, которые чрезвычайно болезненны и / или рискованны ... которыеЯ не буду упоминать.)

...