# Java (Русский)

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

- Java package guidelines

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

"Java — объектно-ориентированный язык программирования, разработанный компанией Sun Microsystems (в последующем приобретенной компанией Oracle). Приложения Java обычно транслируются в специальный байт-код, поэтому они могут работать на любой виртуальной Java-машине вне зависимости от компьютерной архитектуры. Дата официального выпуска — 23 мая 1995 года."

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

## Установка

Следующие пакеты доступны в официальных репозиториях:

- OpenJDK 7:

Пакет | Примечание
--- | ---
jre7-openjdk-headless | Исполняющая среда (JRE) без графических инструментов – версия 7
jre7-openjdk | Полная версия исполняющей среды (JRE) – версия 7
jdk7-openjdk | Пакет разработки (JDK) – версия 7
openjdk7-doc | Документация OpenJDK (javadoc) – версия 7
openjdk7-src | Исходные коды OpenJDK – версия 7

- OpenJDK 8:

Пакет | Примечание
--- | ---
jre8-openjdk-headless | Исполняющая среда (JRE) без графических инструментов – версия 8
jre8-openjdk | Полная версия исполняющей среды (JRE) – версия 8
jdk8-openjdk | Пакет разработки (JDK) – версия 8
openjdk8-doc | Документация OpenJDK (javadoc) – версия 8
openjdk8-src | Исходные коды OpenJDK – версия 8

Обратите внимание: JDK имеет зависимость от JRE, поэтому при установке JDK будет также установлена JRE.
Обратите внимание: После установки вам может понадобиться обновить переменную окружения `$PATH`. Для этого отредактируйте файл `/etc/profile` или перезайдите в среду рабочего стола.

Общие для всех Java-пакетов пакеты java-runtime-common и java-environment-common автоматически устанавливаются как зависимости и предоставляют файл настройки окружения `/etc/profile.d/jre.sh`. Этот файл содержит все переменные окружения, необходимые для работы Java-среды. Пакет java-runtime-common также предоставляет скрипт `archlinux-java`, который служит для установки Java-среды по умолчанию. Этот скрипт создает символические ссылки `/usr/lib/jvm/default` и `/usr/lib/jvm/default-runtime`, которые определяют текущую версию Java и текущую исполняемую среду (JVM) в `/usr/lib/jvm/java-${мажорная_версия}-${имя_поставщика`}. Для большинства исполняемых файлов среды Java создаются прямые ссылки в `/usr/bin`, остальные файлы доступны в `$PATH`.

Важно: Файл `/etc/profile.d/jdk.sh` больше не предоставляется ни одним из пакетов.

#### Устаревание пакетов

Хотя пакеты в Arch Linux могут иметь проприетарные версии пакетов в качестве зависимостей, открытая реализация имеет свою систему версий:

- Пакеты jre7-openjdk, jdk7-openjdk и jre7-openjdk-headless должны помечаться как устаревшие в зависимости от версии IcedTea (например, `2.4.3`), а не их версии реализации от Oracle (например `u45` в выпуске `7.u45_2.4.3-1`).
- Пакет icedtea-web должен помечаться как устаревший в зависимости от версии IcedTea Web (например, `1.4.1`), и независимо от версии IcedTea.

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

Для переключения между средами Java используется скрипт `archlinux-java`, который предоставляет следующие возможности:

    archlinux-java <COMMAND>

    COMMAND:
       status              Вывести список установленных сред Java
       get                 Вывести короткое имя среды Java, установленной по умолчанию
       set имя_среды   Установить среду имя_среды в качестве среды по умолчанию
       unset               Сбросить текущую установку среды Java по умолчанию
       fix                 Исправить нарушенную конфигурацию среды Java по умолчанию

### Получение списка установленных совместимых сред Java

    $ archlinux-java status

Пример:

    $ archlinux-java status
    Available Java environments:
      java-7-openjdk (default)
      java-8-openjdk/jre

Обратите внимание на слово (default), которым помечается текущая выбранная среда Java, в данном примере — `java-7-openjdk`. Запуск конкретного файла `java` и других исполняемых файлов среды зависит от этой настройки. Также обратите внимание, что в приведенном примере установлена только исполняющая среда (JRE) из состава OpenJDK 8.

### Установка среды Java по умолчанию

    # archlinux-java set имя_среды

Пример:

    # archlinux-java set java-8-openjdk/jre

Совет: Используйте команду `archlinux-java status` для отображения списка всех доступных сред Java.

Обратите внимание, что, если имя указано с ошибкой, скрипт не выполнит никаких действий. В примере из предыдущего раздела, установлен пакет jre8-openjdk, но не jdk8-openjdk, поэтому имя среды `java-8-openjdk` в данном случае неверно:

    # archlinux-java set java-8-openjdk
    '/usr/lib/jvm/java-8-openjdk' is not a valid Java environment path

### Сброс настроек среды Java по умолчанию

Обычно, нет необходимости сбрасывать установку среды Java по умолчанию. Если вы все-таки хотите это сделать, используйте команду `unset`, чтобы никакая среда более не использовалась:

    # archlinux-java unset

### Исправление настроек среды Java по умолчанию

Если в качестве среды по умолчанию установлена некорректная среда Java, команда `archlinux-java fix` попробует это исправить. Обратите внимание, что если не была задана среда Java по умолчанию, команда попытается установить одну из доступных. Официально поддерживаемые пакеты "OpenJDK 7" и "OpenJDK 8" имеют при этом больший приоритет (в таком порядке), чем неофициальные версии из AUR.

    # archlinux-java fix

### Запуск приложения с другой версией Java

Если вы хотите запускать отдельное приложение с какой-нибудь другой установленной версией Java, не обязательно каждый раз перед этим устанавливать ее в качестве среды по умолчанию: вы можете использовать простой скрипт, который настроит окружение специально для запуска вашего приложения. Например, если по умолчанию используется jre7, а вы хотите использовать jre8:

    #!/bin/sh

    export PATH=/usr/lib/jvm/java-8-openjdk/jre/bin/:$PATH
    exec /path/to/application

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

Этот раздел предназначается для тех, кто осуществляет сборку пакетов с альтернативными выпусками JVM для AUR. Чтобы пакет соответствовал принятой в Arch Linux схеме с использованием скрипта `archlinux-java`, он должен:

- Помещать все файлы в `/usr/lib/jvm/java-${номер_мажорной_версии}-${имя_поставщика}` .
- Убедиться, что все исполняемые файлы для которых пакетами java-runtime-common и java-environment-common создаются ссылки присутствуют собираемом пакете.
- Предоставлять ссылки из `/usr/bin` к исполняемым файлам только если файлы ссылок не принадлежат пакетам java-runtime-common и java-environment-common.
- Имена man-страниц должны оканчиваться на `-${номер мажорной версии}-${имя поставщика`} для избежания конфликтов (пример смотрите в списке файлов jre8-openjdk, где имена man-страниц оканчиваются на `-openjdk8`).
- Не объявлять пакеты других сред Java, `java-runtime`, `java-runtime-headless` или `java-environment` как конфликтующие, а также в качестве замещаемых.
- Использовать `archlinux-java` в целях установки, чтобы установить среду Java по умолчанию если в данный момент уже не установлена подходящая среда (то есть, пакеты не должны принудительно устанавливать какую-либо среду Java по умолчанию). Используйте исходные коды официально поддерживаемого пакета исполняемой среды Java в качестве примера.

Также, пожалуйста, имейте в виду, что:

- Пакеты, которым нужна любая среда Java должны объявлять о зависимости к пакету `java-runtime`, `java-runtime-headless` или `java-environment`, как обычно.
- Пакеты, которым нужна конкретная среда Java должны объявить о зависимости к соответствующему пакету.
- Пакеты OpenJDK теперь объявляют о предоставлении функции `provides="java-runtime-openjdk=${pkgver}"`. Это позволяет сторонним пакетам объявлять о зависимости от OpenJDK без указания конкретной версии.

## Неподдерживаемые среды Java из AUR

Важно: Пакеты в AUR могут не поддерживать `archlinux-java`.

### Java SE

Несколько пакетов в AUR предоставляют реализации JDK и JRE от Oracle, из них основными являются jreAUR и jdkAUR.

#### Java SE 6/7

Предыдущие версии JRE и JDK доступны с пакетами jre6AUR/jre7AUR и jdk6AUR/jdk7AUR соответственно.

### Oracle JRockit

JRockit — проприетарная реализация JVM с JIT от Oracle. Установку можно произвести через пакет jrockitAUR из AUR.

### VMkit

VMkit — основанный на LLVM фреймворк для виртуальных машин с JIT. В состав VMkit входит собственная JVM — J3. J3 использует реализацию стандартной библиотеки Java GNU Classpath, но также может работать с реализациями от Apache.

### Parrot VM

Parrot является виртуальной машиной, предоставляющей экспериментальную поддержку Java, которая реализуется двумя способами: либо посредством транслятора байт-кода, либо с помощью компилятора Java с поддержкой формата Parrot. Пакет parrot доступен в официальных репозиториях, а parrot-gitAUR — в AUR.

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

### MySQL

По причине того факта, что JDBC-драйверы часто используют порт из URL для установки соединения с базой данных, это соединение считается удаленным (другими словами, MySQL не слушает на порту в соответствии с настройками по умолчанию), несмотря на то, что оно может быть на том же хосте. Таким образом, чтобы использовать JDBC и MySQL вам следует включить удаленный доступ к MySQL, следуя инструкциям на странице MySQL#Grant remote access.

### Маскировка под другой оконный менеджер

Вы можете использовать wmname отсюда чтобы заставить JVM поверить, что используется какой-то другой оконный менеджер. Это должно решить проблемы с отображением графических приложений на Java, которые появляются в менеджерах вроде Awesome или dwm.

    $ wmname LG3D

После выполнения команды перезапустите Java-приложение.

Это работает, потому что в JVM содержится закодированный список не-репарентинговых оконных менеджеров. Что интересно, некоторые пользователи предпочитают маскировать свои менеджеры под `LG3D`, написанный Sun, на Java, однако также являющийся не-репарентинговым.

### Шрифты отображаются размыто

Даже после выполнения всех рекомендаций в разделе #Улучшенное отображение шрифтов некоторые шрифты все еще могут отображаться размыто. Если это так, попробуйте установить шрифты от Microsoft. Установите ttf-ms-fontsAUR из AUR.

### В некоторых приложениях отсутствует текст

Если в приложении совсем не отображаются никакие надписи, посмотрите советы в разделе #Советы и рекомендации, как предлагается в FS#40871.

## Советы и рекомендации

Обратите внимание: Советы в этом разделе подходят всем приложениям, использующим внешнюю среду Java, установленную отдельно. Некоторые приложения поставляются со встроенной сборкой Java, либо используют нестандартные способы работы с графическим интерфейсом, отрисовки шрифтов и т. д. Поэтому, нет гарантий, что эти советы на самом деле сработают.

Поведением большинства приложений Java можно управлять, передавая переменные в исполняемую среду Java. Как предлагают на форуме, сделать это можно добавлением указанной строки в ваш файл `~/.bashrc` (или `/etc/profile.d/jre.sh` для программ, при запуске которых среда не инициализируется из `~/.bashrc`, например, если программа запускается из Applications view в Gnome):

    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'

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

Обе реализации Java, открытая и закрытая, имеют недостатки в реализации сглаживания шрифтов. Это может быть исправлено указанием следующих параметров:

`awt.useSystemAAFontSettings=on`, `swing.aatext=true`

Смотрите также Шрифты в исполняемой среде Java для получения подробной информации.

### Оформление GTK

Если ваши Java-приложения выглядят отвратительно, вам, вероятно, сможет помочь смена оформления по умолчанию на тему GTK для компонентов Swing: `swing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel`.

Некоторые упрямые приложения требуют использования кроссплатформенного оформления. В некоторых таких случаях, вам удастся заставить эти приложения использовать оформление GTK, установив следующий параметр:

`swing.crossplatformlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel`.

### Не-репарентинговые оконные менеджеры

Для не-репарентинговых оконных менеджеров следует установить следующую переменную окружения в файле `.xinitrc`:

    export _JAVA_AWT_WM_NONREPARENTING=1

Categories:

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