Как найти компилятор java

I am a novice Java programmer. I checked existence of Java in my system, I executed Java command in command prompt and I found multiple options. When I executed java -version command, I got below resutl:

java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) Client VM (build 24.45-b08, mixed mode, sharing)

But, I am not able to locate the Java compiler path. How can I locate the path?
I am using Windows XP 32 bit system.

Below is the result of PATH command execution:

PATH=C:RailsInstallerGitcmd
C:RailsInstallerRuby1.8.7bin
c:oracleora92bin
C:Program FilesOraclejre1.1.8bin
C:WINDOWSsystem32
C:WINDOWS
C:WINDOWSSystem32Wbem
C:Program FilesCommon FilesRoxio SharedDLLShared
C:Program FilesCommon FilesRoxio Shared10.0DLLShared
C:Program FilesWindows Imaging
C:Program FilesEnterprise VaultEVClient
C:Program FilesIntelWiFibin
C:wampbinphpphp5.3.13
C:softwaremysql-proxy-0.8.3-win32-x86bin
C:wampbinphpphp5.3.13

В предыдущей части мы написали очень простую программу с помощью онлайн-редактора кода. Если хотите, можете им пользоваться какое-то время. Но рано или поздно придется идти дальше в познании Java и сопутствующих технологий. А для этого уже нужны совсем другие инструменты. О некоторых из них мы и поговорим в этой статье.

Для того чтобы начать писать приложения на Java у себя на компьютере, требуется выполнить подготовительную работу, связанную с установкой и настройкой необходимых программ.

1. Написано однажды, работает везде

Java — это не просто язык. Это целая платформа, экосистема, состоящая из набора инструментов для разработчиков и разных подсистем. При этом Java является кроссплатформенным языком.

Под платформой обычно понимают сочетание аппаратной (процессор) и программной (операционная система, ОС) части.

В предыдущей статье наша маленькая программка выводила фразу: «Write once, run anywhere». Это девиз Java, подчеркивающий ее платформонезависимость.

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

В какой-то момент возникла идея сделать универсальную платформу, на которой могли бы работать приложения, написанные под разные ОС.

Для реализации этой задумки была создана виртуальная машина (Java Virtual Machine, JVM). Это специальное приложение, которое позволяет запускать программы, написанные на Java, на любой ОС и любом железе (при условии, что JVM реализована для используемой платформы).

Виртуальная машина является прослойкой между процессором и программным кодом. При этом она запускает не файлы с исходным кодом (с расширением .java), а специальные промежуточные файлы с расширением .class в которых хранится байт-код. Этот код назван так из-за того, что представляет собой набор команд в один байт, хотя имеются команды и большей длины.

В использовании байт-кода и заключается магия переносимости программ с одной ОС на другую без внесения каких-либо изменений.

Чтобы из исходного файла получить файл, понятный JVM, его нужно скомпилировать.

Компиляция — это процесс преобразования кода, написанного на языке программирования, например, Java в специальный код, который компьютер (в нашем случае JVM) может понять и запустить. Для компиляции используется программа под названием «компилятор».

Схема компиляции и запуска программы

Все виртуальные машины, неважно на какой ОС они установлены, знают и понимают байт-код одинаково хорошо, т. к. он представляет собой не машинные команды конкретной компьютерной платформы (конкретного процессора в виде последовательности нулей и единиц), а команды JVM. За счет этого и реализуется кроссплатформенность. Промежуточный код не зависит от какой-то ОС или процессора, т. к. не содержит код, созданный специально под них. Он содержит байт-код, который одинаково интерпретируется JVM на любой платформе.

Для создания программ на Java существует специальный набор инструментов для разработчиков, называемый Java Development Kit (JDK). Из этого набора нам сегодня потребуются две утилиты (самые основные и важные) под названием javac (сокр. от java compiler) и java (да, называется так же, как и язык).

Первая из них является компилятором. Она компилирует java-файлы в .class-файлы, содержащие байт-код. Вторая утилита нужна для запуска JVM с полученными .class-файлами.

Стоит отметить, что JVM является частью JDK.

Скачивать JDK (а в дальнейшем и обновлять) можно двумя способами:

  1. заходить непосредственно на сайт и брать оттуда
  2. использовать специальные программы, которые позволяют упростить этот процесс, а также следят за выходом новых версий

Но прежде, чем рассмотреть оба этих варианта, следует сказать о том, что Java как платформа имеет несколько ответвлений (подсистем), которые называются Java SE, Java EE и Java ME. Последние два — это очень специфические инструменты, которые нам не потребуются.

Нас с вами интересует Java SE (Java Standard Edition, стандартная Java или Java Core). Это та часть Java, которую необходимо хорошо знать каждому программисту. Это основа языка. Именно по Java Core любят гонять соискателей на собеседованиях. Ее мы и будем изучать.

Для получения JDK перейдите на сайт компании Oracle и скачайте установочный файл для подходящей ОС.

Вы можете использовать любые альтернативные дистрибутивы JDK. Например, я вместо Oracle использую JDK под названием Liberica (Axiom) от компании BellSoft.

Для второго способа получения JDK нужно установить программу JDKMon. Она позволяет выбрать и скачивать JDK-дистрибутив от разных производителей, а также сообщает о выходе новых версий и обновлений.

Интерфейс программы выглядит следующим образом:

Окно слева позволяет выбирать необходимые параметры для JDK: версию, производителя, ОС и т. д. А окно справа показывает установленную версию и, если появится обновление, то и его.

Вы можете использовать любой из двух вариантов.

В установке JDK нет ничего сложного. Она ничем не отличается от установки других программ. Я думаю, что вы справитесь с этим процессом самостоятельно.

Единственный нюанс, о котором стоит упомянуть — это место, куда следует установить JDK. В Program Files необходимо создать папку java и именно в нее установить JDK. У меня после установки она выглядит так:

Установка в папку java позволяет иметь в одном месте разные версии JDK. Например, программист на работе использует Java 8, дома играется с новыми фичами Java 18, а также может кому-то помогать писать программу, используя Java 11. Все эти версии будут размещены в одном понятном месте — в папке java.

JDK установлен. Осталось убедиться в правильности работы утилит javac и java. Для этого нужен терминал (еще его называют консолью или командной строкой — я буду использовать все эти термины). Более подробно его мы будем рассматривать в последующих статьях.

Терминал — это программа, позволяющая пользоваться ОС не в графическом режиме, как мы привыкли, а в текстовом. По принципу «вводим команду — получаем результат».

Терминал из далекого прошлого

Такие терминалы часто используются в фильмах хакерами. Работа в них со стороны выглядит очень эффектно.

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

Вы можете использовать любой терминал: в Windows — это cmd, PowerShell, cmder, windows terminal и т. д.; в Linux и MacOS — свои терминалы. Я остановлюсь на cmder.

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

Cmder не требует установки — распакуйте архив с программой в удобное для вас место.

Запустим cmder.exe и напишем нашу первую команду: javac -version.

Отображаем версию компилятора

  • G:Toolscmder_mini — папка, в которой у меня открылся cmder
  • > — строка приглашения к вводу команд (по умолчанию λ, но я изменил)
  • javac — Java-компилятор
  • -version — параметр, позволяющий вывести версию компилятора (у меня отобразилась версия javac 17.0.1)

Если у вас после ввода данной команды не возникло никакой ошибки, и отобразилась версия, то все замечательно! Но если вывелся текст ошибки:

⛔ «javac» не является внутренней или внешней командой, исполняемой программой или пакетным файлом,

то это означает, что терминал ничего не знает про введенную вами команду.

Это можно исправить двумя способами:

  • использовать каждый раз в консоли полный путь до исполняемого файла javac (в Windows — это javac.exe)
  • поместить один раз путь до javac в специальную переменную ОС под названием PATH

6. Переменная окружения PATH

Определить путь до файла можно несколькими способами:

  • пойти на диск, где установлен компилятор, и сделать поиск по ключевому слову javac (на случай, если не помните, куда он установлен)
  • воспользоваться командой where /R «C:Program Filesjava» javac

Искать я буду в папке Program Filesjava, т. к. помню, что JDK была установлена именно в нее.

Если путь до файла содержит пробелы, то его нужно с двух сторон обрамить кавычками.

Команда where ищет по указанному пути «C:Program Filesjava» (заходя по очереди во все подпапки, благодаря ключу /R — рекурсивный поиск) файл с именем javac.

Скопируем полученный путь до javac прямо из консоли и попробуем заново ввести команду: «C:Program FilesjavaLibericaJDK-17-Fullbinjavac.exe» -version.

Ваш путь до javac может отличаться от моего.

На этот раз версия javac отобразилась корректно. Но согласитесь, все время помнить или искать путь до файла — это не самый удобный способ.

Попробуем второй вариант.

В Windows (и других ОС) есть такое понятие, как «переменная окружения». Это системная переменная, называемая PATH. Она хранит пути до разных системных папок с исполняемыми файлами (они же команды). Ее используют для удобства, чтобы не вводить в консоли каждый раз полный путь до какой-либо команды: достаточно ввести ее название, а путь будет браться автоматически из PATH.

Если занести в нее путь до javac, то нам больше не придется вводить его вручную.

Наверное, вы заметили, что когда я писал команду where, то она отработала без ввода полного пути. Это связано с тем, что она уже находится по умолчанию в PATH. А то, что where тоже является файлом запуска, можно убедиться, поручив ей найти саму себя.


> where where
C:WindowsSystem32where.exe

Вернемся к PATH и посмотрим, что она хранит. Сделаем это двумя способами.

Найдем в пуске Переменные среды.

Кликнем дважды на строку с Path.

Появится окно со списком путей до разных системных папок.

Перед внесением изменений воспользуемся командной строкой для отображения этого же списка, но только уже в терминале.

Введите одну из следующих команд:

  • echo %PATH% (для Windows)
  • $PATH (для Linux)

Список отобразился, но разобраться в нем достаточно сложно. Можно попытаться вывести список путей, как это сделано в окне выше — каждый путь на новой строке. Для этого введем следующие команды: echo %PATH% | tr ‘;’ ‘n’.

Разберем введенные команды:

  • echo %PATH% — выводит содержимое переменной PATH
  • | называется сепаратором. Эта команда передает полученный результат от предыдущей команды (echo) к последующей (tr)
  • tr — заменяет каждую точку с запятой (а именно ей разделяются пути) переносом на новую строку (обозначается командой n)

Осталось занести путь до javac в переменную PATH (как это сделать для разных ОС).

Перед этим необходимо создать собственную переменную окружения, которая будет хранить путь до директории с установленным JDK. Обычно ее называют JAVA_HOME.

7.1. Почему бы сразу не занести путь в PATH?

Дело в том, что в будущем, когда вы будете изучать такие инструменты как Apache Tomcat, Gradle, Maven и т. д., они будут искать путь до JDK именно в переменной JAVA_HOME. Чтобы в последствии не возвращаться к этому вопросу, как говорится — один раз сделал и забыл!

Получается, что JAVA_HOME нужна не самой Java, а этим сторонним приложениями. Но нам для работы нужно JAVA_HOME все же записать в PATH, т. к. терминал напрямую с JAVA_HOME не работает. Ему нужна именно Path.

Создадим JAVA_HOME в качестве системной переменной.

При редактировании Path соблюдайте осторожность — эта переменная содержит важную информацию! Ничего не удаляйте из нее без ясного понимания, для чего вы это делаете.

А теперь занесем ее в Path, добавив bin.

Не забудьте добавить bin к %JAVA_HOME%, иначе терминал не найдет необходимые инструменты (javac, java и т. д.), которые находятся в этой папке. Перезапустите терминал.

Снова пробуем запустить javac -version, а заодно и java -version.

После всех выполненных настроек, утилиты java и javac успешно заработали: терминал их видит и позволяет использовать без указания полного пути до их размещения.

Оцените статью, если она вам понравилась!

#База знаний

  • 18 фев 2021

  • 14

Начинаем разрабатывать на Java: где взять, как установить и настроить всё, что нужно.

 vlada_maestro / shutterstock

Павел Лебедев

Пишет на Java. Верит в Agile. Пьёт много кофе и не любит грязный код.

Чтобы начать программировать на Java, нужно установить комплект разработчика приложений (SDK). Он позволит запускать, отлаживать и исполнять наши первые программы. Также нам понадобится среда разработки (IDE), где мы и будем писать код.

Пройдём через это вместе. Установим JDK в Windows, Ubuntu и macOS, и IntelliJ IDEA тоже в Windows, Ubuntu и macOS. Поехали!

Java Development Kit (JDK) — это комплект ПО для разработчиков приложений на Java. Стандартная установка включает в себя интерпретатор, облегчённый интерпретатор JRE, компилятор, библиотеку Java-классов, отладчик, средства архивации и сжатия jar и другое.

Чтобы установить JDK в Windows, нужно:

  • загрузить актуальную версию пакета,
  • установить его,
  • настроить переменные окружения.

Нам нужна бесплатная версия — AdoptOpenJDK (она есть под Windows, macOS, Ubuntu и другие платформы).

Идём сюда и выбираем версию JDK (актуальны версии 8+), виртуальную Java-машину (JVM) и свою платформу.

Я выбрал OpenJDK 11 (LTS), HotSpot и Windows x64 jdk соответственно:

Скачиваем файл по появившейся ссылке (я выделил её жёлтым на скрине выше).

Извлекаем скачанный архив в папку C:Program FilesJava

При этом будет создана подпапка jdk-*номер версии*, а внутри неё появится папка bin.

В результате полный путь до папки bin у меня выглядит так:

C:Program FilesJavajdk-11.0.2bin

Нам нужно создать системную переменную JAVA_HOME, которая будет хранить путь до нашей версии JDK. Это понадобится программам для работы с проектами Java.

Заходим в Панель управления → Система → Дополнительные параметры системы → Дополнительно

А можно и прямо в Панели управления вбить в поиск слово «переменных» (без кавычек). ОС предложит варианты, из которых выбирайте «Изменение системных переменных среды».

У вас откроется окно:

Здесь жмём на кнопку «Переменные среды».

В новом окне для раздела «Системные переменные» кликаем «Создать». В «Имя переменной» вводим JAVA_HOME (именно так, латиницей в верхнем регистре), а в поле «Значение переменной» подставляем наш путь C:Program FilesJavajdk-*номер версии*:

Далее в разделе «Переменные среды» редактируем системную переменную Path. Нужно добавить в неё путь к папке с исполняемыми файлами Java, а именно: %JAVA_HOME%bin (соблюдайте регистр символов):

Перезагружаем Windows.

Запускаем Командную строку Windows. Для этого нажимаем Win + R, а в появившемся окне вводим cmd.exe и жмём на Enter.

В открывшейся консоли набираем javac -version и жмём ввод.

Если установка прошла успешно, то ответ покажет версию вашего компилятора:

Рассмотрим установку JDK на одном из самых популярных дистрибутивов Linux — Ubuntu 20.04 (LTS).

Проще всего установить версию, которая входит в пакет Ubuntu. По умолчанию в Ubuntu 20.04 входит версия Open JDK 11.

Открываем терминал сочетанием клавиш Ctrl + Alt + T и обновляем базу данных пакетов с помощью APT:

Проверяем ранее установленные версии командой:

Если установка уже выполнялась, то мы увидим что-то такое:

Для запуска любых приложений Java нужна JRE (Java Runtime Environment — среда выполнения для языка Java). Но для компиляции и разработки программ требуется JDK (Java Development Kit).

Чтобы установить JRE, вводим в консоль:

$ sudo apt install default-jre

Для установки JDK — команду:

$ sudo apt install default-jdk

Вводим команду:

Ответ должен выглядеть примерно так:

Этот способ установки использует HomeBrew (менеджер недостающих пакетов для macOS).

Прежде всего нужно добавить репозиторий в HomeBrew. Для этого открываем терминал (Cmd + N) и вводим:

$ brew tap AdoptOpenJDK/openjdk

Устанавливаем OpenJDK 11 командой:

$ brew cask install adoptopenjdk11

Вводим:

Ответ должен выглядеть примерно так:

openjdk version "11.0.2" 2019-01-15
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.2+9)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.2+9, mixed mode)

IntelliJ IDEA — это интегрированная среда разработки (IDE), то есть система программных средств для создания проектов на разных языках программирования.

Сегодня это самая популярная IDE для языка Java. А ещё есть Eclipse, NetBeans и немало других, но мы рекомендуем именно IDEA, потому что даже её бесплатная версия обладает широкой функциональностью, подходит для профессиональной разработки и вообще делает Java проще в использовании.

В IDE обязательно входят:

  • текстовый редактор для написания кода (он знает синтаксис нужных языков);
  • компилятор;
  • отладчик.

IntelliJ IDEA доступна в бесплатной (Community) и платной (Ultimate) версиях. Чем они различаются, видно на скрине ниже:

Пока что нам хватит возможностей бесплатной версии.

На заметку: IntelliJ предлагает студентам и преподавателям свободный доступ к своим продуктам.

Заходим сюда и качаем версию для Windows.

Запускаем скачанный файл .exe:

Жмём Next (Далее) и выбираем путь для установки:

Снова Next, и настраиваем параметры установки:

В общем случае это:

  • 64-bit launcher — для запуска 64-разрядной версии приложения (будет создан ярлык на рабочем столе);
  • Add ”Open Folder as Project“» — позволяет открывать папки с исходниками как проекты прямо через контекстное меню;
  • .java — файлы такого типа (с таким расширением) будет открывать IDEA (по умолчанию и через контекстное меню).

Кликаем Next (Далее) и выбираем папку для ярлыков IDEA (оставляем по умолчанию):

Нажимаем Install (Установить), после чего стартует установка:

Дожидаемся её окончания и жмём Finish (Завершить):

При первом запуске принимаем пользовательское соглашение и нажимаем Continue (Продолжить):

Далее выбираем тему оформления (доступны тёмная и светлая):

Жмём Next: Default plugins и переходим к выбору устанавливаемых плагинов:

Если не знаете, что вам точно пригодится, — оставляйте всё как есть. А если, например, с Андроидом вам не работать — выключите соответствующий пункт.

Не волнуйтесь, если надобавляете лишнего или о чём-то забудете. Всё можно будет переиграть — в настройках среды.

После чего нажмите на кнопку Next: featured plugins и выберите другие нужные плагины (или оставляйте всё по умолчанию):

И наконец, нажимаем Start using IntelliJ IDEA.

Вас встретит начальный экран среды разработки (Welcome screen). Здесь можно создать новый проект, открыть или импортировать существующий, а также скачать проект из системы контроля версий:

Если вы видите такой же экран — поздравляю, установка и настройка прошли успешно! Приятного обучения!

Здесь всё даже легче, чем в Windows. Для начала качаем версию для macOS отсюда (о различии между редакциями Community и Ultimate читайте выше — в пункте про установку на Windows):

Открываем скачанный файл .dmg:

Копируем файл в «Программы»:

Читаем предупреждение ОС и жмём «Открыть»:

Принимаем пользовательское соглашение и жмём кнопку Continue (Продолжить):

Теперь приложением можно пользоваться. Приятного обучения!

Для установки IntelliJ IDEA открываем Центр приложений Ubuntu:

Вводим в поиск слово «Intellij» (без кавычек). Нам нужна IDEA Community (о различии между редакциями Community и Ultimate читайте выше — в пункте про установку на Windows):

Выбираем версию и нажимаем кнопку Install (Установить):

После установки видим IDEA в меню программ:

Запускаем, принимаем пользовательское соглашение и нажимаем кнопку Continue (Продолжить):

Вы увидите экран загрузки:

Далее вас встретит начальный экран (Welcome screen). Здесь можно создать новый проект, открыть или импортировать существующий, а также скачать проект из системы контроля версий.

Если вы видите такой же экран — поздравляю, установка и настройка прошли успешно! Приятного обучения!

Научитесь: Профессия Java-developer PRO
Узнать больше

В этой статье вы узнаете как установить JDK на Windows 10 и увидите написание первой программы на Java.

Также прочитайте статью «Java основные свойства языка», тоже рекомендую всем новичкам.

Первая программа на Java:

Для запуска программы на Java необходим компилятор. Он компилирует текст программы в машинный код, понятный компьютеру. Набор программ для компиляции файлов Java называется Java Development Kit (JDK).

Установка JDK:

Первым делом разберём как установить JDK на Windows 10, для этого необходимо скачать с официального сайта Oracle (найти страницу загрузки в Google можно по запросу «download jdk»).

Внизу страницы есть выбор вариантов установок для разных операционных систем (ОС). Нужно отметить согласие с политикой компании и скачать файл для своей ОС.

Скачивание JDK и установить на windows 10

После загрузки файла установите его на свой компьютер. В менеджере загрузки все настройки можно оставить по умолчанию.

После установки откройте командную строку от имени администратора. Например, В Windows 10 откройте «Поиск» введите «cmd» и запустите командную строку.

Открываем командную строку

Наберите «java -version» + Enter и увидите версию установленной программы.

Версия Java

Java установлена. Сейчас нужно подключить компилятор javac.

Настройка компилятора:

Для настройки компилятора перейдите в директорию, куда был установлен пакет JDK, в папку bin. Здесь должен находиться файл javac.exe. Скопируйте путь к папке. Пример пути: «C:Program FilesJavajdk1.8.0_191bin».

Настройка JDK

Перейдите в «Панель управления / Система / О системе / Сведения о системе / Дополнительные параметры системы / Переменные среды» (Control Panel). Или можете через поиск найти окно «Переменные среды».

Пуск / Панель управления

Открываем настройки в Windows 10

Система

Открываем системные настройки Windows 10

Сведения о системе

Сведенья о системе

Дополнительные параметры

Переменные среды

Выберите переменную Path

Кликните на «Создать» и добавьте адрес, чтобы он появился в списке.

Нажмите «OK» во всех открытых окнах.

Запуск программы:

Повторно запустите командную строку от имени администратора и наберите команду «javac -version», чтобы проверить, заработал ли компилятор.

Создайте пустой файл с именем Main и расширением .java (Main.java). Если на вашем компьютере у файлов не видны расширения, то эту опцию необходимо сначала включить в настройках файлов.

Откройте файл с помощью блокнота (можно установить Notepad++) или воспользоваться стандартной версией программы.

Добавьте следующий текст:

class Main {

    public static void main(String[] args){

        System.out.println(«Hello, World!»);

    }

}

Важно! Название файла и класса внутри файла должны совпадать.

Перейдите в папку, где сохранен этот файл. В строке адреса введите «cmd» и запустите командную строку.

Нужно скомпилировать файл java в байткод, который может читать виртуальная машина. Введите команду «javac Main.java».

В папке появится второй файл Main.class.

Если его открыть блокнотом, то можно увидеть следующее:

Информация записана в бакткоде. Ее можно прочитать.

Введите в командную строку «java Main» и увидите результат выполнения программы. На экране появится строка «Hello, World!».

Программа выполнена. Код, который сохранен в файле, выводит всего одну строку.
Для упрощения работы можно использовать среду разработки (IDE). Наиболее популярные IDE – Eclipse (полностью бесплатная), IntelliJ IDEA (платная, бесплатная версия с ограниченным функционалом), NetBeans (бесплатная).

Вывод:

В этой статье вы увидели написание первой программы на Java, думаю вам было интересно и полезно.

Подписываетесь на соц-сети:

Оценка:

Загрузка…

Также рекомендую:

Команды java и javac редко используются Java-программистами. Такие инструменты, как Maven и Gradle делают их почти не нужными. Однако Maven и Gradle до сих пор не предоставляют полную поддержку для Java 9, поэтому, если вы хотите начать использовать её уже сейчас или просто хотите узнать некоторые полезные тонкости до официального релиза, стоит научиться вызывать java, javac и jar для управления своим кодом.

Статья призвана показать примеры использования этих команд, а также то, как эти команды изменились по сравнению с прошлыми версиями Java. Дополнительно будут рассмотрены новые инструменты: jdeps и jlink. Предполагается, что вы хоть немного знакомы с предыдущими версиями команд java/javac/jar и с модульной системой Java 9.

Сперва необходимо установить Java 9. Вы можете скачать её с сайта Oracle, но рекомендуется использовать SdkMAN!, так как в будущем он позволит вам с легкостью переключаться между разными версиями Java.

Можно установить SdkMAN! с помощью этой команды:

curl -s "https://get.sdkman.io" | bash

Посмотрите, какая сборка является последней:

sdk list java

Затем установите Java 9:

sdk install java 9ea163

Теперь, если у вас установлены другие версии Java, вы можете переключаться между ними с помощью команды:

sdk use java <version>

Компиляция и запуск «по-старому»

Для начала напишем какой-нибудь код, чтобы проверить наши инструменты. Если не использовать модульный дескриптор, то все выглядит так же, как и раньше.

Возьмем этот простой Java-класс:

 package app;

 public class Main {
    public static void main( String[] args ) {
        System.out.println( "Hello Java 9" );
    }
 }

Теперь, так как мы не использовали никаких особенностей Java 9, мы можем скомпилировать всё как обычно:

javac -d out src/app/Main.java

Команда создаст файл класса out/app/Main.class. Запустить его можно так же, как и в прошлых версиях:

java -cp out app.Main

Программа выведет Hello Java 9.

Теперь создадим библиотеку Greeting также без особенностей Java 9, чтобы посмотреть, как это работает.

Создадим файл greeting/ser/lib/Greeting.java со следующим кодом:

 package lib;

 public class Greeting {
     public String hello() {
         return "Hi there!";
     }
 }

Изменим класс Main для использования нашей библиотеки:

 package app;

 import lib.Greeting;

 public class Main {
     public static void main( String[] args ) {
         System.out.println( new Greeting().hello() );
     }
 }

Скомпилируем эту библиотеку:

javac -d greeting/out greeting/src/lib/Greeting.java

Чтобы показать, как работают оригинальные Java-библиотеки, мы превратим эту библиотеку в jar-файл без дескрипторов модулей Java 9:

mkdir libs
jar cf libs/lib.jar -C greeting/out .

Команда создаст файл libs/lib.jar, содержащий класс lib.Greeting.

Просмотреть информацию о jar-файле можно с помощью опции tf:

jar tf libs/lib.jar

Команда должна вывести:

META-INF/ 
META-INF/MANIFEST.MF 
lib/
lib/Greeting.class

Теперь для компиляция app.Main нам необходимо указать компилятору, где найти класс lib.Greeting.

Используем для этого cp (classpath):

javac -d out -cp libs/lib.jar src/app/Main.java

И то же самое для запуска программы:

java -cp out:libs/lib.jar app.Main

Мы можем упаковать приложение в jar-файл:

jar cf libs/app.jar -C out .

И затем запустить его:

java -cp 'libs/*' app.Main

Вот так выглядит структура нашего проекта на данный момент:

. 
├── greeting 
│ ├── out 
│ │   └── lib 
│ │       └── Greeting.class 
│ └── src 
│     └── lib 
│         └── Greeting.java 
├── libs 
│   ├── app.jar 
│   └── lib.jar 
├── out 
│   └── app 
│       └── Main.class 
└── src 
    └── app 
        └── Main.java

Модуляризация проекта

Пока что ничего нового, но давайте начнем модуляризацию нашего проекта. Для этого создадим модульный дескриптор (всегда называется module-info.java и размещается в корневой директории src/):

 module com.app {
 }

Команда для компиляции модуля в Java 9 отличается от того, что мы видели раньше. Использование старой команды с добавлением модуля к списку файлов приводит к ошибке:

javac -d out -cp 'libs/lib.jar' src/module-info.java src/app/Main.java # не работает
src/app/Main.java:3: error: package lib does not exist 

import lib.Greeting; 

          ^ 

src/app/Main.java:7: error: cannot find symbol 

    System.out.println( new Greeting().hello() ); 

                            ^ 

symbol: class Greeting 

location: class Main 

2 errors

Чтобы понять, почему наш код не компилируется, необходимо понять, что такое безымянные модули.

Любой класс, который загружается не из именованного модуля, автоматически выполняет часть безымянного модуля. В примере выше перед созданием модульного дескриптора наш код не был частью какого-либо модуля, следовательно, он был ассоциирован с безымянным модулем. Безымянный модуль — это механизм совместимости. Проще говоря, это позволяет разработчику использовать в приложениях Java 9 код, который не был модуляризирован. По этой причине код, относящийся к безымянному модулю, имеет правила сродни Java 8 и ранее: он может видеть все пакеты, экспортируемые из других модулей, и все пакеты безымянного модуля.

Когда модульный дескриптор добавляется к модулю, его код больше не является частью безымянного модуля и не может видеть код других модулей, пока не импортирует их. В случае выше модуль com.app не требует никаких модулей, поэтому модуль библиотеки Greeting для него не виден. Он может видеть только пакеты модуля java.base.

Модули в Java 9, за исключением неуловимого безымянного модуля описанного выше, должны объявлять, какие другие модули им необходимы. В случае с модулем com.app единственным требованием является библиотека Greeting. Но, как вы могли догадаться, эта библиотека (как и другие библиотеки, не поддерживающие Java 9) не является модулем Java 9. Как же нам включить её в проект?

В таком случае вам нужно знать имя jar-файла. Если у вас есть зависимость от библиотеки, которая не была конвертирована в модуль Java 9, вам надо знать, какой jar-файл вызывается для этой библиотеки, потому что Java 9 переведёт имя файла в валидный модуль.

Это называется автоматический модуль.

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

Чтобы узнать имя автоматического модуля, компилятор конвертирует неальфанумерические, поэтому что-то вроде slf4j-api-1.7.25.jar превратится в имя модуля sl4j.api.

У нас есть библиотека с именем lib.jar. Давайте переименуем jar-файл в greetings-1.0.jar:

mv libs/lib.jar libs/greetings-1.0.jar

Это более стандартное имя файла, и теперь мы можем сказать Java включить автоматический модуль с приемлемым именем greetings. И можем вызывать его из com.app модуля:

 module com.app {
     requires greetings;
 }

Модули не добавлены в classpath. Как и обычные jar-файлы, они используют новый флаг --module-path (-p). Теперь мы можем скомпилировать наши модули следующей командой:

javac -d out -p 'libs/greetings-1.0.jar' src/module-info.java src/app/Main.java

Чтобы запустить app.Main командой java мы можем использовать новый флаг --module (-m), который принимает либо имя модуля, либо шаблон module-name/main-class:

java -p 'libs/greetings-1.0.jar:out' -m com.app/app.Main

И мы получим вывод Hi, there.

Для создания и использования app.jar в качестве исполняемого jar-файла выполните следующие команды:

jar --create -f libs/app.jar -e app.Main -C out . 
java -p libs -m com.app

Следующим шагом будет модуляризация библиотек, которые используются нашим приложением.

Модуляризация библиотек

Для модуляризации библиотеки нельзя сделать ничего лучше, чем использовать jdeps — инструмент для статистического анализа, который является частью Java SE.

Например, команда, которая позволяет увидеть зависимости нашей небольшой библиотеки, выглядит так:

jdeps -s libs/greetings-1.0.jar

А вот результат её выполнения:

greetings-1.0.jar -> java.base

Как и ожидалось, библиотека зависит только от java.base модуля.

Мы знаем, что com.app зависит от модуля greetings. Давайте попробуем использовать jdeps, чтобы он подтвердил нам это. Для этого нужно удалить файлы module-info.calss и app.jar и затем запустить jdeps:

zip -d libs/app.jar module-info.class

Результат:

deleting: module-info.class

Команда:

jdeps -s -cp libs/greetings-1.0.jar libs/app.jar

Результат:

app.jar -> libs/greetings-1.0.jar 
app.jar -> java.base

Хорошо, но можно лучше. Мы можем попросить jdeps автоматически сгенерировать модульный дескриптор для набора jar-файлов. Просто укажите ему, куда сохранять сгенерированные файлы (например, в папку generated-mods), и где находятся jar-файлы:

jdeps --generate-module-info generated-mods libs/greetings-1.0.jar libs/app.jar

Команда создаст два файла: generated-mods/app/module-info.java и generated-mods/greetings/module-info.java со следующим содержимым:

module app {
     requires greetings;
     exports app;
 }
 module greetings {
     exports lib;
 }

Теперь мы можем добавить сгенерированный дескриптор для нашей библиотеки в её исходный код, переупаковать её, и у нас получится полностью модульное приложение:

javac -d greeting/out $(find greeting/src -name *.java)
jar cf libs/greetings-1.0.jar -C greeting/out .

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

├── greeting 
│   └── src 
│       ├── lib 
│       │ └── Greeting.java 
│       └── module-info.java 
├── libs 
│   ├── app.jar 
│   └── greetings-1.0.jar 
└── src 
    ├── app 
    │   └── Main.java 
    └── module-info.java

Обратите внимание, что для получения хороших данных от jdeps вы должны предоставить местоположение всех jar-файлов, которые используются в приложении, чтобы он мог составить полный граф модуля.

Наиболее простым способом получить список всех jar-файлов, которые используются в библиотеке, является использование скрипта Gradle. Он выведет пути локальных jar-файлов для всех зависимостей библиотек, которые вы добавите в секцию зависимостей, и скачает их, если необходимо:

 apply plugin: 'java'

 repositories {
     mavenLocal()
     mavenCentral()
 }

 dependencies {
     compile 'io.javaslang:javaslang:2.0.6'
 }

 task listDeps {
     println configurations.compile*.absolutePath.join(' ')
 }

Если у вас нет Gradle, вы можете использовать SdkMAN! для его установки:

sdk install gradle

Для получения списка зависимостей используйте следующую команду:

gradle listDeps

Полученную информацию передайте jdeps для анализа и автоматической генерации метаданных.

Это файл, который jdeps выводит для javaslang.match:

 module javaslang.match {
     requires transitive java.compiler;
     exports javaslang.match;
     exports javaslang.match.annotation;
     exports javaslang.match.generator;
     exports javaslang.match.model;
     provides javax.annotation.processing.Processor with
             javaslang.match.PatternsProcessor;
 }

Создание собственного образа среды выполнения

С помощью jlink Java-приложения могут распространяться как образы, которые не требуют установки JVM.

Следующая команда создает образ для нашего com.app модуля без оптимизации, сжатия или отладочной информации:

jlink -p $JAVA_HOME/jmods:libs --add-modules com.app 
  --launcher start-app=com.app 
  --output dist

Меньший размер может быть достигнут использованием некоторых флагов jlink, таких как --strip-debug и --compress:

jlink -p $JAVA_HOME/jmods:libs --add-modules com.app 
  --launcher start-app=com.app 
  --strip-debug --compress=2 
  --output small-dist

Размер пакетов можно посмотреть с помощью команды du -sh:

du -sh small-dist dist
21M small-dist 
35M dist

Для запуска приложения используйте предоставляемый лаунчер в директории bin:

dist/bin/start-app

Вы должны увидеть сообщение Hi there.

На этом всё. Разбор нововведений в Java 9 предлагаем прочитать в нашей статье.

Перевод статьи «A practical guide to Java 9 — compile, jar, run»

Понравилась статья? Поделить с друзьями:
  • Как составить график работы на 5 человек по 3 человека в день
  • Как найти руководителя видео
  • Как найти для файла данные
  • Как составить схематический план местности
  • Как найти загрузку производства