Как скомпилировать программу на java в командной строке

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

Java Source и каталоги классов

Простой Java-проект содержит один каталог, внутри которого хранятся все исходные файлы. Файлы обычно хранятся не внутри исходного каталога, а в подкаталогах, соответствующих их структуре пакета. Пакеты – это просто способ сгруппировать исходные файлы, которые принадлежат друг другу. Исходный каталог часто называют src, но это не является обязательным требованием.

Например, если вы используете инструмент сборки Maven, вы, как правило, будете использовать другую структуру каталогов, где исходный код Java хранится в каталоге src/main/java(в корневом каталоге вашего проекта).

Когда вы компилируете весь исходный код в Java, компилятор создает один файл .class для каждого файла .java. .Class содержит скомпилированную версию файла .java. Байт-код для файла .java, другими словами.

Это файлы .class, которые может выполнять виртуальная машина. Не файлы .java. Поэтому нормально отделять файлы .java от файлов .class. Обычно это делается путем указания компилятору записать файлы .class в отдельный каталог.

#8. Компиляция и запуск java программы с командной строки

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

Компиляция исходного кода Java

Вы можете скомпилировать исходный код Java непосредственно из вашей IDE(если вы используете IDE). Или вы можете использовать компилятор, который поставляется вместе с Java SDK. Чтобы выполнить компиляцию java кода из командной строки, сделайте следующее:

  • Откройте командную строку (cmd)
  • Перейдите в корневой каталог вашего проекта(не в исходный каталог)
  • Убедитесь, что корневой каталог проекта содержит исходный каталог и каталог классов
  • Введите команду ниже(в Windows – другие ОС будут выглядеть аналогично):

«c:Program FilesJavajdk1.8.0_25binjavac» src/myfirstapp/*.java -d classes

Эта команда выполняет javac(компилятор), которая скомпилирует код в каталоге src / myfirstapp. * . А даже точнее все файлы в данном каталоге.

Каталог myfirstapp – это пакет в корневом каталоге исходного кода src. Если у вас есть несколько пакетов в корневом каталоге, вам придется запускать компилятор несколько раз. Java IDE обрабатывает это автоматически. Так же как и инструменты для сборки, такие как Ant, Maven или Gradle.

Выполнение скомпилированного кода

После того, как компилятор выполнит свою работу, каталог classes будет содержать скомпилированные файлы .class. Структура пакета(структура каталогов) из исходного каталога будет сохранена в каталоге классов.

Вы можете запустить любой из этих файлов .class, в котором есть метод main(). Вы можете запустить .class изнутри вашей Java IDE или из командной строки. Запуск из командной строки это выглядит так:

«c:Program FilesJavajdk1.8.0_25binjava» -cp classes myfirstapp.MyJavaApp

Флаг -cp сообщает виртуальной машине, что все ваши классы находятся в каталоге, называемом классы. Это также называется «путь к классу»(отсюда сокращение cp).

Имя класса для запуска является последним аргументом в приведенной выше команде – часть myfirstapp.MyJavaApp. JVM должна знать полное имя класса(все пакеты плюс имя класса), чтобы определить, где находится соответствующий файл .class.

Когда вы запустите класс, ваша командная строка будет выглядеть примерно так(включая вывод из приложения):

D:dataprojectsmy-first-java-app>»c:Program FilesJavajdk1.8.0_25binjava» -cp classes myfirstapp.MyJavaApp Hello World! D:dataprojectsmy-first-java-app>

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

Источник: java-blog.ru

Компиляция в Java

Компиляция в Java - 1

Программирование в IDE — прекрасно: связанность зависимостей кода, удобный дебаг, понятное тестирование, темная тема. Так вот, благодаря IDE разработка развивается семимильными шагами. Но она расслабляет. С каждым днем, погружаясь в функционал IDE, разработчик привыкает к коммиту одной кнопкой или сборке двумя кликами.

Гораздо хуже обстоит ситуация с новичками в программировании, которые с самого начала работают в IDE, игнорируя работу в командной строке. Например, в Intellij IDEA компиляция Java приложения демонстрируется загрузочным баром в нижней панели, а все параметры компиляции, обработка classpath и прочих прелестей Java-жизни остается за кадром. Предлагаем поговорить о компиляции в Java без IDE. Для запуска примеров в статье следует убедиться, что на вашей машине установлена JDK 1.7 и старше.

Как скомпилировать программу?

  1. Есть исходный код в файле с именем НазваниеКласса.java;
  2. Если в коде нет ошибок, он компилируется в байт-код (в файл НазваниеКласса.class);
  3. Программа запускается.

class Test < public static void main(String[] args) < System.out.println(«Это говорит приложение из командной строки»); >>

Для чего нужна команда javac

Окей, первый пункт выполнен. Идем дальше, чтобы понять: скомпилировать — это как? 🙂 В этом нам поможет команда javac, в аргументе которой необходимо указать нужный файл:

javac Test.java

Компиляция в Java - 2

Если нет ошибок в коде, рядом с файлом Test.java появится файл Test.class. Это и есть скомпилированный байт-код. Теперь его нужно запустить. Здесь используется команда java, запускающая байт-код: На скриншоте видно, что в выводе получаем какие-то иероглифы: очевидно, это сбитая кодировка. Как правило это происходит в системе Windows. Для корректного отображения кириллицы в консоли, есть следующие команды:

REM change CHCP to UTF-8 CHCP 65001 CLS

Они меняют текущую кодовую страницу командной консоли на время работы текущего окна. Попробуем еще раз:

D:Java>java Test

Это говорит приложение из командной строки. Знать принцип работы команды javac очень полезно, так как эта команда лежит в основе любой системы сборки проектов.

Компиляция и выполнение нескольких классов

Для работы с несколькими классами нужен classpath. Он похож на файловую систему, в которой содержатся классы, а функцию папок выполняют пакеты (packages). На этом этапе стоит задуматься об отделении файлов исходного кода от скомпилированных файлов. Как правило исходники находятся в каталоге src, а скомпилированные классы — в bin. Например, у нас есть класс Box и класс BoxMachine , в котором содержится метод main . Класс Box :

Читайте также:
Нужные программы на флешке

package src; public class Box < private double size; public Box(double size) < this.size = size; >public String toString() < return «Box have size » + size; >>
Он находится в пакете src, это необходимо зафиксировать. Класс BoxMachine :
package src; public class BoxMachine < public static void main(String[] args) < for(int i = 0; i < 5; i++) < System.out.println(new Box(Math.random()*10)); >> >

Этот класс также находится в пакете src. В методе main он создает пять объектов класса Box разного размера и выводит в консоль информацию о них. Чтобы скомпилировать эту группу классов, необходимо из главного каталога (в котором лежат папки src и bin) использовать команду javac с аргументами:

javac -d bin ./src/*

-d — флаг, после которого следует указать расположение, куда попадут скомпилированные классы. Это очень удобно, так как перекладывать, например, 1000 классов — очень трудоемкий процесс. bin — название папки. ./src/* — расположение исходных файлов. * указывает, что необходимо скомпилировать все файлы.

Теперь скомпилированные классы появились в папке bin. Для их запуска используется команда java из той же директории, также с аргументами:

java -classpath ./bin BoxMachine

-classpath — флаг, после которого следует указать местоположение скомпилированных классов. Java будет искать главный класс и все сопутствующие именно в этой директории. ./bin — название папки, в которой находятся скомпилированные классы. BoxMachine — название главного класса.

Как и в первом случае, не следует указывать .class , так как это название класса, а не файла. Вывод:

D:Java>java -classpath ./bin src.BoxMachine Box have size 4.085985295359718 Box have size 8.63682158248986 Box have size 6.027448124299726 Box have size 7.288317703877914 Box have size 1.106181659384694

Создание JAR-файлов

Чтобы программу было легко переносить и запускать, можно собрать скомпилированные классы в jar-файл — архив классов. Главное отличие от zip или rar-архивов — наличие файла манифеста.

В этом манифесте указывается главный класс, который будет запускаться при выполнении jar-файла, classpath, а также много дополнительной информации. В главном каталоге создадим файл manifest.mf. Его содержимое будет следующим:

main-class: src.BoxMachine class-path: bin/

main-class указывает класс, который содержит метод main и будет выполнен при запуске. class-path — путь к скомпилированным классам или дополнительным библиотекам. Настало время собрать настоящую программу без IDE с помощью команды jar:

jar -cmf manifest.mf box-machine.jar -C bin .

-cmf — флаг, после которого следует указать путь к файлу манифеста. manifest.mf — путь к манифесту. box-machine.jar — название выходного jar-файла. -С — флаг, после которого указывается путь к скомпилированным классам. . — путь, куда будет помещен jar-файл.

В нашем случае —это главный каталог. Теперь можно запустить. Запуск jar-файлов выполняется также с помощью команды java, но следом нужно указать флаг -jar : он говорит о том, что запускается Jar-файл, а второй аргумент — путь к jar -файлу, включая расширение:

java -jar box-machine.jar
Вывод:
Box have size 5.5495235762547965 Box have size 9.695870044165662 Box have size 2.3408385788129227 Box have size 7.2790741216674135 Box have size 2.3620854470160513

Компиляция в Java без IDE: обзор систем сборок

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

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

Как скомпилировать Java?

Самые известные системы сборки на Java — это Ant, Maven и Gradle. Среди нет плохой или хорошей: каждая из них создана для решения определенных задач. Рассмотрим каждую из них подробнее.

Ant

Ant — инструмент сборки, который использует сценарий, описанный с помощью xml-файла. Структура xml-файла:

// Действия сценария Hello, World! // Второй сценарий // И тд
Создадим в главном каталоге файл build.xml со следующим содержимым:
First build in Ant!
В этом же каталоге вызовем команду ant:
D:Java>D:Tempantbinant Buildfile: D:Javabuild.xml test: [echo] First build in Ant! BUILD SUCCESSFUL Total time: 0 seconds

  • mkdir — создание директорий
  • delete — удаление файлов и директорий
  • javac — компиляция Java–кода
  • java — запуск скомпилированного кода

В сценарии описано три действия — compile , ,code>run и clean . compile создает директорию result, в ней classes, затем с помощью javac компилирует классы в созданную директорию. run запускает скомпилированные классы командой java. clean удаляет директорию result. Если в главном каталоге выполнить команду ant без аргументов, запустится действие compile. Если нужно выполнить определенное действие, его указывают в аргументе.

D:Java>D:/Temp/ant/bin/ant compile Buildfile: D:Javabuild.xml compile: [mkdir] Created dir: D:Javaresultclasses [javac] Compiling 2 source files to D:Javaresultclasses BUILD SUCCESSFUL Total time: 1 second

Maven

Компиляция в Java - 3

Maven предлагает несколько другой подход к сборке проектов. Здесь разработчик скорее описывает свой проект и дополнительные инструменты, которые использует, в отличие от Ant, где сборка — это последовательность действий. Maven популярен среди разработчиков благодаря простому управлению зависимостями и удобной интеграции со всеми средами разработки.

При работе с Maven придерживаются такой структуры проекта: Правила сборки, зависимости и прочее описывается в файле pom.xml. Как правило он находится в главной папке проекта. При запуске Maven проверяет структуру и синтаксис файла, предупреждая об ошибках. В главной директории рядом с папками bin и src создаем файл pom.xml, внутрь добавляем:

Читайте также:
Как удалить с реестра остаточные файлы программы

4.0.0 ru.javarush.testmaven testMavenWithoutIde 1.0.0 compile src bin $-$
Далее в командной строке выполняем команду mvn:

Теперь в папке bin есть папка src, в которой находятся скомпилированные классы. В pom.xml в теге build определена цель сборки — компиляция, директории файлов исходного кода и результата компиляции, а также имя проекта. У Maven есть множество целей сборки и плагинов для запуска тестирования, создания Jar-файлов, сборки дистрибутивов и других задач.

Gradle

Это самая молодая система сборки, которая основывается на Ant и Maven. Главное отличие — работа на базе ациклического графа для определения порядка выполнения задач. Это очень полезно при более сложных задачах, например, инкрементальных и многопроектных сборках. При сборке с помощью Gradle также рекомендуется придерживаться структуры папок проекта Maven. Кстати, файл для сборки в Gradle он называется build.gradle и выглядит гораздо меньше, чем у Maven. Пример для наших классов:

apply plugin: ‘java’ apply plugin: ‘application’ sourceSets < main < java < srcDirs ‘src’ >> > sourceSets.main.output.classesDir = file(«bin») mainClassName = «src.BoxMachine» defaultTasks ‘compileJava’, ‘run’

В файле происходит подключение плагинов, определение директории файлов исходного кода (если не используется структура проектов Maven), директория результатов сборки, имя главного класса, а также задачи по умолчанию. За запуск сборки отвечает команда gradle в директории, где лежит файл build.gradle:

d:Java>D:Tempgradlebingradle Welcome to Gradle 5.4.1! Here are the highlights of this release: — Run builds with JDK12 — New API for Incremental Tasks — Updates to native projects, including Swift 5 support For more details see https://docs.gradle.org/5.4.1/release-notes.html Starting a Gradle Daemon (subsequent builds will be faster) > Task :help Welcome to Gradle 5.4.1. To run a build, run gradle . To see a list of available tasks, run gradle tasks To see a list of command-line options, run gradle —help To see more detail about a task, run gradle help —task For troubleshooting, visit https://help.gradle.org BUILD SUCCESSFUL in 52s 1 actionable task: 1 executed

Заключение

На первый взгляд, умение компиляции и сборки кода без IDE кажется бесполезным. Действительно, зачем мучиться с командными строками и гуглить все команды, когда есть уютная IDEшечка с плагинами, автопроверкой всего что можно (современные IDE разве что уровень IQ не проверяют) и интеграцией с популярными системами.

Однако практика показывает, что умение собирать код без среды разработки и понимание каждого шага этого процесса — суровая необходимость. Этот навык сэкономит немало нервных клеток и времени вам и вашей компании. Освоить работу в IDE, попрактиковаться в написании кода и, конечно же, получить фундаментальные основы по программированию на Java вы можете здесь — на JavaRush. Пора вернуться к обучению 🙂

Источник: javarush.com

Создание, компиляция и выполнения Java программ

Перед тем как программа может быть выполнена, её необходимо создать и скомпилировать. Если в вашей программе возникли ошибки компиляции, вам необходимо изменить программу, чтобы исправить их, а затем перекомпилировать её. Если в вашей программе возникли ошибки выполнения, или она не приводит к правильному результату, вам необходимо изменить программу, перекомпилировать её и запустить снова. Этот процесс и является созданием (разработкой) программы.

Для создания и редактирования исходного кода Java вы можете использовать любой текстовый редактор или IDE. Этот раздел демонстрирует, как создавать, компилировать и запускать программы Java из командной строки. В разделе «Компиляция и запуск Java программ в NetBeans» показано, как это делать в IDE на примере NetBeans.

Можно вообще обойтись без IDE, а писать исходный код в любом текстовом редакторе (например, в Notepad), а компилировать в командной строке.

Внимание: файл с исходным кодом должен иметь расширение .java и иметь в точности такое же имя, как и имя публичного (public) класса. Например, файл с исходным кодом:

public class Welcome < public static void main(String[] args) < System.out.println(«Welcome to Java!»); >>

должен называться Welcome.java, поскольку имя public класса – Welcome.

Компилятор Java преобразовывает файл с исходным кодом Java в файл с байткодом Java. Следующая команда компилирует Welcome.java:

javac Welcome.java

Если нет синтаксических ошибок, компилятор генерирует файл байкода с расширением .class. Следовательно, приведённая выше команда генерирует файл с названием Welcome.class.

Чтобы иметь возможность компилировать и запускать программы, вы должны установить JDK. Как это сделать описано в инструкциях:

  • Установка Java (JDK) в Windows
  • Установка Java (JDK) в Linux

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

В отличие от физической машины, виртуальная машина – это программа, которая интерпретирует байткод Java. Это одно из главных преимуществ Java: байткод Java может работать на различных аппаратных платформах и операционных системах. Исходный код Java компилируется в байткод Java, а байткод Java интерпретируется виртуальной машиной Java. Ваш код Java может использовать код библиотеки Java. JVM выполняет ваш код вместе с кодом из библиотеки.

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

Следующая команда выполняет байткод для программы, которая приведена выше:

java Welcome

На скриншоте ниже показан процесс компиляции и запуска:

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

Справка: когда выполняется Java программа, JVM начинает с загрузки байткода класса в память, используя программу под названием загрузчик классов (class loader). Если ваша программа использует другие классы, загрузчик классов динамически подгружает их перед тем, как они понадобятся. После загрузки класса, JVM использует программу под названием контролёр байткода (bytecode verifier) для проверки правильности байткода и проверки, что байткод не нарушает ограничений безопасности Java. Java обеспечивает строгую защиту, чтобы убедиться, что файлы классов Java не подделаны и не вредят вашему компьютеру.

Читайте также:
Как устанавливать программу файла образа диска

Педагогическое примечание: ваш инструктор может требовать от вас использовать пакеты для организации программ. Например, все программы из этой части можно поместить в пакет chapter2. Подробности о пакетах и пространствах имён будут рассмотрены далее. Также посмотрите раздел «Почему NetBeans всегда использует package».

Типичные ошибки компиляции и запуска Java программ

Команда javac не найдена

Если при запуске javac, т.е. при попытке компиляции Java программы вы получаете ошибку:

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

Это означает, что JDK не установлен. Либо установлен, но не настроены переменные окружения. Способы исправления очевидны:

  • установить JDK
  • настроить переменные окружения

Если JDK установлен, то можно обойтись без добавления переменной окружения. Для этого используйте абсолютный путь до исполнимого файла javac:

C:Program FilesJavajdk1.8.0_131binjavac.exe программа_для_компиляции.java

Ошибка Class names are only accepted if annotation processing is explicitly requested

Если попытаться скомпилировать программу следующим образом:

«C:Program FilesJavajdk1.8.0_131binjavac.exe» Welcome2

то возникнет ошибка:

error: Class names, ‘Welcome’, are only accepted if annotation processing is explicitly requested 1 error

Причина ошибки в том – что вы забыли указать расширение файла .java.

Ошибка записи (error while writing)

C:UsersAlex>»C:Program FilesJavajdk1.8.0_131binjavac.exe» C:Welcome.java

Компиляция заканчивается ошибкой:

C:Welcome.java:1: error: error while writing Welcome: C:Welcome.class (╬Єърчрэю т фюёЄєях) public class Welcome < ^ 1 error

Причина ошибки в том, что у компилятора (javac) недостаточно прав на запись в тот каталог, куда он пытается сохранить новый файл .class. Чтобы ошибка исчезла: предоставьте компилятору дополнительные права (запустите от имени администратора), либо сохраняйте в папку, на которую у текущего пользователя имеются права записи.

Ошибка «class is public, should be declared in a file named»

«C:Program FilesJavajdk1.8.0_131binjavac.exe» C:Welcome.java

который заканчивается примерной такой ошибкой

C:Welcome.java:1: error: class Welcomee is public, should be declared in a file named Welcomee.java public class Welcomee < ^ 1 error

означает, что вы неправильно назвали класс в исходном коде программы. Имя класса должно совпадать с именем файла. В данном случае файл называется Welcome.java, а класс внутри программы назван Welcomee

Error: Could not find or load main class

Если попытаться запустить программу следующим образом:

java Welcome.class

то возникнет ошибка

Error: Could not find or load main class Welcome.class

Причина её в том, что не нужно было добавлять к названию файла расширение .class. Виртуальная машина автоматически добавляет расширение и в приведённом примере она ищет файл Welcome.class.class

Ошибка Error: Could not find or load main class при запуске Java программы по абсолютному пути

Эта ошибка возможно при запуске Java программы по абсолютному пути:

java C:Welcome
Error: Could not find or load main class C:Welcome

Ошибка возникает как в Windows, так и в Linux:

java /home/mial/Welcome Error: Could not find or load main class .home.mial.Welcome

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

cd C: java Welcome

Если же вы находитесь в другой директории, то нужно использовать опцию -cp, после которой указать путь до каталога, где размещена запускаемая программа. А далее указать запускаемый файл без расширения .class:

java -cp C: Welcome

Как видно из скриншота, командная строка находится в папке C:WINDOWSsystem32. Файл, который нам нужно запустить, находится в папке C: (корень диска). Мы указываем после ключа -cp папку C:, а затем пишем имя файла программы без расширения – Welcome.

Аналогично нужно поступать в Linux. Пример команды:

java -cp /home/mial/ Welcome

Ошибка Main method not found in class

Если при запуске вы столкнулись с ошибкой:

Error: Main method not found in class Welcome, please define the main method as: public static void main(String[] args) or a JavaFX application class must extend javafx.application.Application

Это означает, что вы не указали метод main, либо написали слово неправильно (например, Main вместо main).

Особенности компиляции и запуска Java программ в Windows

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

Эта ошибка рассмотрена чуть выше. Для установки и настройки переменных окружения в Windows обратитесь к инструкции «Установка Java (JDK) в Windows».

Проблема с кодировкой в Java программах в командной строке Windows

Если вы написали программу, которая выводит кириллицу в консоль:

public class Welcome < public static void main(String[] args) < System.out.println(«Привет из Java!»); >>

А в качестве результата получили крякозяблы:

Значит кодировка, в которой выводит строки ваша программа, отличается от кодировки командной строки Windows.

Имеется несколько способов исправить эту проблему. Кстати, если для запуска консольных программ Java вы используете NetBeans, то он выводит строки в правильной кодировке. В Linux эта проблема также отсутствует. Если вам нужно поменять кодировку на время, то вы можете выполнить следующие команды:

REM change CHCP to UTF-8 CHCP 65001 CLS

Проверь себя:

  1. Какое расширение имеют файлы с исходным кодом Java, и какое расширение у файлов с байткодом Java?
  2. Что принимает на входе и что выдаёт на выходе Java компилятор?
  3. Какой командой компилируется программа Java?
  4. Какой командой запускается программа Java?
  5. Что такое JVM?
  6. Может ли Java быть запущена на любой машине. Что необходимо для запуска Java на компьютере?

Источник: java9.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru