Проблема с Swing на Java 10

В настоящее время я пытаюсь перенести наше приложение с Java 8 на Java 10 и через несколько месяцев перейду на Java 11.

У нас есть устаревшая система, которая использует немного API, которые, я думаю, будут удалены или будут удалены. Мы используем скрипт ant (1.10.1) для компиляции нашего приложения.

Ниже приведена та же часть, которая создает наше приложение:

  <target name="javac-setup" depends="flags, with.clover, jaxb-apply, flamingo.javac"/>

    <target name="javac" depends="javac-setup">
        <mkdir dir="${workmanager.dir.classes}"/>
        <javac destdir="${workmanager.dir.classes}" deprecation="on" debug="${javac.debug}" encoding="iso-8859-1" includeantruntime="false">
            <compilerarg line="-Xlint:static"/>
            <compilerarg line="-Xlint:unchecked"/>
            <compilerarg line="-Xlint:overrides"/>
            <compilerarg line="-Xmaxerrs 9999" />
            <compilerarg line="-Xmaxwarns 9999" />
            <compilerarg value="-Werror"/>
            <src path="${workmanager.dir.src}"/>
            <src path="${webservices.dir.java.src}"/>
            <patternset refid="java.sources"/>
            <classpath refid="classes.classpath"/>
        </javac>
    </target>

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

Ниже приведена ошибка:

[javac] Compiling 3253 source files to C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\classes
    [javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\datamgmt\report\ui\AssignPosNumberToolbar.java:26: error: package com.sun.java.swing.plaf.windows is not visible
    [javac] import com.sun.java.swing.plaf.windows.WindowsButtonUI;
    [javac]                               ^
    [javac]   (package com.sun.java.swing.plaf.windows is declared in module java.desktop, which does not export it)
    [javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\datamgmt\report\ui\AssignPosNumberToolbar.java:27: error: package com.sun.java.swing.plaf.windows is not visible
    [javac] import com.sun.java.swing.plaf.windows.WindowsToolBarUI;
    [javac]                               ^
    [javac]   (package com.sun.java.swing.plaf.windows is declared in module java.desktop, which does not export it)
    [javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\ui\utils\WMClosableTabbedPane.java:33: error: package com.sun.java.swing.plaf.windows is not visible
    [javac] import com.sun.java.swing.plaf.windows.WindowsTabbedPaneUI;
    [javac]                               ^
    [javac]   (package com.sun.java.swing.plaf.windows is declared in module java.desktop, which does not export it)
    [javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\ui\MultiColumnComboBox.java:58: error: package com.sun.java.swing.plaf.motif is not visible
    [javac] import com.sun.java.swing.plaf.motif.MotifComboBoxUI;
    [javac]                               ^
    [javac]   (package com.sun.java.swing.plaf.motif is declared in module java.desktop, which does not export it)
    [javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\datamgmt\ui\SimplificationComboBox.java:31: error: package com.sun.java.swing.plaf.motif is not visible
    [javac] import com.sun.java.swing.plaf.motif.MotifComboBoxUI;
    [javac]                               ^
    [javac]   (package com.sun.java.swing.plaf.motif is declared in module java.desktop, which does not export it)
    [javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\ui\laf\xplookandfeel\XPComboBoxUI.java:21: error: package com.sun.java.swing.plaf.windows is not visible
    [javac] import com.sun.java.swing.plaf.windows.WindowsComboBoxUI;
    [javac]                               ^
    [javac]   (package com.sun.java.swing.plaf.windows is declared in module java.desktop, which does not export it)
    [javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\datamgmt\ui\favorites\FavoritesToolBar.java:28: error: package com.sun.java.swing.plaf.windows is not visible
    [javac] import com.sun.java.swing.plaf.windows.WindowsButtonUI;
    [javac]                               ^
    [javac]   (package com.sun.java.swing.plaf.windows is declared in module java.desktop, which does not export it)
    [javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\datamgmt\ui\favorites\FavoritesToolBar.java:29: error: package com.sun.java.swing.plaf.windows is not visible
    [javac] import com.sun.java.swing.plaf.windows.WindowsToolBarUI;
    [javac]                               ^
    [javac]   (package com.sun.java.swing.plaf.windows is declared in module java.desktop, which does not export it)
    [javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\ui\laf\ptc\PtcLaf.java:14: error: package com.sun.java.swing.plaf.windows is not visible
    [javac] import com.sun.java.swing.plaf.windows.WindowsLookAndFeel;
    [javac]                               ^
    [javac]   (package com.sun.java.swing.plaf.windows is declared in module java.desktop, which does not export it)
    [javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\ui\laf\ptc\PtcMenuUI.java:31: error: package com.sun.java.swing.plaf.windows is not visible
    [javac] import com.sun.java.swing.plaf.windows.WindowsLookAndFeel;
    [javac]                               ^
    [javac]   (package com.sun.java.swing.plaf.windows is declared in module java.desktop, which does not export it)
    [javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\ui\laf\ptc\PtcRadioButtonMenuItemUI.java:14: error: package com.sun.java.swing.plaf.windows is not visible
    [javac] import com.sun.java.swing.plaf.windows.WindowsIconFactory;
    [javac]                               ^
    [javac]   (package com.sun.java.swing.plaf.windows is declared in module java.desktop, which does not export it)
    [javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\ui\laf\ptc\PtcSeparatorUI.java:20: error: package com.sun.java.swing.plaf.windows is not visible
    [javac] import com.sun.java.swing.plaf.windows.WindowsSeparatorUI;
    [javac]                               ^
    [javac]   (package com.sun.java.swing.plaf.windows is declared in module java.desktop, which does not export it)
    [javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\ui\laf\xplookandfeel\XPButtonUI.java:26: error: package com.sun.java.swing.plaf.windows is not visible
    [javac] import com.sun.java.swing.plaf.windows.WindowsButtonUI;
    [javac]                               ^
    [javac]   (package com.sun.java.swing.plaf.windows is declared in module java.desktop, which does not export it)
    [javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\ui\laf\xplookandfeel\XPLookAndFeel.java:24: error: package com.sun.java.swing.plaf.windows is not visible
    [javac] import com.sun.java.swing.plaf.windows.WindowsIconFactory;
    [javac]                               ^
    [javac]   (package com.sun.java.swing.plaf.windows is declared in module java.desktop, which does not export it)
    [javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\ui\laf\xplookandfeel\XPLookAndFeel.java:25: error: package com.sun.java.swing.plaf.windows is not visible
    [javac] import com.sun.java.swing.plaf.windows.WindowsLookAndFeel;
    [javac]                               ^
    [javac]   (package com.sun.java.swing.plaf.windows is declared in module java.desktop, which does not export it)
    [javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\ui\laf\xplookandfeel\XPMenuUI.java:25: error: package com.sun.java.swing.plaf.windows is not visible
    [javac] import com.sun.java.swing.plaf.windows.WindowsLookAndFeel;
    [javac]                               ^
    [javac]   (package com.sun.java.swing.plaf.windows is declared in module java.desktop, which does not export it)
    [javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\ui\laf\xplookandfeel\XPRadioButtonMenuItemUI.java:14: error: package com.sun.java.swing.plaf.windows is not visible
    [javac] import com.sun.java.swing.plaf.windows.WindowsIconFactory;
    [javac]                               ^
    [javac]   (package com.sun.java.swing.plaf.windows is declared in module java.desktop, which does not export it)
    [javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\ui\laf\xplookandfeel\XPSeparatorUI.java:17: error: package com.sun.java.swing.plaf.windows is not visible
    [javac] import com.sun.java.swing.plaf.windows.WindowsSeparatorUI;
    [javac]                               ^
    [javac]   (package com.sun.java.swing.plaf.windows is declared in module java.desktop, which does not export it)
    [javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\ui\laf\xplookandfeel\XPToggleButtonUI.java:23: error: package com.sun.java.swing.plaf.windows is not visible
    [javac] import com.sun.java.swing.plaf.windows.WindowsToggleButtonUI;
    [javac]                               ^
    [javac]   (package com.sun.java.swing.plaf.windows is declared in module java.desktop, which does not export it)
    [javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\ui\laf\xplookandfeel\XPToolBarUI.java:17: error: package com.sun.java.swing.plaf.windows is not visible
    [javac] import com.sun.java.swing.plaf.windows.WindowsToolBarUI;
    [javac]                               ^
    [javac]   (package com.sun.java.swing.plaf.windows is declared in module java.desktop, which does not export it)
    [javac] 20 errors 

person vibhas    schedule 27.07.2018    source источник


Ответы (1)


Да, это из-за модульной системы. Вы обращаетесь к внутренним API, чего JPMS не позволяет делать по умолчанию.

Быстрая починка

Чтобы быстро исправить это, используйте параметр командной строки --add-exports %module/%package=ALL-UNNAMED для каждого пакета, упомянутого в сообщениях, например:

--add-exports java.desktop/com.sun.java.swing.plaf.windows=ALL-UNNAMED

(Нет, подстановочного знака нет). Вы должны добавить их в свою команду сборки для Java 9+ и в какой-то момент (вероятно, Java 12+) также в команду выполнения.

Правильное исправление

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

Правильное исправление состоит в том, чтобы удалить ваши зависимости от этих внутренних компонентов. Первый шаг — проверить, могли ли функции, которые вы там используете, уже получить стандартизированный API.

person Nicolai Parlog    schedule 27.07.2018
comment
Сам никогда не пользовался Ant, но ваш скрипт содержит такие вещи, как <compilerarg line="-Xlint:overrides"/>, поэтому я думаю, что <compilerarg line="--add-exports java.desktop/com.sun.java.swing.plaf.windows=ALL-UNNAMED"/> может сработать. Если это не так, замените пробел другим =. Если и это не сработает, у меня закончились идеи. ???? - person Nicolai Parlog; 27.07.2018
comment
Спасибо, ваше предложение сработало. В итоге появился новый набор устаревших API. В любом случае спасибо.. - person vibhas; 30.07.2018
comment
У меня есть такой код, как Enumeration‹?extends WMTreeNode› widthFirstEnumeration(), где класс WMTreeNode является дочерним классом DefaultMutableTreeNode. Но в java 10 он дает WMTreeNode, который не может переопределить widthFirstEnumeration() в DefaultMutableTreeNode [javac] public Enumeration‹?extends WMTreeNode› widthFirstEnumeration() . Я думаю, что это не имеет ничего общего с модульностью, я пробовал так же. Любое предложение? - person vibhas; 30.07.2018
comment
Наиболее точная проблема: ошибка: метод не переопределяет и не реализует метод из супертипа. - person vibhas; 30.07.2018
comment
Это другая проблема, пожалуйста, задайте новый вопрос. - person Nicolai Parlog; 30.07.2018