Java (Русский) - ArchWiki

Jump to content
From ArchWiki
Состояние перевода: На этой странице представлен перевод статьи Java. Дата последней синхронизации: 23 декабря 2021. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Ссылки по теме

- Java Package Guidelines
- Шрифты окружения Java Runtime

Из Википедии:

  Java — строго типизированный объектно-ориентированный язык программирования, разработанный компанией Sun Microsystems (в последующем приобретённой компанией Oracle). Разработка ведётся сообществом, организованным через Java Community Process, язык и основные реализующие его технологии распространяются по лицензии GPL. Права на торговую марку принадлежат корпорации Oracle.

Arch Linux официально поддерживает OpenJDK, свободную реализацию Java SE, версий 8, 11, 17 и 18. Эти версии можно без проблем установить одновременно, а также переключаться между ними с помощью скрипта `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 18 | 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.

  https://jdk.java.net || java-openjdk-binAUR

OpenJDK EA — свежая сборка OpenJDK Early-Access от Oracle.

  https://jdk.java.net || java-openjdk-ea-binAUR

icedTea-Web — Java Web Start и устаревший плагин Java для браузеров.

  https://icedtea.classpath.org/download/icedtea-web-docs/1.8/html/en/icedtea-web.html || icedtea-web

### OpenJFX

OpenJFX — свободная реализация JavaFX. Данный пакет включён в Oracle JRE/JDK и требуется к дополнительной установке лишь пользователям OpenJDK.

Версия | Runtime и Developement Kit | Документация | Исходный код
--- | --- | --- | ---
OpenJFX 18 | java-openjfx | java-openjfx-doc | java-openjfx-src
OpenJFX 17 | java17-openjfx | java17-openjfx-doc | java17-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.

  https://openjfx.io/ || java-openjfx-binAUR

OpenJFX EA — свежая сборка OpenJFX Early-Access от Gluon.

  https://openjfx.io/ || java-openjfx-ea-binAUR

### Другие реализации

Oracle JDK — проприетарная реализация JRE от Oracle, версии до 17 требуют пакета, доступного только после входа в аккаунт Oracle.

  https://www.oracle.com/ru/java/ ||
  JRE: jreAUR jre-ltsAUR jre11AUR jre8AUR jre7AUR
  JDK: jdkAUR jdk-ltsAUR jdk11AUR jdk8AUR jdk7AUR

Eclipse Adoptium/Temurin/AdoptOpenJDK — реализация JRE/JDK от Eclipse, основана на Hotspot JVM.

  https://adoptium.net/ || jdk-temurinAUR jdk17-temurinAUR jdk11-temurinAUR

OpenJ9 — JRE от Eclipse, созданная при участии IBM.

  https://www.eclipse.org/openj9/ || jdk-openj9-binAUR jdk11-openj9-binAUR jdk8-openj9-binAUR

IBM Certified — IBM Semeru Runtime Certified Edition.

  https://www.ibm.com/semeru-runtimes/downloads || jdk11-j9-binAUR

IBM J9 — реализация JRE 7 и 8 от IBM.

  https://www.ibm.com/support/pages/java-sdk || jdk8-j9-binAUR jdk7-j9-binAUR jdk7r1-j9-binAUR

Примечание: 32-битные версии Oracle JDK имеют префикс `bin32-`, например, bin32-jreAUR. Они используют 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-приложений, включающий в себя декомпилятор, редактор и дебаггер.

  https://bytecodeviewer.com || bytecode-viewerAUR

- CFR — декомпилятор Java, поддерживающий также новые возможности Java 9 и выше.

  https://www.benf.org/other/cfr/ || cfrAUR

- 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.

  https://java-decompiler.github.io/ || jd-guiAUR

- Krakatau — декомпилятор, ассемблер и дизассемблер для Java.

  https://github.com/Storyyeller/Krakatau || krakatau-gitAUR

- Procyon decompiler — экспериментальный декомпилятор Java, разработанный под влиянием ILSpy и Mono.Cecil.

  https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler || procyon-decompilerAUR, GUI: luytenAUR

- Recaf — простой и современный редактор байт-кода, абстрагирующийся от сложности программ на Java

  https://www.coley.software/Recaf/ || recaf-binAUR

## Переключение между средами

Скрипт `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 можно контролировать, предоставляя предопределённые переменные для среды выполнения 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'

Примечание: Включение этого параметра может привести к неправильной работе пользовательского интерфейса таких программ, как все IDE от JetBrains, из-за чего они частично отрисовывают окна, всплывающие окна и панели инструментов.
Categories:

- Programming languages (Русский)
- Oracle (Русский)