расширение скомпилированного кода java

Создание, компиляция и выполнения 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

Источник

Внутренности JVM, Часть 2 — Структура class-файлов

Всем привет! Перевод статьи подготовлен специально для студентов курса «Разработчик Java».

Продолжаем разговор о том, как Java Virtual Machine работает внутри. В предыдущей статье (оригинал на анг.) мы рассмотрели подсистему загрузки классов. В этой статье мы поговорим о структуре class-файлов.


Рисунок — компиляция исходного кода Java

Давайте напишем простую программу.

Запуск javac для этого файла приведет к появлению следующих файлов.

Как видите, для каждого класса и интерфейса создается отдельный class-файл.

Что внутри class-файла?

Class-файл имеет бинарный формат. Информация в нем обычно записывается без отступов между последовательными частями информации, все выравнивается по границам байтов. Все 16-битные и 32-битные значения записываются с помощью двух или четырех последовательных 8-битных байтов.

Class-файл содержит следующую информацию.

Версия файла. Следующие четыре байта содержат мажорную и минорную версию файла. Вместе эти номера определяют версию формата class-файла. Если class-файл имеет основной мажорную версию M и минорную m, то мы обозначаем эту версию как M.m.

У каждой JVM есть ограничения по поддерживаемым версиям class-файлов. Например, Java 11 поддерживает major версию с 45 до 55, Java 12 — с 45 по 56.

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

This class. Ссылка на запись в пуле констант.

Super class. Ссылка на запись в пуле констант.

Интерфейсы. Количество интерфейсов, реализованных классом.

Количество полей. Количество полей в классе или интерфейсе.

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

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

Методы. Далее находятся сами методы. Для каждого метода содержится следующая информация: дескриптор метода (тип возвращаемого значения и список аргументов), количество слов, необходимых для локальных переменных метода, максимальное количество слов стека, необходимых для стека операндов метода, таблицу исключений, перехватываемых методом, байт-коды метода и таблица номеров строк.

Количество атрибутов. Количество атрибутов в этом классе, интерфейсе или модуле.

Атрибуты. После количества атрибутов следуют таблицы или структуры переменной длины, описывающие каждый атрибут. Например, всегда есть атрибут “SourceFile”. Он содержит имя исходного файла, из которого был скомпилирован class-файл.

Хотя class-файл напрямую не человекочитаемый, в JDK есть инструмент под названием javap, который выводит его содержимое в удобном формате.

Давайте напишем простую программу на Java, указанную ниже.

Здесь вы можете увидеть, что класс публичный ( public ) и у него в пуле констант 37 записей. Есть один атрибут (SourceFile внизу), класс реализует два интерфейса (Serializable, Cloneable), у него нет полей и есть два метода.

Больше почитать про javap вы можете здесь.

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

Источник

Компиляция java кода из командной строки

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

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

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

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

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

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

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

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

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

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

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

Источник

Компиляция файлов Java *.class с помощью javac

Узнайте, как использовать javac для создания файлов *.class.

1. Обзор

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

2. Команда javac

Мы можем указать параметры и исходные файлы при выполнении инструмента javac :

Где [параметры] обозначает параметры, управляющие операциями инструмента, и [исходные файлы] указывает один или несколько исходных файлов, которые будут скомпилированы.

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

Параметры кросс-компиляции используются для менее распространенного случая компиляции определений типов в реализации JVM, отличной от среды компилятора, и не будут рассматриваться.

3. Определение типа

Давайте начнем с представления класса, который мы собираемся использовать для демонстрации опций javac :

Обратите внимание, что в этой статье мы используем разделители файлов *unix; на компьютерах с Windows мы должны использовать обратную косую черту (‘ \’ ) вместо прямой косой черты (‘ /’ ).

4. Стандартные опции

Давайте выполним следующую команду в каталоге, содержащем структуру, представленную в предыдущем разделе:

Вот несколько других часто используемых вариантов:

Предположим, что у нас есть два файла с именами options и types в каталоге javac-args со следующим содержимым:

Предположим, что в каталоге javac-args есть файл с именем arguments :

5. Дополнительные опции

Вот некоторые из самых удобных -Xlint клавиш:

Теперь создайте файл с именем xl в tops в каталоге javac-args со следующим содержимым:

При выполнении этой команды:

мы должны увидеть rawtypes и непроверенные предупреждения:

6. Заключение

Источник

coreer

Just another WordPress.com site

компилятор javac. Как работать с утилитой?

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

Общее описание работы утилиты
Компилировать файлы мы можем двумя способами:

Чтобы файлы были скомпилированы успешно приложение должно соответсвовать следующим простым правилам:

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

source Иформация о исходнике. lines Номер строки в исходнике. vars Локальные переменные в блоках кода.

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

Эта опция контролирует генерацию исходников для неявно загруженных классов (те которые находятся в класспазе). Если -implicit:class, то автоматически генерирует исходники. Если эта генерация не нужно то нужно определить ключ так -implicit:none. Если опция не определена, то по-умолчанию исходники генерятся, но при этом компилятор выводит предупреждения про каждый сгенерированный класс, вобщем ведет себя так, как и процессор аннотаций, когда тот генерит исходники. Чтобы не выводились сообщения нужно испльзовать явное указание в этой опции на генерацию классов.

Отключается вывод предупреждений. Это сокращения для временной для платформы ява 6 опции -Xlint:none.

Контролирует выполнять ли обработку аннотаций и если какая-то аннотация требует последующую компиляцию. Controls whether annotation processing and/or compilation is done. -proc:none означает выполнить только компиляцию без анализа аннотаций. -proc:only означает, что выполнить только анализ аннотаций, но без либо каких последующих комплиций, основанных на анотациях.

Указываются именна процессоров для аннотаций. Определение этих имен отключает дефолтовые процесс анализа.

Указываем где искать классы для процессоров аннотаций. Если эта опция не будет указана, а предыдущая будет иметь некий список классов, то поиск будет производиться в класспазе.

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

Опеределяет какой версии платформы код допускается для компиляции. Вот созможные значения:

1.3 Компилатор не поддреживает assertions, generics(н-р: Iterator ), а также другие фишки, которые были представлены выше платформы JDK 1.3. 1.4 Этот компилятор уже может принимать код с предоположениями(assertions), они были представлены именно в JDK 1.4. 1.5 Этот помпилятор может принимать generics и другие фишки представленные в JDK 5. 5 Это синоним для 1.5. 1.6 Значение по-умолчанию.This is the default value. Новых фишок для языка в платформе Java SE 6 не было представленно. Хотя теперь ошиобки кодировки будут валиться как ошибки, а не как предупреждения, как было раньше. 6 Это синоним для 1.6.

-verbose Многословный вывод — компилятор будет выводить информацию о каждом загруженном классе и о каждом откомпилированном классе.

Вывести информацию о версии.

Вывести информацию про нестандартые опции и выйти.

Кросскомпиляционные опции

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

-target version На основе этой опции классы генерируются для контектной виртуальной машины. Возможные варианты 1.1 1.2 1.3 1.4 1.5 (или 5) и 1.6 (или 6). По-умолчанию -target зависит от значения в -source:

Нестандартные опции

Эти характерны только для платформы java se 6

-Xbootclasspath/p:path Добвавить путь вконец списка бутсрапных библиотек. -Xbootclasspath/a:path Добвавить путь вначало списка бутсрапных библиотек. -Xbootclasspath/:path Полностью перегрузить путь бутсрапных библиотек. -Xlint Включить все рекомендованные предупреждения. В этом релизе пратформы все предупреждения рекомендованы. -Xlint:none Отключить все предупреждения, которые не установлены в спецификации языка Ява. -Xlint:-name Отключить предупреждения типа -Xlint:name. Вот сразу ниже и представлены все эти типы. -Xlint:unchecked Детально информировать о непроверенных преобразованиях, которые определены спецификацией языка. -Xlint:path Предупреждать о несуществующих каталогах, которые определены в путях (classpath, sourcepath, etc). -Xlint:serial Warn about missing serialVersionUID definitions on serializable classes. -Xlint:finally Предупреждать о finally случаях, которые не могут завершиться нормально. -Xlint:fallthrough Проверять switch блоки, чтобы кейсы не проваливались на следующие, это возможно если ошибочно не поставлен break после какого-нибудть кейса:

-J Опция

-Joption Передаеются так option в java launcher, который вызвается компилятором javac. К примеру, -J-Xms48m устанавливает стартапный размер памяти в 48 мегабайт. Хоть эта опция и не начинается с -X, это не “стандартная опция” javac. Это просто соглашения как передавать параметры в виртуальную машину, которая вызывает ява-приложения для задач выполняемых утилитой javac, если вызов ява-ланчера должне быть не стандартным. Note: CLASSPATH, -classpath, -bootclasspath, and -extdirs установка этих параметров для javac, не влияет на приложения, которые обслуживают сам компилятор, а только на то приложение которое им компилируется. Если даже удасться найти дыры и повлиять на него так, то это все-равно очень рисоквано. Если нужно повлиять на компилятор, то нужно посользоваться его опцией -J, а это уже влияение на java launcher, который будет запускать ява-приложения для обеспечения выполнения именно компилятора.

@Аргфайлы
В этих файлах вводят большое количество классов на компиляцию и большое количество аргументов. Пример:
Файл Options :

А так производится вызов:

Осмотр обработки аннотаций

Неявно загруженные исходники

API для использования утилиты-компилятора

Example

To perform a compilation using arguments as you would give on the command line, you can use the following:

Источник

Понравилась статья? Поделиться с друзьями:

Не пропустите наши новые статьи:

  • расширение посмотреть код страницы
  • расширение пдф какая программа
  • расширение для сохранения кода элемента
  • Расширение для изображений webp что это за программа и нужна ли она
  • Расширение для изображений heif что это за программа и нужна ли она

  • Операционные системы и программное обеспечение
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest
    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии