# Java (Русский)

From ArchWiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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

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

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

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

Arch Linux официально поддерживает OpenJDK, свободную реализацию Java SE, версий 7, 8, 11 и 15. Эти версии можно без проблем установить одновременно, а также переключаться между ними с помощью скрипта `archlinux-java`. Несколько других реализаций доступны в AUR, но они не поддерживаются официально.

## Установка

Примечание:

- Официально поддерживается только OpenJDK.
- После установки окружение Java должно быть определено в переменной `$PATH`, что можно сделать с помощью команды `source` или повторного входа в среду рабочего стола.

Существуют два главных пакета, которые являются зависимыми: 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).

Headless JRE
  минимальная среда выполнения для Java; не поддерживает GUI.
Full JRE
  полная среда выполнения, поддерживающая GUI и зависящая от headless JRE.
JDK
  Java Development Kit; необходим для разработки Java-приложений и зависит от full JRE.

Версия | Headless JRE | Full JRE | JDK | Документация | Исходный код
--- | --- | --- | --- | --- | ---
OpenJDK 15 | 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 7 | jre7-openjdk-headless | jre7-openjdk | jdk7-openjdk | openjdk7-doc | openjdk7-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/wiki/IcedTea-Web[устаревшая ссылка 2021-05-13] || icedtea-web

### OpenJFX

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

Версия | Runtime и Developement Kit | Документация | Исходный код
--- | --- | --- | ---
OpenJFX 15 | java-openjfx | java-openjfx-doc | java-openjfx-src
OpenJFX 11 | java11-openjfx | java11-openjfx-doc | java11-openjfx-src
OpenJFX 8 | java8-openjfx | java8-openjfx-doc | java8-openjfx-src

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

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

Java SE — реализация JRE от Oracle.

  https://www.oracle.com/ru/java/ || jreAUR jre14AUR jre12AUR jre11AUR jre10AUR jre9AUR jre8AUR jre7AUR jre6AUR

Java SE — реализация JDK от Oracle.

  https://www.oracle.com/ru/java/ || jdkAUR jdk12AUR jdk11AUR jdk10AUR jdk9AUR jdk8AUR jdk7AUR jdk6AUR jdk5AUR 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 J9 — реализация восьмой редакции JRE от IBM.

  https://developer.ibm.com/javasdk/ || jdk8-j9-binAUR jdk7-j9-binAUR jdk7r1-j9-binAUR

Примечание: 32-битные версии Java SE имеют префикс `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-приложений, включающий в себя декомпилятор, редактор и дебаггер.

  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

- JD-Core-java — обёртка над JD Decompiler.

  https://github.com/nviennot/jd-core-java || jd-core-javaAUR

- 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

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

Скрипт `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-7-openjdk (default)
       java-8-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 7, а необходимо воспользоваться JRE 8:

    #!/bin/sh

    export PATH="/usr/lib/jvm/java-8-openjdk/jre/bin/:$PATH"
    exec /путь/к/приложению "$@"

## Требования к пакетам сред для поддержки `archlinux-java`

Примечание: Информация применима и к `archlinux32-java`, при отличии, что в названиях пакетов используется верное наименование с `32` (см. выше).

Этот раздел предназначен для тех, кто хочет распространять свои пакеты JVM в [Arch User Repository (Русский)|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-runtime`, `java-runtime-headless` или `java-environment`
- пакеты, которым нужно определённое окружение Java должны объявить зависимости с необходимым суффиксом
- пакеты OpenJDK объявляют `provides="java-runtime-openjdk=${pkgver}"`, что позволяет стороннему пакету объявлять зависимость от OpenJDK без указания версии

## Решение проблем

### Не подключается MySQL

В связи с тем, что драйверы JDBC часто используют порт в URI для установления соединения с базой данных, он считается «удалённым» (т. е. MySQL не прослушивает порт в соответствии с его настройками по умолчанию), несмотря на то, что, возможно, они работают на одном хосте. Таким образом, чтобы использовать JDBC и MySQL, вы должны разрешить удаленный доступ в MySQL.

### Не запускается 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.

Если установка поддельного оконного менеджера не применима, есть несколько советов:

- для jre7-openjdk и jre8-openjdk, добавьте строчку `export _JAVA_AWT_WM_NONREPARENTING=1` в `/etc/profile.d/jre.sh`, затем выполните его или перезайдите
- для свежих JVM работает добавление `export AWT_TOOLKIT=MToolkit` в `~/.xinitrc` перед командой запуска оконного менеджера
- для пакетов Oracle можно использовать SetWMName, однако, положительный эффект может быть сброшен при использовании пакета `XMonad.Hooks.EwmhDesktops` в приложении. В этом случае может помочь добавление строчки `>> setWMName "LG3D"` к `LogHook`.

Смотри также 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. Для этого нужно добавлять строчки в `~/.bashrc` или `/etc/profile.d/jre.sh`.

    export _JAVA_OPTIONS="-D<option 1> -D<option 2>..."

Например, предопределённое использование сглаженных шрифтов и GTK:

    export _JAVA_OPTIONS='-Dawt.useSystemAAFontSettings=on -Dswing.aatext=true -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel'

### Улучшенное отображение шрифтов

Установите параметры JVM `-Dawt.useSystemAAFontSettings=on`, `-Dswing.aatext=true`. См. статью Java Runtime Environment fonts

### Удаление сообщения `Picked up _JAVA_OPTIONS`

При установке какого-либо параметра JVM появялестя сообщение вида `Picked up _JAVA_OPTIONS=...`. Чтобы избавиться от сообщения, используйте команды ниже

    _SILENT_JAVA_OPTIONS="$_JAVA_OPTIONS"
    unset _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 2; чтобы задать приоритет используйте параметр JVM `jdk.gtk.version=3`.

### Ускорение отрисовки 2D

Если доступно использование OpenGL, его можно включить в приложениях Java, задав переменную окружения

    export _JAVA_OPTIONS='-Dsun.java2d.opengl=true'

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

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