JAR-файлы в Windows – как открывать, редактировать и конвертировать
Файл с расширением .JAR представляет собой файл Java Archive, используемый для хранения Java программ и игр в одном файле. Некоторые содержат файлы, которые заставляют их работать как отдельные приложения, а другие содержат библиотеки программ для использования другими программами.
JAR-файлы сжаты в ZIP и часто хранят такие вещи, как файлы CLASS, файлы манифеста и ресурсы приложения, такие как изображения, звуковые клипы и сертификаты безопасности. Так как они могут хранить сотни или даже тысячи файлов в сжатом формате, файлами JAR легко обмениваться и перемещать.
Мобильные устройства с поддержкой Java могут использовать файлы JAR в качестве файлов игры, а некоторые веб-браузеры содержат темы и надстройки в формате JAR.
Как открыть файлы JAR
Java Runtime Environment (JRE) должен быть установлен для того, чтобы открыть исполняемый JAR-файл, но обратите внимание, что не все JAR-файлы имеют формат исполняемого файла. После установки вы можете просто дважды щелкнуть файл JAR, чтобы открыть его.
Некоторые мобильные устройства имеют встроенную JRE. После установки приложения Java также можно открывать в веб-браузере, например Firefox, Safari, Edge или Internet Explorer (но не в Chrome).
Поскольку JAR-файлы сжимаются с помощью ZIP, любой распаковщик файлов может открыть его, чтобы отобразить содержимое, которое находится внутри. Это включает в себя такие программы, как 7-Zip, PeaZip и jZip.
Другой способ открыть файлы JAR – использовать следующую команду в командной строке, заменив yourfile.jar именем вашего собственного файла JAR:
java -jar yourfile.jar
Ошибки открытия файлов JAR
Из-за настроек безопасности в операционной системе Windows и в некоторых веб-браузерах весьма часто можно увидеть ошибки при попытке доступа к приложениям Java.
Например, «Java Application Blocked» может отображаться при попытке загрузки Java-апплета. Это можно исправить, установив уровень безопасности в апплете панели управления Java.
Если вы не можете открыть апплеты Java даже после установки JRE, сначала убедитесь, что Java включена в вашем браузере и что панель управления правильно настроена для использования Java. Затем полностью перезапустите браузер, закрыв все открытые окна, а затем снова откройте программу.
Также убедитесь, что вы используете последнюю версию Java. Если нет, вернитесь к ссылке JRE выше и установите последнюю версию.
Как конвертировать файл JAR
Вы можете декомпилировать файлы CLASS JAR-файла в файлы Java с помощью веб-сайта JavaDecompilers.com. Загрузите туда свой JAR-файл и выберите, какой декомпилятор использовать.
Преобразование приложения Java для использования на платформе Android потребует преобразования файла JAR в APK. Одним из вариантов может быть запуск файла JAR в эмуляторе Android, чтобы программа автоматически создала файл APK. Однако, самый простой способ получить Java-программу на Android – просто скомпилировать APK из исходного исходного кода.
Файлы WAR также являются файлами Java Web Archive, но вы не можете преобразовать файл JAR напрямую в файл WAR, поскольку формат WAR имеет особую структуру, которой нет в JAR. Вместо этого вы можете создать WAR-файл и затем добавить JAR-файл в каталог lib, чтобы классы в JAR-файле были доступны для использования. WizToWar может помочь вам сделать это.
Создать ZIP-файл из JAR-файла так же просто, как переименовать расширение файла из .JAR в .ZIP. Это, на самом деле, не выполняет преобразование файлов, но позволяет программам, использующим ZIP-файлы, таким как 7-Zip или PeaZip, легче открывать файл JAR.
Дополнительная информация о формате JAR
Если вам нужна помощь в упаковке программ в файлы JAR, перейдите по этой ссылке для получения инструкций на веб-сайте Oracle.
Только один файл манифеста может быть включен в архив JAR, и он должен находиться в расположении META-INF/MANIFEST.MF. Он должен следовать синтаксису имени и значения, разделенных двоеточием, как Manifest-Version:1.0. Этот файл MF может указывать классы, которые должно загружать приложение.
Разработчики Java могут подписывать свои приложения цифровой подписью, но это не подписывает сам файл JAR. Вместо этого файлы внутри архива перечислены с их подписанными контрольными суммами.
Как открыть JAVA файлы? 4 простых метода решения таких проблем
Когда вы сталкиваетесь с проблемой с неизвестным файлом JAVA и не знаете, как открыть такой файл, первый шаг, который вы должны сделать, это определить причину данной проблемы. Мы покажем вам, как решить наиболее распространенные проблемы с файлами JAVA и как их решить, в 4 простых шага.
- 1. JAVA расширение файла
- 2. Что такое JAVA файл?
- 3. Как открыть файл JAVA?
- 3.1 Убедитесь, что файл правильно связан с выбранным программным обеспечением
- 3.2 Установите программу, которая поддерживает JAVA файлы
- 3.2.1 Программы, поддерживающие файлы с расширением JAVA
JAVA расширение файла
- Тип файла Java Source Code Format
- Разработчик файлов Oracle
- Категория файла Файлы разработчика
- Рейтинг популярности файлов
Что такое JAVA файл?
Файлы JAVA содержат исходный код, написанный на языке программирования Java. Обычно они сохраняются с расширением имени файла «.java». Исходный код, содержащийся в файле JAVA, компилируется компилятором Java в байт-код. Затем этот байт-код сохраняется в файле класса, который называется файлом класса Java.
Файлы JAVA можно открывать и редактировать с помощью любого текстового редактора. Для создания исполняемых классов файл JAVA должен быть скомпилирован с помощью компилятора Java и при необходимости связан с другими классами. После завершения процесса компиляции классы можно запускать с помощью виртуальной машины Java.
Как открыть файл JAVA?
В некоторых случаях проблемы могут возникнуть при попытке открыть файлы JAVA. Приведенные ниже шаги могут быть полезны для решения таких проблем.
Шаг 1 – Убедитесь, что файл правильно связан с выбранным программным обеспечением
Первое, что пользователь должен сделать, это связать приложение с файлами JAVA. Может случиться так, что даже если в системе установлено приложение, поддерживающее файлы JAVA, оно не будет правильно связано с этим форматом файла. Это можно легко исправить, связав программу с файлами JAVA. Чтобы связать такие файлы с данным приложением, пользователь должен открыть меню файлов (щелкнув правой кнопкой мыши по файлу) и выбрав «Открыть с помощью». Список предлагаемых приложений будет отображаться в верхней части меню. Затем выберите приложение и подтвердите свой выбор, установив флажок «Всегда использовать выбранное приложение для открытия файлов такого типа». Подтвердите свой выбор, нажав ОК.
Чтобы открыть JAVA файл, сфокусируйтесь на шагах 1 и 2
В большинстве случаев для открытия файлов с расширением JAVA должно быть достаточно следующих инструкций на шаге 1 и 2. Прежде чем предпринимать следующие шаги, протестируйте все программы, перечисленные ниже.
Шаг 2 – Установите программу, которая поддерживает JAVA файлы
Если случится так, что раздел с предлагаемыми программами будет пустым, наиболее вероятно, что в системе не будет установлена программа, поддерживающая файлы JAVA. Выберите программу из следующего списка и установите ее:
Как запустить java файлы
В обоих случаях (IDE или утилита jar) в архиве будет создаваться файл MANIFEST.MF. Как я уже писал — есть смысл почитать о дополнительных свойствах JAR-файлов. Т.к. в документации все очень неплохо написано, не буду заниматься переводом. Так что перейдем к следующему пункту нашего путешествия по JAR-файлам.
Подключение готовых JAR-файлов
Командная строка
Итак, я сказал, что основная функция JAR — содержать набор классов в виде class-файлов. Теперь нам надо понять, как подключать JAR-файлы к запускаемому классу, чтобы запускаемый класс мог использовать классы из JAR-файла.
Как вы уже хорошо знаете, запуск программы на Java включает запуск JVM (для Windows это файл java.exe, для Unix — java) и передача ей из командной строки имени класса, который вы собираетесь запускать. Например, для запуска класса First в пакете edu.javacourse.test надо в каталоге, внутри которого находится каталог edu/javacourse/test набрать такую команду:java edu . javacourse . test . First
Как видите, в качестве аргумента мы передали полное имя класса, который собираемся запускать. JVM кроме имени класса принимает достаточно много параметров, которые позволяют конфигурировать те или иные свойства JVM. В этой статье мы разберем очень важный элемент — CLASSPATH — который как раз и используется для подключения JAR-файлов.
Сейчас мы проделаем полный цикл создания JAR-файла и его подключения без использования IDE — я очень трепетно отношусь к умению программиста пользоваться командной строкой. Во-первых, это показывает, что вы действительно понимаете суть, во-вторых — этот навык ну просто очень полезен. Например, в том же Unix/Linux очень большое количество работы гораздо удобнее делать в командной строке, да и некоторые продукты содержат утилиты, запускаемые из командной строки. Так что займемся.
Создадим каталог JavaLesson (в принципе мы его уже создавали в разделе Основные шаги. В этом каталоге создадим стуктуру каталогов JarLib/edu/javacourse/jar. С помощью текстового редактора создадим файл SayHello.javapackage edu . javacourse . jar ;
public class SayHello
public void sayHello ( ) < System . out . println ( "HELLO" ) ;Структура наших каталогов должна выглядеть вот так:
JavaLesson
javacourse
SayHello . javaТеперь время за командной строкой. Запускаем команду «cmd» (если не помните — смотрим раздел Основные шаги). Переходим в каталог JavaLesson/JarLib и в нем сначала компилируем наш файл SayHello.java вот такой командой
javac edu / javacourse / jar / SayHello . java
После успешной компиляции создаем JAR-файл с помощью команды
jar cf say . jar edu / javacourse / jar / SayHello . class
Если у вас все получилось, то в каталоге JavaLesson/JarLib должен появится файл say.jar.
Теперь напишем небольшой класс, который будет использовать наш класс SayHello. ВАЖНО . Для «чистоты эксперимента» создадим этот класс в каталоге JavaLesson. Предлагаю создать класс без использования пакетов (хотя это не должно быть правилом — в реальных проектах создавать классы без пакетов не надо). Вот наш файл UseHello.java, который будет находится в каталоге JavaLessonimport edu . javacourse . jar . SayHello ;
public class UseHello
public static void main ( String [ ] args ) < SayHello sh = new SayHello ( ) ; sh . sayHello ( ) ;Обратите внимание на первую строчку — в ней мы импортируем класс SayHello. В методе main мы создаем объект и вызываем его метод. Структура наших каталогов должна выглядеть вот так:
JavaLesson
javacourse
SayHello . java
UseHello . javaТеперь нам надо скомпилировать наш замечательный класс. Пробуем команду javac. ВНИМАНИЕ . Мы находимся в каталоге JavaLesson.
javac UseHello . java
И мы получаем ошибку:
C : \ JavaLesson > javac UseHello . java
UseHello . java : 1 : error : package edu . javacourse . jar does not exist
import edu . javacourse . jar . SayHello ;
UseHello . java : 6 : error : cannot find symbol
SayHello sh = new SayHello ( ) ;
symbol : class SayHello
location : class UseHello
UseHello . java : 6 : error : cannot find symbol
SayHello sh = new SayHello ( ) ;
symbol : class SayHello
location : class UseHelloСообщение в данном случае достаточно информативное — «UseHello.java:1: error: package edu.javacourse.jar does not exist» и «UseHello.java:6: error: cannot find symbol». Мы же не подключали наш класс SayHello — вот компилятор и не знает, откуда его брать и вообще откуда такой пакет/класс — edu.javacourse.jar.SayHello. Ну что же — перефразируя классику — «Ваше слово, товарищ CLASSPATH».
Очевидно, что нам надо компилятору подсказать, что он должен использовать не только те JAR-файлы, которые у него уже есть — тот же rt.jar — но и наш JAR-файл. Делается это с помощью специальной опции при запуске компилятора.javac — cp JarLib / say . jar UseHello . java
В этой команде мы добавили строку -cp JarLib/say.jar. Часть -cp говорит, что за ней должен идти список JAR-файлов, которые содержат нужные классы. Список может включать несколько файлов, разделенных для Windows знаком «;», для Unix/Linux — «:». Например, если мне надо указать два файла — say1.jar и say2.jar — находящихся в каталоге C:/Anton/Libraries, то команда (для Windows) выглядела бы так:
javac — cp C : / Anton / Libraries / say1 . jar ; C : / Anton / Libraries / say2 . jar UseHello . java
Кстати, «-cp» — сокращенно от classpath — раньше надо было писать именно так, да и сейчас тоже можно.
javac — classpath C : / Anton / Libraries / say1 . jar ; C : / Anton / Libraries / say2 . jar UseHello . java
Также важно отметить, что в CLASSPATH можно включать не только JAR-файлы — туда можно включать путь до каталога с файлами .class (опять же — их может быть указано несколько штук). Если бы мы не создавали JAR-файл say.jar, а использовали скомпилированный файл SayHello.class из каталога JarLib, то команда выглядела бы вот так:
java — cp JarLib UseHello . java
Вы можете спросить — почему мы указали путь только до JarLib, а не полностью каталог с файлом SayHello.class. Дело в том, что т.к. наш файл содержится в пакете, то нам надо указать путь именно до пакета, а он находится в каталоге JarLib. Можно указать полный (а не относительный) путь — вот так:
javac — cp C : / JavaLesson / JarLib UseHello . java
Ну что же, скомпилировать нам удалось, самое время запускать наше замечательный класс. Скорее всего, вы уже догадываетесь, что при запуске нам тоже надо указать наш файл say.jar и выглядеть команда должна как-то так. ВНИМАНИЕ . Мы находимся в каталоге JavaLesson.
java — cp JarLib / say . jar UseHello
Но при запуске этой программы нас постигает неудача. Вот такое сообщение выдает JVM:
Error : Could not find or load main class UseHello
JVM не может найти наш класс. Как это, вот же он, прямо в этой директории ? Хитрость в том, что когда вы указываете CLASSPATH в командной строке, то JVM берет классы ТОЛЬКО из этих файлов/каталогов. А наш файл с классом UseHello находится в ТЕКУЩЕМ каталоге, который НЕ УКАЗАН. Вот такая вот эпидерсия. Нам надо указать JVM, чтобы она брала файлы и из текущего каталога тоже. Делается это так — в CLASSPATH надо указать символ «.». Это и будет текущий каталог. Наща команда должна выглядеть вот так:
java — cp . ; JarLib / say . jar UseHello
Ну что же — теперь все должно получится и мы увидим надпись HELLO.
Фокус с CLASSPATH может сыграть с вами достаточно злую шутку. Дело в том, что JVM использует переменную среды, которая так и называется «CLASSPATH». Для Windows она устанавливается точно так же как переменные «PATH» и «JAVA_HOME» — мы делали это в разделе Установка JDK. В этой переменной указывается набор JAR-файлов и каталогов, которые JVM будет использовать в случае, если вы НЕ указываете CLASSPATH при запуске своей программы.
Некоторые программы при своей установке создают (или обновляют) переменную среды «CLASSPATH» и могут даже вам ничего не сказать. И вот вы из командной строки запускаете свой класс, а JVM его НЕ ВИДИТ. Потому? что она dpzkf переменную «CLASSPATH» и в ней нет символа «.». В этом случае происходит то, что мы уже видели — файлы из текущего каталога не загружаются. Так что будьте внимательны.Подключение JAR-библиотек в IDE NetBeans

Т.к. в данном курсе я использую для демонстрации NetBeans, то наверно будет неправильно не показать, как подлкючать JAR в этой среде. Как я уже упоминал, если появится время на другие IDE, я буду писать их в этой же статье. Но не думаю, что это будет в ближащее время.
Если вы посмотрите служебное окно «Projects», которое обычно находится слева, то вы в нем вы можете увидеть структуру вашего проекта, которая содержит раздел «Libraries». Я создал два проекта SayHello и UseHelloВ открытом файле UseHello.java в самой первой строке видно, что компилятор выдает в ней ошибку — как мы уже знаем, она говорит об отсутствии нужного класса. В принципе IDE позволяют подключать не только готовые JAR-файлы, но и проекты, но мы не будем использовать эту функцию (в данном случае специально). Чтобы подключить библиотеку из проекта SayHello нам для начала надо собрать этот проект через команду «Build». Результат можем увидеть в каталоге dist. В нем мы можем увидеть файл SayHello.jar. Предвидя вопрос — а можно поменять имя файла — для того, чтобы файл создавался с другим именем, надо исправлять конфигурационный файл nbproject/project.properties. Найти в нем опцию с именем dist.jar И поменять имя файла. В общем не очень удобно. Так что я обычно этого не делаю.
Теперь нам надо подключить готовый JAR-файл к нашему второму проекту UseHello. Сделать это можно несколькими способами.- Щелкнуть правой кнопкой мышки на пункте «Libraries» в структуре проекта и в нем выбрать пункт «Add JAR/Folder». После выбора файла его можно будет видеть под веткой «Libraries»
- Целкнуть правой кнопкой мышки на проекте UseHello в окне «Projects» и в выпадающем меню выбрать пункт (обычно самый нижний) «Properties». В открывшемся диалоговом окне выбрать слева пункт «Libraries» и в закладке «Compile» использовать кнопку «Add JAR/Folder».
Также предлагаю заглянуть на закладку «Run». В нем можно увидеть, что при запуске будет подключаться те библиотеки, которые подключаются при компиляции исходников («Classpath for Compiling Source»).
На этом можно закруглиться, хотя конечно же процесс познания бесконечен и вам наверняка встретится еще много интересной информации по использованию и созданию jar-файлов.
Исходный код для проектов под NetBeans можно скачать здесь. Библиотеку в них надо подключить самостоятельно. Так что можете потренироваться. Удачи.
И теперь нас ждет следующая статья: Многопоточность — первые шаги.
Как запустить java файлы
В прошлой публикации мы установили и настроили Sublime Text в качестве редактора для написания кода на Java.
- о компиляции и запуске Java-программ из консоли
- как выводить в консоль корректный русский текст
- способ отображения байт-кода
На первых порах начинающему программисту очень важно научиться выполнять необходимые действия минимальными средствами, чтобы:
Иметь представление, что происходит «под капотом»
Не быть зависимым от среды разработки
не превратиться в специалиста по нажиманию кнопок в инструментах для профессионалов
не оказаться беспомощным за их пределамиВам сейчас нужно максимально набить шишек, находясь в спартанских условиях, которые закалят и научат самостоятельно и оперативно решать возникающие проблемы. Это придаст уверенности и повысит вашу экспертность.
Есть такое понятие — профессиональный кругозор. Он важен для людей любой профессии. Программисты — не исключение. Если человек хочет стать настоящим разработчиком, обладающим фундаментальными знаниями, а не поверхностными и неструктурированными, то ему нужно изучать возможности языка последовательно и системно. Компиляция и запуск — это основа основ, это база, мимо которой никак нельзя пройти.
Компилировать и запускать программы на первых порах мы будем из консоли. Это важный навык, который используется программистами повсеместно.
1. Компиляция
Откройте в Sublime Text файл MyFirstApp.java, а затем запустите терминал с помощью горячих клавиш (у меня Ctrl + Alt + T), настроенных в прошлой статье. Обязательно проверьте, что терминал запустился в папке открытого файла.
Для компиляции воспользуемся уже знакомой утилитой javac (java compiler, компилятор java). Она нужна для преобразования Java-кода в язык виртуальной машины (байт-код).
В терминале пишем команду javac MyFirstApp.java:
Отсутствие каких-либо сообщений свидетельствует о том, что компилятор не нашел ошибок в нашем коде. Результатом его работы стал файл MyFirstApp.class.

Как мы уже знаем, MyFirstApp.class содержит байт-код. Для его исполнения воспользуемся утилитой java. Именно она стартует JVM, которая, в свою очередь, запустит класс MyFirstApp.
Пишем java MyFirstApp:
Программа отработала верно, выведя в консоль WORA.Обратите внимание, что необходимо указать не имя файла MyFirstApp.class, а имя класса. При этом писать какое-либо расширение не нужно. Утилита java принимает в качестве параметра именно имя класса, а не имя файла, где он находится.
3. Вывод байт-кода
Мы уже не первый раз упоминаем про байт-код, но до сих пор в глаза его не видели. Исправим эту ситуацию.
Для отображения (декомпиляции) байт-кода класса необходимо в консоли написать команду javap -c MyFirstApp.class:

Как правило, умение читать и понимать байт-код, вносить в него изменения для рядовых Java-разработчиков обычно не требуется — это очень специфические знания. Так что долго не сидите на этой теме.
Если обобщить все этапы, которые проходит программа перед запуском, то схематично их можно отобразить в виде схемы:

4. Запуск однофайловых программ
Чтобы посмотреть, как работает программа, необходимо выполнить два действия: компиляцию и запуск. Если эти шаги требуется исполнять часто, то данный процесс рано или поздно надоест. Хотелось бы его упростить.
Начиная с Java 11, однофайловые программы можно запускать не используя явно этап компиляции.
Удалите из папки class-файл, чтобы все было честно. И запустите программу без компиляции в явном виде, написав java MyFirstApp.java:
Мы только что запустили (и скомпилировали) файл с java-кодом без использования команды javac. При этом исходный код, в любом случае, компилируется в памяти (без создания на диске class-файла), а затем исполняется JVM.
Эта функция ограничена кодом, который хранится в одном файле. Она не сработает для программ, состоящих из двух и более файлов.
Теперь, когда вы умеете компилировать и запускать программу, можете поэкспериментировать с кодом MyFirstApp.java, внося в него изменения и смотреть, какие ошибки выдает компилятор.
5. Вывод кириллицы на консоль
Если вы используете Linux или macOS, то дальше можете не читать, т. к. ниже описаны проблемы и их решения для Windows. У вас таких проблем не будет!
Написанная нами программа выводит текст в консоли на английском языке. Как вы думаете, что произойдет, если попробовать вывести текст на русском?
Внесем исправления в код, написав: «Написано однажды, работает везде», и запустим…
> java MyFirstApp.java Р?апиС?Р°Р?Р? Р?Р?Р?Р°Р?Р?С?, С?Р°Р?Р?С?Р°Р?С? Р?Р?Р·Р?Р?Что-то пошло не так и вместо русского текста отобразились какие-то закорючки. Первое, что приходит в голову — это какая-то проблема с кодировкой. Нужно разобраться, в какой момент она возникает.
Посмотрим, какая кодировка у файла с нашим кодом. Она отображается в правом нижнем углу окна. Видим, что это UTF-8.

А какая кодировка используется в OC? Определить это можно разными путями. Например, в реестре (для его запуска в консоли напишите команду regedit) в Windows по следующему адресу можно посмотреть, чему равен параметр под названием ACP (ANSI code page):
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePageСодержимое реестра по указанному адресу:

У меня он имеет значение 1251. Это стандартная кодировка для русских версий Windows. У вас она может быть другой — все зависит от языка (кодировки) системы.
Есть еще один способ узнать кодировку, который подходит для любой ОС — это воспользоваться Java, поместив в наш класс две новых строки:
import java.nio.charset.Charset; public class MyFirstApp < public static void main(String[] args) < System.out.println(Charset.defaultCharset().displayName()); >>Вникать в то, что означает этот код мы не будем — наша задача лишь получить универсальным способом значение кодировки. Но если в двух словах, то в первой строке мы подключаем класс Charset, а в пятой выводим значение кодировки для ОС, воспользовавшись возможностями данного класса.
Запускаем и видим то же значение, что и в реестре.
> java MyFirstApp.java windows-1251Осталось узнать кодировку консоли. Для этого в ней напишем команду chcp.
> chcp Текущая кодовая страница: 866Она выдала 866. Это же число можно наблюдать и в реестре у параметра OEMCP (Original equipment manufacturer code page). Это DOS-кодировка, которая досталась нам в наследство.
Не удивительно, что Java не смогла корректно отобразить кириллический текст, когда используется столько кодировок в одной ОС.
Дело в том, что во время компиляции компилятор определяет кодировку исходного кода, опираясь на значение кодировки по умолчанию (на кодировку вашей ОС), а не на кодировку файла. В разных системах используются разные кодировки по умолчанию: в Windows — windows-1251, в Linux и macOS — UTF-8.
В Windows, ко всему прочему, еще и кодировка консоли не совпадает с кодировкой системы! Консоль по историческим причинам имеет кодировку Cp866 (видимо, в целях совместимости).
Затем JVM определяет кодировку по умолчанию во время запуска, используя системное свойство file.encoding. Значение для этого свойства устанавливается Java-машиной один раз при старте на основании данных, взятых из ОС.
Кодировка, используемая при выводе в консоль тоже системная, а не консоли. Если они не совпадают, то не видать нам корректного вывода кириллицы.
В итоге кодировку надо учитывать во время компиляции, во время запуска и во время вывода текста на консоль, например, при вводе с клавиатуры.
Давайте исправлять ситуацию.
У компилятора есть опция -encoding. Она позволяет принудительно указать кодировку исходника, чтобы он не определял ее, опираясь на кодировку системы. Как вы помните, файл имеет кодировку UTF-8. Соединив вместе все эти сведения, компиляцию и запуск следует выполнить так:
> javac -encoding utf8 MyFirstApp.java > java MyFirstApp Написано однажды, работает вездеПри компиляции (скрытой) и запуске однофайловых программ необходимо использовать другой способ (описанный выше не сработает):
> java -Dfile.encoding=UTF8 MyFirstApp.java Написано однажды, работает везде-Dfile.encoding — это уже параметр JVM, устанавливающий принудительно нужное значение кодировки в системное свойство file.encoding благодаря которому, как писалось выше, JVM определяет кодировку во время запуска.
От всех этих параметров и правил может закружиться голова. И все эти годы Java-разработчики жили и мучились с кодировками и ошибками, которые они вызывали в программах.
Но не прошло и 25 лет, как появилась хорошая новость. Начиная с Java 18, значение кодировки по умолчанию определяется не исходя из кодировки ОС, а исходя из того, что она является по умолчанию UTF-8. Никакие параметры больше не нужны. Убедимся в этом:
> java MyFirstApp.java Написано однажды, работает везде > javac MyFirstApp.java > java MyFirstApp Написано однажды, работает везде6. Создание JAVA_TOOL_OPTIONS
Для тех, кто сидит на Java меньше 18, придется использовать все параметры, указанные ранее — ни куда от них не деться. Но и тут есть выход.
Для устранения неудобства, связанного с ручным указанием кодировки, необходимо создать системную переменную JAVA_TOOL_OPTIONS (ранее мы уже имели дело с другой переменной — JAVA_HOME) со значением:
—Dfile.encoding=UTF8Не забудьте перезапустить консоль
Благодаря этой переменной кодировка будет устанавливаться автоматически при каждом запуске JVM. При этом в консоли будет отображаться сообщение (не обращайте на него внимание):
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8Пробуем скомпилировать и запустить с установленным JAVA_TOOL_OPTIONS:
> java MyFirstApp.java Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8 Написано однажды, работает везде > javac MyFirstApp.java Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8 > java MyFirstApp Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8 Написано однажды, работает везде7. Ввод с клавиатуры
Забежим немного вперед и рассмотрим ситуацию, когда требуется ввести с клавиатуры что-то на русском языке. Да, ввод мы еще не проходили, но мне совсем не хочется размазывать эту информацию по разным статьям. Пусть все, что связано с компиляцией и запуском, с кодировками, их проблемами и решением будет в одном месте.
Подключим к нашему коду класс Scanner, который позволит считывать, введенные с клавиатуры символы:
import java.util.Scanner; public class MyFirstApp < public static void main(String[] args) < System.out.println("Написано однажды, работает везде"); Scanner console = new Scanner(System.in); System.out.print("Введите свое имя: "); System.out.println(console.nextLine()); >>Запустив программу и введя с клавиатуры имя, видим, что консоль отобразит вместо текста .
> java MyFirstApp.java Написано однажды, работает везде Введите свое имя: Максим .Это означает, что кодировка консоли и кодировка, которую использует Scanner, не совпадают.
Проблему можно решить, указав явно cp866 — это кодировка консоли:замените Scanner console = new Scanner(System.in); на Scanner console = new Scanner(System.in, "cp866");Снова запустим программу:
> java MyFirstApp.java Написано однажды, работает везде Введите свое имя: МАКСИМ ШШШШ ИИИИ МАКСИМ ШШШШ ИИИИКак видим, текст отображается корректно.
Если после всего проделанного, что я описал выше, у вас вместо русского текста выводится пустая строка, то необходимо в консоли ввести chcp 866 и заново запустить программу.
Заключение
В этой статье мы научились компилировать и запускать java-программы, нашли способ побороть проблему с выводом кириллических символов в консоль, а также лучше стали понимать, как работают все эти механизмы.
Ниже в таблице перечислены ключевые моменты статьи.
Название;Описаниеjavac MyFirstApp.java;компиляции java-файла java MyFirstApp;запуск Java-программы javap -c MyFirstApp.class;вывод байт-кода java MyFirstApp.java;компиляция (скрытая) и запуск однофайловых программ javac -encoding utf8 MyFirstApp.java;компиляция программы с указанием кодировки исходника java -Dfile.encoding=UTF8 MyFirstApp.java;компиляция (скрытая) и запуск однофайловых программ с явным указанием кодировки JAVA_TOOL_OPTIONS;системная переменная для хранения кодировки для JVM Scanner sc = new Scanner(System.in, «cp866»);решение проблемы с выводом русских символов через явное указание кодировки консоли
- Про UTF-8 по умолчанию, начиная с Java 18
- Про кодировки и их проблемы
- Запуск однофайловых программ: 1, 2
