Как сделать компиляцию java
Руководство по Java 9: компиляция и запуск проекта
Установка Java 9
Сперва необходимо установить Java 9. Вы можете скачать её с сайта Oracle, но рекомендуется использовать SdkMAN!, так как в будущем он позволит вам с легкостью переключаться между разными версиями Java.
Можно установить SdkMAN! с помощью этой команды:
Посмотрите, какая сборка является последней:
Затем установите Java 9:
Теперь, если у вас установлены другие версии Java, вы можете переключаться между ними с помощью команды:
Компиляция и запуск «по-старому»
Для начала напишем какой-нибудь код, чтобы проверить наши инструменты. Если не использовать модульный дескриптор, то все выглядит так же, как и раньше.
Возьмем этот простой Java-класс:
Теперь, так как мы не использовали никаких особенностей Java 9, мы можем скомпилировать всё как обычно:
Теперь создадим библиотеку Greeting также без особенностей Java 9, чтобы посмотреть, как это работает.
Создадим файл greeting/ser/lib/Greeting.java со следующим кодом:
Изменим класс Main для использования нашей библиотеки:
Скомпилируем эту библиотеку:
Чтобы показать, как работают оригинальные Java-библиотеки, мы превратим эту библиотеку в jar-файл без дескрипторов модулей Java 9:
Просмотреть информацию о jar-файле можно с помощью опции tf :
Команда должна вывести:
Используем для этого cp (classpath):
И то же самое для запуска программы:
Мы можем упаковать приложение в jar-файл:
И затем запустить его:
Вот так выглядит структура нашего проекта на данный момент:
Модуляризация проекта
Пока что ничего нового, но давайте начнем модуляризацию нашего проекта. Для этого создадим модульный дескриптор (всегда называется module-info.java и размещается в корневой директории src/ ):
Команда для компиляции модуля в Java 9 отличается от того, что мы видели раньше. Использование старой команды с добавлением модуля к списку файлов приводит к ошибке:
Чтобы понять, почему наш код не компилируется, необходимо понять, что такое безымянные модули.
Любой класс, который загружается не из именованного модуля, автоматически выполняет часть безымянного модуля. В примере выше перед созданием модульного дескриптора наш код не был частью какого-либо модуля, следовательно, он был ассоциирован с безымянным модулем. Безымянный модуль — это механизм совместимости. Проще говоря, это позволяет разработчику использовать в приложениях Java 9 код, который не был модуляризирован. По этой причине код, относящийся к безымянному модулю, имеет правила сродни Java 8 и ранее: он может видеть все пакеты, экспортируемые из других модулей, и все пакеты безымянного модуля.
Модули в Java 9, за исключением неуловимого безымянного модуля описанного выше, должны объявлять, какие другие модули им необходимы. В случае с модулем com.app единственным требованием является библиотека Greeting. Но, как вы могли догадаться, эта библиотека (как и другие библиотеки, не поддерживающие Java 9) не является модулем Java 9. Как же нам включить её в проект?
В таком случае вам нужно знать имя jar-файла. Если у вас есть зависимость от библиотеки, которая не была конвертирована в модуль Java 9, вам надо знать, какой jar-файл вызывается для этой библиотеки, потому что Java 9 переведёт имя файла в валидный модуль.
Это называется автоматический модуль.
Так же, как и безымянные модули, автоматические модули могут читать из других модулей, и все их пакеты являются экспортируемыми. Но, в отличие от безымянных модулей, на автоматические можно ссылаться из явных модулей.
Для создания и использования app.jar в качестве исполняемого jar-файла выполните следующие команды:
Следующим шагом будет модуляризация библиотек, которые используются нашим приложением.
Модуляризация библиотек
Для модуляризации библиотеки нельзя сделать ничего лучше, чем использовать jdeps — инструмент для статистического анализа, который является частью Java SE.
Например, команда, которая позволяет увидеть зависимости нашей небольшой библиотеки, выглядит так:
А вот результат её выполнения:
Как и ожидалось, библиотека зависит только от java.base модуля.
Хорошо, но можно лучше. Мы можем попросить jdeps автоматически сгенерировать модульный дескриптор для набора jar-файлов. Просто укажите ему, куда сохранять сгенерированные файлы (например, в папку generated-mods ), и где находятся jar-файлы:
Команда создаст два файла: generated-mods/app/module-info.java и generated-mods/greetings/module-info.java со следующим содержимым:
Теперь мы можем добавить сгенерированный дескриптор для нашей библиотеки в её исходный код, переупаковать её, и у нас получится полностью модульное приложение:
Теперь у нас есть полностью модуляризированные библиотека и приложение. После удаления сгенерированных и бинарных файлов, структура нашего приложения выглядит следующим образом:
Обратите внимание, что для получения хороших данных от jdeps вы должны предоставить местоположение всех jar-файлов, которые используются в приложении, чтобы он мог составить полный граф модуля.
Наиболее простым способом получить список всех jar-файлов, которые используются в библиотеке, является использование скрипта Gradle. Он выведет пути локальных jar-файлов для всех зависимостей библиотек, которые вы добавите в секцию зависимостей, и скачает их, если необходимо:
Если у вас нет Gradle, вы можете использовать SdkMAN! для его установки:
Для получения списка зависимостей используйте следующую команду:
Полученную информацию передайте jdeps для анализа и автоматической генерации метаданных.
Это файл, который jdeps выводит для javaslang.match :
Создание собственного образа среды выполнения
С помощью jlink Java-приложения могут распространяться как образы, которые не требуют установки JVM.
Следующая команда создает образ для нашего com.app модуля без оптимизации, сжатия или отладочной информации:
Для запуска приложения используйте предоставляемый лаунчер в директории bin :
На этом всё. Разбор нововведений в Java 9 предлагаем прочитать в нашей статье.
Создание, компиляция и выполнения Java программ
Перед тем как программа может быть выполнена, её необходимо создать и скомпилировать. Если в вашей программе возникли ошибки компиляции, вам необходимо изменить программу, чтобы исправить их, а затем перекомпилировать её. Если в вашей программе возникли ошибки выполнения, или она не приводит к правильному результату, вам необходимо изменить программу, перекомпилировать её и запустить снова. Этот процесс и является созданием (разработкой) программы.
Для создания и редактирования исходного кода Java вы можете использовать любой текстовый редактор или IDE. Этот раздел демонстрирует, как создавать, компилировать и запускать программы Java из командной строки. В разделе «Компиляция и запуск Java программ в NetBeans» показано, как это делать в IDE на примере NetBeans.
Можно вообще обойтись без IDE, а писать исходный код в любом текстовом редакторе (например, в Notepad), а компилировать в командной строке.
Внимание: файл с исходным кодом должен иметь расширение .java и иметь в точности такое же имя, как и имя публичного (public) класса. Например, файл с исходным кодом:
должен называться Welcome.java, поскольку имя public класса – Welcome.
Компилятор Java преобразовывает файл с исходным кодом Java в файл с байткодом Java. Следующая команда компилирует Welcome.java:
Если нет синтаксических ошибок, компилятор генерирует файл байкода с расширением .class. Следовательно, приведённая выше команда генерирует файл с названием Welcome.class.
Чтобы иметь возможность компилировать и запускать программы, вы должны установить JDK. Как это сделать описано в инструкциях:
Язык Java – это высокоуровневый язык программирования, но байткод Java – это низкоуровневый язык. Байткод похож на машинные инструкции, но нейтрален к архитектуре (не зависит от архитектуры) и может запускаться на любой платформе, которая имеет виртуальную машину Java – Java Virtual Machine (JVM). В отличие от физической машины, виртуальная машина – это программа, которая интерпретирует байткод Java. Это одно из главных преимуществ Java: байткод Java может работать на различных аппаратных платформах и операционных системах. Исходный код Java компилируется в байткод Java, а байткод Java интерпретируется виртуальной машиной Java. Ваш код Java может использовать код библиотеки Java. JVM выполняет ваш код вместе с кодом из библиотеки.
Выполнить Java программу – это значит запустить байткод программы. Вы можете выполнить байткод на любой платформе с JVM, которая является интерпретатором. Она (виртуальная машина Java) переводит отдельные инструкции байткода в целевой машинный языковой код. Это делается последовательно – одна инструкция за раз, а не вся программ за один присест. Каждый шаг немедленно выполняется, сразу после перевода.
Следующая команда выполняет байткод для программы, которая приведена выше:
На скриншоте ниже показан процесс компиляции и запуска:
Внимание: не используйте расширение .class в команде, когда запускаете программу. Используйте ИмяКласса для запуска программы. Если вы в командной строке используете ИмяКласса.class, то система будет пытаться работать с файлом ИмяКласса.class.class.
Справка: когда выполняется Java программа, JVM начинает с загрузки байткода класса в память, используя программу под названием загрузчик классов (class loader). Если ваша программа использует другие классы, загрузчик классов динамически подгружает их перед тем, как они понадобятся. После загрузки класса, JVM использует программу под названием контролёр байткода (bytecode verifier) для проверки правильности байткода и проверки, что байткод не нарушает ограничений безопасности Java. Java обеспечивает строгую защиту, чтобы убедиться, что файлы классов Java не подделаны и не вредят вашему компьютеру.
Педагогическое примечание: ваш инструктор может требовать от вас использовать пакеты для организации программ. Например, все программы из этой части можно поместить в пакет chapter2. Подробности о пакетах и пространствах имён будут рассмотрены далее. Также посмотрите раздел «Почему NetBeans всегда использует package».
Типичные ошибки компиляции и запуска Java программ
Команда javac не найдена
Если при запуске javac, т.е. при попытке компиляции Java программы вы получаете ошибку:
Это означает, что JDK не установлен. Либо установлен, но не настроены переменные окружения. Способы исправления очевидны:
Если JDK установлен, то можно обойтись без добавления переменной окружения. Для этого используйте абсолютный путь до исполнимого файла javac:
Ошибка Class names are only accepted if annotation processing is explicitly requested
Если попытаться скомпилировать программу следующим образом:
то возникнет ошибка:
Причина ошибки в том – что вы забыли указать расширение файла .java.
Ошибка записи (error while writing)
Компиляция заканчивается ошибкой:
Ошибка «class is public, should be declared in a file named»
который заканчивается примерной такой ошибкой
означает, что вы неправильно назвали класс в исходном коде программы. Имя класса должно совпадать с именем файла. В данном случае файл называется Welcome.java, а класс внутри программы назван Welcomee
Error: Could not find or load main class
Если попытаться запустить программу следующим образом:
то возникнет ошибка
Причина её в том, что не нужно было добавлять к названию файла расширение .class. Виртуальная машина автоматически добавляет расширение и в приведённом примере она ищет файл Welcome.class.class
Ошибка Error: Could not find or load main class при запуске Java программы по абсолютному пути
Эта ошибка возможно при запуске Java программы по абсолютному пути:
Ошибка возникает как в Windows, так и в Linux:
Если в терминале вы находитесь в той же директории, что и файл, который вы запускаете, то не нужно указывать абсолютный путь. Например, нужно запускать так:
Если же вы находитесь в другой директории, то нужно использовать опцию -cp, после которой указать путь до каталога, где размещена запускаемая программа. А далее указать запускаемый файл без расширения .class:
Как видно из скриншота, командная строка находится в папке C:\WINDOWS\system32. Файл, который нам нужно запустить, находится в папке C:\ (корень диска). Мы указываем после ключа -cp папку C:\, а затем пишем имя файла программы без расширения – Welcome.
Аналогично нужно поступать в Linux. Пример команды:
Ошибка Main method not found in class
Если при запуске вы столкнулись с ошибкой:
Это означает, что вы не указали метод main, либо написали слово неправильно (например, Main вместо main).
Особенности компиляции и запуска Java программ в Windows
Команда «javac» не является внутренней или внешней командой, исполняемой программой или пакетным файлом
Эта ошибка рассмотрена чуть выше. Для установки и настройки переменных окружения в Windows обратитесь к инструкции «Установка Java (JDK) в Windows».
Проблема с кодировкой в Java программах в командной строке Windows
Если вы написали программу, которая выводит кириллицу в консоль:
А в качестве результата получили крякозяблы:
Значит кодировка, в которой выводит строки ваша программа, отличается от кодировки командной строки Windows.
Имеется несколько способов исправить эту проблему. Кстати, если для запуска консольных программ Java вы используете NetBeans, то он выводит строки в правильной кодировке. В Linux эта проблема также отсутствует. Если вам нужно поменять кодировку на время, то вы можете выполнить следующие команды:
Для того, чтобы смена кодировки командной строки Windows не сбрасывалась после закрытия и открытия командной строки, можно внести изменения в реестр Windows. Для этого нажмите Win+x, выберите «Выполнить», в открывшееся окно введите regedit. В открывшейся программе (редактор реестра Windows) перейдите к [HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\Autorun] и измените (или добавьте) значение на @chcp 65001>nul
Как сделать компиляцию java
В этом уроке мы создадим нашу первую программу на языке Java.
Создание приложения на языке Java состоит из трех следующих шагов:
Создание исходного файла
Итак, открываем текстовый редактор и пишем в нем код программы Hello World, цель которой — вывод на экран сообщения Hello World!
Если вы пользуетесь Notepad++ то нужно выбрать Тип файла:Java source file (*.java)
Будьте внимательны! файл должен называться в точности так, как называется наш класс — HelloWorld. Так же важно учитывать регистр букв. HelloWorld и helloworld в данном случае это разные слова!
Компиляция исходного файла
Исходный файл с кодом программы создан, теперь перейдем к компиляции. Для компиляции Java предназначен компилятор javac, который входит в состав установленного нами в первом уроке пакета JDK.
Для того, чтобы скомпилировать исходный файл, открываем командную строку. Для этого в меню Windows Пуск в строке поиска вводим команду cmd и жмем Enter. После этого откроется командное окно.
Теперь в нем нужно изменить текущий каталог на тот, в котором находится наш исходный файл (например C:\studyjava\). Для этого вводим следующую команду:
После того, как директория изменилась, вводим команду компиляции
После этого, окно командной строки должно выглядеть следующим образом (рис 2.2):
То есть, мы не получим никакого подтверждения, о том, что программа скомпилировалась успешно. Однако, в папке с нашим исходным файлом, должен появиться файл HelloWorld.class. Это можно проверить с помощью команды
Эта команда выводит на экран список всех файлов, находящихся в выбранной директории (рис 2.3).
Если файл HelloWorld.class присутствует в этом списке, то это значит, что программа скомпилировалась успешно.
Если в коде программы есть ошибка, то компилятор Java при компиляции нам об этом сообщит.
Проведем эксперимент: Откроем в текстовом редакторе наш файл HelloWorld.java и удалим последнюю закрывающуюся фигурную скобку «>». Сохраним файл и попробуем его еще раз скомпилировать. В итоге получаем сообщение об ошибке (рис 2.4).
Чтобы исправить ошибку, нужно вновь открыть файл для редактирования, устранить ошибку, сохранить файл и еще раз его скомпилировать.
Запуск программы
Переходим к последней стадии — запуску программы.
Вводим в командном окне:
и если все перед этим было сделано правильно, то получаем результат — вывод сообщения «Hello World!» (рис 2.5).
Еще раз обратите внимание на чувствительность к регистру в Java. Если вы напишете helloworld вместо HelloWorld, то программа запущена не будет, потому что Java попросту не найдет файл с таким именем.
В качестве домашнего задания можете поэкспериментировать и выводить на экран какое-либо свое сообщение вместо Hello World!.
Как скомпилировать и запустить программу на Java?
Перед теми кто начинает программировать на Java, сразу возникают два вопроса: как скомпилировать, и как запустить программу на Java?
В одной из предыдущих статей я уже рассказывал как начать писать программы на Java, но тогда, чтобы как можно быстрее показать Вам как просто можно начать писать на Java я использовал среду разработки NetBeans, но сейчас я хочу рассказать Вам как скомпилировать и запустить java-файл используя лишь инструменты стандартной поставки JDK.
Чтобы у Вас была возможность скомпилировать и запустить Java программу эти консольные программы должны быть доступны в переменной среды PATH вашего ПК. Как добавить свой путь в эту переменную Вы можете найти в Интернете.
Итак, представим, что JDK мы установили, нужные пути прописали, теперь давайте создадим файл Java программы, который будет выводить некоторую надпись в консоль. Код класса должен лежать в файле HelloWorld.java в кодировке UTF-8.
class HelloWorld
<
public static void main(String[] args)
<
System.out.println(«Hello, Myrusakov.RU»);
>
>
Компилируем файл так:
C:/> javac HelloWorld.java
Если ошибок нет, то на выходе Вы получите файл HelloWorld.class в той же папке. Запустить этот файл можно командой:
Во втором случае расширение класса указывать не нужно.
Таким образом мы написали программу на Java, скомпилировали ее и запустили. Конечно с помощью интегрированной среды разработки это можно было бы сделать куда быстрее и без лишних слов, как говориться, но знание базового процесса создания программ на Java, конечно необходимо. А для тех, кто хочет насколько это возможно быстро освоить Java у меня есть специальный видеокурс «Программирование на Java с Нуля до Гуру».
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
Комментарии ( 0 ):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.
Copyright © 2010-2021 Русаков Михаил Юрьевич. Все права защищены.