Java (Русский)
Из Википедии:
- Java — строго типизированный объектно-ориентированный язык программирования, разработанный компанией Sun Microsystems (в последующем приобретённой компанией Oracle). Разработка ведётся сообществом, организованным через Java Community Process, язык и основные реализующие его технологии распространяются по лицензии GPL. Права на торговую марку принадлежат корпорации Oracle.
Arch Linux официально поддерживает OpenJDK, свободную реализацию Java SE, версий 8, 11 и 17. Эти версии можно без проблем установить одновременно, а также переключаться между ними с помощью скрипта 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 17 | jre-openjdk-headless | jre-openjdk | jdk-openjdk | openjdk-doc | openjdk-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 и Developement Kit | Документация | Исходный код |
---|---|---|---|
OpenJFX 17 | java-openjfx | java-openjfx-doc | java-openjfx-src |
OpenJFX 11 | java11-openjfx | java11-openjfx-doc | java11-openjfx-src |
OpenJFX 8 | java8-openjfxAUR | java8-openjfx-docAUR | java8-openjfx-srcAUR |
OpenJFX GA — свежая сборка OpenJFX General-Availability Release от Gluon.
OpenJFX EA — свежая сборка OpenJFX Early-Access от Gluon.
Другие реализации
Oracle JDK — проприетарная реализация JRE от Oracle.
- https://www.oracle.com/ru/java/ || jdkAUR jreAUR jre14AUR jdk12AUR jre12AUR jdk11AUR jre11AUR jdk10AUR jre10AUR jdk9AUR jre9AUR jdk8AUR jre8AUR jdk7AUR jre7AUR jdk6AUR jre6AUR jdk-develAUR
OpenJ9 — JRE от Eclipse, созданная при участии IBM.
- https://www.eclipse.org/openj9/ || jdk-openj9-binAUR jdk14-openj9-binAUR jdk13-openj9-binAUR jdk12-openj9-binAUR jdk11-openj9-binAUR jdk10-openj9-binAUR jdk9-openj9-binAUR jdk8-openj9-binAUR
IBM Certified — IBM Semeru Runtime Certified Edition.
IBM J9 — реализация JRE 7 и 8 от IBM.
bin32-
, например, bin32-jreAUR и bin32-jdk7AUR. Они используют java32-runtime-commonAUR, работая с java-runtime-common вместе с суффиксом 32
, например, java32
. То же самое происходит и с java32-environment-commonAUR, который используется только 32-битными пакетами JDK.Инструменты для разработки
См. List of applications#Integrated development environments для получения списка IDE (в частности, секцию Java IDEs).
Чтобы усложнить процесс реверс-инжиниринга, можно воспользоваться обфускатором proguardAUR.
Декомпиляторы
- Bytecode Viewer — пакет для обратного инжиниринга Java-приложений, включающий в себя декомпилятор, редактор и дебаггер.
- CFR — декомпилятор Java, поддерживающий также новые возможности Java 9 и выше.
- Fernflower — аналитический декомпилятор Java-приложений, разработанный для IntelliJ IDEA.
- https://github.com/JetBrains/intellij-community/tree/master/plugins/java-decompiler/engine || fernflower-gitAUR
- 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-decompilerAUR, GUI: luytenAUR
- 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-fontsAUR.
В некоторых приложениях отсутствует текст
Далее в разделе #Улучшенное отображение шрифтов приводятся параметры; см. также 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-55AUR. См. также обсуждение на Reddit.
В приложениях Java не открываются внешние ссылки
Установите gvfs; в приложении требуется реализовать метод Desktop.Action.BROWSE
. См. также обсуждение на Launchpad.
Ошибка инициализации QuantumRenderer
: no suitable pipeline found
Либо отсутствует GTK2 — установите gtk2, либо отсутствует OpenJFX — установите java-openjfx.
Советы и рекомендации
Поведение большинства приложений 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 воспринимает указанные ниже переменные окружения при запуске приложений (расположены в порядке повышения приоритета).
JAVA_TOOL_OPTIONS | Влияет на приложения и на некоторые утилиты (например, javac или jshell ).
|
JDK_JAVA_OPTIONS | Влияет на приложения (запущенные через команду java ). Добавлена в Java 9.
|
(аргументы командной строки) | Аргументы, указанные после названия класса Java передаются в приложение. |
_JAVA_OPTIONS | Устаревшая переменная, влияет и на приложения, и на утилиты. |
Улучшенное отображение шрифтов
Установите параметры 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'