Java (Русский)
Ссылки по теме
Из Википедии:
- Java — строго типизированный объектно-ориентированный язык программирования, разработанный компанией Sun Microsystems (в последующем приобретённой компанией Oracle). Разработка ведётся сообществом, организованным через Java Community Process, язык и основные реализующие его технологии распространяются по лицензии GPL. Права на торговую марку принадлежат корпорации Oracle.
Arch Linux официально поддерживает OpenJDK, свободную реализацию Java SE, версий 8, 11, 17 и 21. Эти версии можно без проблем установить одновременно, а также переключаться между ними с помощью скрипта archlinux-java. Несколько других реализаций доступны в AUR, но они не поддерживаются официально.
Установка
- Официально поддерживается только OpenJDK.
- После установки окружение Java должно быть определено в переменной
$PATH, что можно сделать с помощью командыsource /etc/profile, повторного входа в среду рабочего стола или перезагрузки.
Существуют два главных пакета, которые являются зависимыми: java-runtime-common (содержит основные файлы для Java Runtime Environment — JRE) и java-environment-common (содержит основные файлы для Java Development Kit — JDK). Переменная окружения $PATH в файле /etc/profile.d/jre.sh указывает на каталог /usr/lib/jvm/default/bin, заданный скриптом archlinux-java.
Ссылки /usr/lib/jvm/default и /usr/lib/jvm/default-runtime следует менять только при помощи скрипта archlinux-java. Эти ссылки ведут на выбранное рабочее окружение Java в /usr/lib/jvm/java-${JAVA_MAJOR_VERSION}-${VENDOR_NAME} или JRE — /usr/lib/jvm/java-${JAVA_MAJOR_VERSION}-${VENDOR_NAME}/jre.
Большинство исполняемых файлов Java находятся в /usr/bin, остальные доступны через $PATH. Скрипт /etc/profile.d/jdk.sh больше не предоставляется ни одним из пакетов.
OpenJDK
OpenJDK — свободная реализация Java Platform, Standard Edition (Java SE), являющаяся референсной реализацией. Существуют также и другие сборки, например, Adoptium (ранее AdoptOpenJDK) или Amazon Corretto, но они не выложены в официальные репозитории. Пакет OpenJDK собирается из последнего состояния репозитория исходного кода OpenJDK.
- Headless JRE
- минимальная среда выполнения для Java; не поддерживает GUI.
- Full JRE
- полная среда выполнения, поддерживающая GUI и зависящая от headless JRE.
- JDK
- Java Development Kit; необходим для разработки Java-приложений и зависит от full JRE.
| Версия | Headless JRE | Full JRE | JDK | Документация | Исходный код |
|---|---|---|---|---|---|
| OpenJDK 21 | jre-openjdk-headless | jre-openjdk | jdk-openjdk | openjdk-doc | openjdk-src |
| OpenJDK 17 | jre17-openjdk-headless | jre17-openjdk | jdk17-openjdk | openjdk17-doc | openjdk17-src |
| OpenJDK 11 | jre11-openjdk-headless | jre11-openjdk | jdk11-openjdk | openjdk11-doc | openjdk11-src |
| OpenJDK 8 | jre8-openjdk-headless | jre8-openjdk | jdk8-openjdk | openjdk8-doc | openjdk8-src |
OpenJDK GA — свежая сборка OpenJDK General-Availability Release от Oracle.
OpenJDK EA — свежая сборка OpenJDK Early-Access от Oracle.
icedTea-Web — Java Web Start и устаревший плагин Java для браузеров.
OpenJFX
OpenJFX — свободная реализация JavaFX. Данный пакет включён в Oracle JRE/JDK и требуется к дополнительной установке лишь пользователям OpenJDK.
| Версия | Runtime и Development Kit | Документация | Исходный код |
|---|---|---|---|
| OpenJFX 21 | java-openjfx AUR | java-openjfx-doc AUR | java-openjfx-src AUR |
| OpenJFX 17 | java17-openjfx AUR | java17-openjfx-doc AUR | java17-openjfx-src AUR |
| OpenJFX 11 | java11-openjfx AUR | java11-openjfx-doc AUR | java11-openjfx-src AUR |
| OpenJFX 8 | java8-openjfx AUR | java8-openjfx-doc AUR | java8-openjfx-src AUR |
OpenJFX GA — свежая сборка OpenJFX General-Availability Release от Gluon.
OpenJFX EA — свежая сборка OpenJFX Early-Access от Gluon.
- https://openjfx.io/ || java-openjfx-ea-bin AUR[ссылка недействительна: package not found]
Другие реализации
Oracle JDK — проприетарная реализация JRE от Oracle, версии до 17 требуют пакета, доступного только после входа в аккаунт Oracle.
- https://www.oracle.com/ru/java/ ||
- JRE: jre AUR jre-lts AUR jre11 AUR jre8 AUR jre7 AUR
- JDK: jdk AUR jdk-lts AUR jdk11 AUR jdk8 AUR jdk7 AUR
Eclipse Adoptium/Temurin/AdoptOpenJDK — реализация JRE/JDK от Eclipse, основана на Hotspot JVM.
- https://adoptium.net/ || jdk-temurin AUR jdk17-temurin AUR jdk11-temurin AUR
OpenJ9 — JRE от Eclipse, созданная при участии IBM.
IBM Certified — IBM Semeru Runtime Certified Edition.
IBM J9 — реализация JRE 7 и 8 от IBM.
bin32-, например, bin32-jre AUR. Они используют java32-runtime-common AUR, работая с java-runtime-common вместе с суффиксом 32, например, java32. То же самое происходит и с java32-environment-common AUR, который используется только 32-битными пакетами JDK.Инструменты для разработки
См. List of applications/Utilities#Integrated development environments для получения списка IDE (в частности, секцию Java IDEs).
Чтобы усложнить процесс реверс-инжиниринга, можно воспользоваться обфускатором proguard AUR.
Декомпиляторы
- Bytecode Viewer — пакет для обратного инжиниринга Java-приложений, включающий в себя декомпилятор, редактор и дебаггер.
- CFR — декомпилятор Java, поддерживающий также новые возможности Java 9 и выше.
- Fernflower — аналитический декомпилятор Java-приложений, разработанный для IntelliJ IDEA.
- https://github.com/JetBrains/intellij-community/tree/master/plugins/java-decompiler/engine || fernflower-git AUR
- Java Decompiler (JD-Core, JD-GUI) — JD Decompiler, популярный декомпилятор, поддерживающий версии Java 1-10.
- Krakatau — декомпилятор, ассемблер и дизассемблер для Java.
- Procyon decompiler — экспериментальный декомпилятор Java, разработанный под влиянием ILSpy и Mono.Cecil.
- https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler || procyon-decompiler , GUI: luyten AUR
- Recaf — простой и современный редактор байт-кода, абстрагирующийся от сложности программ на Java
Переключение между средами
Скрипт archlinux-java предусматривает следующие возможности:
archlinux-java <COMMAND> COMMAND: status список установленных окружений Java и их статус get короткое название текущего окружения Java set <JAVA_ENV> устанавливает окружение <JAVA_ENV> по умолчанию unset сбрасывает текущее окружения Java по умолчанию fix исправляет ошибки конфигурации окружения Java, выбранного по умолчанию
Получение списка установленных совместимых сред Java
$ archlinux-java status
Пример:
$ archlinux-java status
Available Java environments: java-8-openjdk (default) java-11-openjdk/jre
Метка (default) как раз и подписывает окружение, установленное по умолчанию. Выполнение java или других команд будет ссылаться на эту версию. Отметка /jre означает, что установлен только JRE.
Установка среды Java по умолчанию
# archlinux-java set <JAVA_ENV_NAME>
Пример:
# archlinux-java set java-8-openjdk/jre
archlinux-java status для отображения списка всех доступных сред Java.Обратите внимание, что archlinux-java не позволит задать некорректную среду Java. В предыдущем примере была использована установленная среда jre8-openjdk , а, к примеру, указание неустановленной среды jdk8-openjdk завершилось бы следующей ошибкой:
# archlinux-java set java-8-openjdk
'/usr/lib/jvm/java-8-openjdk' is not a valid Java environment path
Сброс среды Java по умолчанию
Как правило, необходимость в сбросе среды по умолчанию отсутствует, так как данный механизм заложен в соответствующие пакеты. Если же возникла такая необходимость, воспользуйтесь командой unset:
# archlinux-java unset
Исправление конфигурации используемой среды Java
Если на какое-нибудь окружение Java задана неверная ссылка, команда archlinux-java fix попытается найти и исправить ошибку. Также эта команда задаст окружение по умолчанию, если оно отсутствует (официально поддерживаемое окружение OpenJDK 8 имеет наивысший приоритет).
# archlinux-java fix
Запуск приложений с не установленным по умолчанию окружением
Если в системе установлено несколько окружений и необходимо запустить приложение с использованием среды не установленной по умолчанию, можно создать небольшой скрипт, локально изменяющий PATH. Например, если по умолчанию используется JRE 17, а необходимо воспользоваться JRE 11:
#!/bin/sh export PATH="/usr/lib/jvm/java-11-openjdk/bin/:$PATH" exec /путь/к/приложению "$@"
Требования к пакетам сред для поддержки archlinux-java
archlinux32-java, при отличии, что в названиях пакетов используется верное наименование с 32 (см. выше).Этот раздел предназначен для тех, кто хочет распространять свои пакеты JVM в AUR и использовать для управления archlinux-java. Пакеты должны соответствовать всем пунктам ниже:
- все файлы пакета располагаются по адресу
/usr/lib/jvm/java-${JAVA_MAJOR_VERSION}-${VENDOR_NAME} - все исполняемые файлы для java-runtime-common и java-environment-common имеют соответствующие ссылки
- исполняемые файлы, не принадлежащие к java-runtime-common и java-environment-common, имеют ссылки из
/usr/bin - суффиксы манов такие:
-${VENDOR_NAME}${JAVA_MAJOR_VERSION}; например, смотрите список файлов jre8-openjdk, где они имеют суффиксы-openjdk8 - не используется ни PKGBUILD conflicts, ни PKGBUILD replaces с другими JDK,
java-runtime,java-runtime-headlessилиjava-environment - используется скрипт
archlinux-java, чтобы устанавливать окружение по умолчанию, если ни одно другое окружение не задано — то есть не перезаписывается значение по умолчанию. Смотрите список официально поддерживаемых окружений Java для примера
Стоит принять во внимание и эти советы:
- пакеты, которым нужно окружение Java должны объявить зависимости
java-runtime,java-runtime-headlessилиjava-environment - пакеты, которым нужно определённое окружение Java должны объявить зависимости с необходимым суффиксом
- пакеты OpenJDK объявляют
provides="java-runtime-openjdk=${pkgver}", что позволяет стороннему пакету объявлять зависимость от OpenJDK без указания версии
Решение проблем
Не подключается MySQL
В связи с тем, что драйверы JDBC часто используют порт в URI для установления соединения с базой данных, он считается «удалённым» (т. е. MySQL не прослушивает порт в соответствии с его настройками по умолчанию), несмотря на то, что, возможно, они работают на одном хосте. Таким образом, чтобы использовать JDBC и MySQL, вы должны разрешить удаленный доступ в MySQL; смотрите инструкцию в статье MariaDB#Grant remote access.
Не запускается IntelliJ IDEA
Если IntelliJ IDEA вылетает с ошибкой The selected directory is not a valid home for JDK, придётся установить другую JDK или использовать IntelliJ IDEA с JetBrains Runtime.
Ошибки отрисовки приложений Java
В оконных менеджерах Awesome, Dwm и Ratpoison возникают ошибки отрисовки GUI в Java, появляются серые окна, приложения не изменяют размер, меню мгновенно закрываются. Для того, чтобы JVM думала, что используется оконный менеджер, отличный от установленного, используется wmname . Задайте поддельное название оконного менеджера, например, compiz или LG3D
$ wmname compiz
После выполнения команды нужно перезапустить приложение Java. Такое поведение обосновано тем, что в JVM прямо установлены известные оконные менеджеры, которые используют подход non-re-parenting.
Если установка поддельного оконного менеджера не применима, есть несколько советов:
- для jre8-openjdk добавьте строчку
export _JAVA_AWT_WM_NONREPARENTING=1в/etc/profile.d/jre.sh, затем выполнитеsourceэтого файла или перезайдите - для свежих JVM работает добавление
export AWT_TOOLKIT=MToolkitв~/.xinitrcперед командой запуска оконного менеджера - для пакетов Oracle можно использовать SetWMName, однако, положительный эффект может быть сброшен при использовании пакета
XMonad.Hooks.EwmhDesktopsв приложении. В этом случае может помочь добавление строчки>> setWMName "LG3D"кLogHook - для sway добавьте
export _JAVA_AWT_WM_NONREPARENTING=1.
Смотрите также Problems with Java applications, Applet java console на Haskell.org.
Неразборчивый шрифт в приложениях Java
Некоторые шрифты не читаются, поэтому следует установить другие, читаемые шрифты, например, ttf-ms-fonts AUR.
В некоторых приложениях отсутствует текст
Далее в разделе #Улучшенное отображение шрифтов приводятся параметры; см. также FS#40871.
Система зависает при дебаггинге
Используйте параметр JVM -Dsun.awt.disablegrab=true. Смотрите также страницу бага в JDK 6.
Конструктор JavaFX MediaPlayer вылетает с ошибкой
При создании экземпляра класса MediaPlayer может появиться такая ошибка:
... (i.e. FXMLLoader construction exceptions) ... Caused by: MediaException: UNKNOWN : com.sun.media.jfxmedia.MediaException: Could not create player! : com.sun.media.jfxmedia.MediaException: Could not create player! at javafx.scene.media.MediaException.exceptionToMediaException(MediaException.java:146) at javafx.scene.media.MediaPlayer.init(MediaPlayer.java:511) at javafx.scene.media.MediaPlayer.<init>(MediaPlayer.java:414) at <constructor call> ...
это связано с несовеместимостью JavaFX и ffmpeg из репозитория, поэтому следует установить ffmpeg-compat-55 AUR. См. также обсуждение на Reddit.
В приложениях Java не открываются внешние ссылки
Установите gvfs ; в приложении требуется реализовать метод Desktop.Action.BROWSE. См. также обсуждение на Launchpad.
Ошибка инициализации QuantumRenderer: no suitable pipeline found
Либо отсутствует GTK2 — установите gtk2 AUR, либо отсутствует OpenJFX — установите java-openjfx AUR.
Советы и рекомендации
Поведение большинства приложений Java можно контролировать, предоставляя предопределённые переменные для среды выполнения Java. Для этого нужно добавлять строчки в ~/.bash_profile или /etc/profile.d/jre.sh.
export JDK_JAVA_OPTIONS="-D<option 1> -D<option 2>..."
Например, предопределённое использование сглаженных шрифтов и GTK:
export JDK_JAVA_OPTIONS='-Dawt.useSystemAAFontSettings=on -Dswing.aatext=true -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel'
Java воспринимает указанные ниже переменные окружения при запуске приложений (расположены в порядке повышения приоритета).
javac или jshell).
java). Добавлена в Java 9.
Улучшенное отображение шрифтов
Установите параметры JVM -Dawt.useSystemAAFontSettings=on, -Dswing.aatext=true. См. статью Java Runtime Environment fonts
Скрытие сообщения 'Picked up JDK_JAVA_OPTIONS'
При установке какого-либо параметра JVM появляется сообщение вида Picked up JDK_JAVA_OPTIONS=.... Чтобы избавиться от сообщения, можно удалить эту переменную окружения, а вместо неё передать параметры через аргументы командной строки. Добавьте эти строки в ~/.bashrc:
SILENT_JAVA_OPTIONS="$JDK_JAVA_OPTIONS" unset JDK_JAVA_OPTIONS alias java='java "$SILENT_JAVA_OPTIONS"'
Оформление GTK
Установите параметры JVM
swing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel
Некоторые приложения используют кроссплатформенный вид Metal; чтобы переопределить его, используйте параметр JVM
swing.crossplatformlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel
Поддержка GTK 3
В версиях, предшествующих Java 9 использовался вид GTK 2. Эта несовместимость между версиями GTK может нарушить работу приложений, использующих плагины Java с графическим интерфейсом, поскольку смешивание GTK 2 и GTK 3 в одном и том же процессе не поддерживается (например, LibreOffice 5.0). Начиная с Java 9 можно выбрать GTK 2, 2.2 или 3, но по умолчанию используется GTK 3; чтобы задать приоритет используйте параметр JVM
jdk.gtk.version=2.2
Ускорение отрисовки 2D
Если доступно использование OpenGL, его можно включить в приложениях Java, задав переменную окружения
export JDK_JAVA_OPTIONS='-Dsun.java2d.opengl=true'