Как я уже неоднократно упоминал, использование IDE быстро развращает начинающих программистов. Оконные средства разработки берут на себя многие операции, поэтому программист попросту не понимает всего, что происходит у него на экране монитора. Многие события проходят мимо него незамеченными. Так что, как и раньше, продолжаю работать в командной строке, благо, пока это не обременяет.
- Один проект — одна директория. Чтобы не было путаницы, называть её стоит так же, как проект.
- В этой директории две папки: src и bin (или source/build(classes)) — как кому больше нравится.
- В этой же директории будут находиться и все остальные файлы, связанные с проектом (музыка, картинки, файл с описанием, какие-то библиотеки).
C:JavasrcTest.java
Полный путь о скомпилированных файлов:
C:JavabinTest.class
Куда интереснее рассмотреть проект побольше, к тому же работающий.
2. Проект CrazyTetris.java, лежащий в пакете md.leonis.tetris:
04 — HelloWorld, main метод, запуск через консоль — Уроки Java для начинающих
C:JavasrcmdleonistetrisCrazyTetris.java и
C:JavabinmdleonistetrisCrazyTetris.class соответственно
Так как этот проект не маленький, использует графику и музыку, а так же имеет зависимость от сторонних библиотек, вот ещё некоторые пути:
C:Javalib. — тут подключаемые библиотеки
C:Javaresources. — графика и музыка
C:Javareadme.txt — файл с описанием
C:Javamanifest.mf — файл манифеста
Дерево каталогов для наглядности:
Исходный код проекта CrazyTetris:
При виде всего этого уже становится нехорошо, но в компании Sun о решении позаботились.
1. Компиляция.
Забегая вперёд скажу, что как и прежде, для компиляции я использую пакетные файлы. То есть, чтобы не писать гигантский код, я разнёс все данные по переменным.
Посмотрите сами, насколько громоздкими получаются команды:
Не дай Бог вводить всё это вручную каждый раз.
SET PROJECT=CrazyTetris
SET PACKAGE=md.leonis.tetris
SET FOLDER=mdleonistetris — это значение вычисляется автоматически
SET CLASSPATH=bin;libcommons-logging-1.2.jar;libbasicplayer3.0.jar;libmp3spi1.9.5.jar;libjl1.0.1.jar;libtritonus_share-0.3.6.jar
SET XLINT=-Xlint
Вызов компилятора (упрощённая форма):
javac [настройки] [исходные файлы]
Квадратные скобки означают, что оба набора параметров являются необязательными.
Вернёмся к проекту:
javac -classpath %CLASSPATH% -d bin -sourcepath src src%FOLDER%%PROJECT%.java %XLINT% 2>>errors.txt
Без переменных команда была бы такой:
javac -classpath bin;libcommons-logging-1.2.jar;libbasicplayer3.0.jar;libmp3spi1.9.5.jar;libjl1.0.1.jar;libtritonus_share-0.3.6.jar -d bin -sourcepath src srcmdleonistetrisCrazyTetris.java 2>>errors.txt
Урок по Java 63: Как компилировать и запускать классы через коммандную строку, плюс classpath
Внимательный читатель уже заметил, что подключаются какие-то библиотеки. Они необходимы для проигрывания mp3 музыки в этой конкретной игре и принадлежат проигрывателю BasicPlayer, а у него имеются свои зависимости.
Без этих библиотек команда заметно сокращается:
javac -classpath bin -d bin -sourcepath src srcmdleonistetrisCrazyTetris.java 2>>errors.txt
- -classpath путь: здесь указываются пути до уже скомпилированных файлов. Пути можно указывать абсолютные (C:Java. ), а можно и относительные. Сюда же, через точку с запятой можно добавить подключаемые библиотеки.
Для компиляции в этом проекте ключ -classpath вообще можно не указывать, но при запуске его забывать нельзя понадобится. - -d путь: папка, куда будут складироваться откомпилированные файлы проекта. В самом начале мы её определили: bin. Её необходимо создать заранее. Все остальные вложенные папки компилятор построит самостоятельно.
- -sourcepath путь: это путь к исходным файлам проекта. В нашем случае src. Если в проекте только один файл, то этот ключ можно не указывать вообще. В нашем же случае, при отсутствии этого ключа компилятор упадёт с ошибкой:
«А если в проекте несколько файлов?» — Спросит внимательный читатель. И правда, исходных файлов может быть несколько. Компилятор в качестве разделителей понимает пробелы. Так же, можно использовать звёздочку, например *.java даст команду на компиляцию всех файлов. Но в этом отношении не стоит разгоняться, компилятор автоматически переведёт в байт-код все исходники, задействованные в программе.
2. Запуск программы.
Компилятор проверяет файлы с исходным кодом (*.java) и переводит их в байт-код. Его не запустить, подобно exe файлам. Зато файлы в формате байт-кода (class) могут исполняться в виртуальной машине Java, причём, одинаково хорошо на всех компьютерах и операционных системах, где эта машина установлена.
Конечно, это утопия, одинаковый код в Windows, Linux, MAC OS, Solaris в любом случае потребует соблюдения правил, принятый в файловых системах этих операционок. Например, доступ к некоторым путям открыт не везде и не каждому. Так же внешний вид оконных приложений может отличаться. Таких мелочей много.
java [настройки] имяКласса [аргументы]
java [настройки] -jar имяФайла [аргументы]
Синтаксис с ключом -jar позволяет запускать на выполнение jar файлы.
Вместо java.exe можно использовать оконную версию javaw.exe. Впрочем, она ничего не выводит в командную строку, а в нашей ситуации это минус.
Вот реальный пример:
java -classpath %CLASSPATH% %PACKAGE%%PROJECT% 2>>errors.txt
Тут уже без classpath не обойтись, как мы видим.
Обратите внимание на полное имя скомпилированного файла (класса): md.leonis.tetris.CrazyTetris
Это название пакета, потом через точку пишется имя файла без расширения.
Если добавим расширение — сразу же получим ошибку: Error: Could not find or load main class md.leonis.tetris.CrazyTetris.class
Хотя, эта ошибка очень распространённая, достаточно только написать не ту букву в пути.
2>>errors.txt в конце строки просит консольный вывод сохранять все найденные ошибки в файле errors.txt.
Если их мало, то все они умещаются на экране, а когда их сыпется несколько сотен — первые сообщения могут исчезнуть, как в случае Far Manager.
Для расширения кругозора можно этот ключик немного поменять.
Например, записывать не только ошибки, но и весь консольный вывод программы в файл log.txt. При этом используется дозапись данных:
>>log.txt 2>>»:
>log.txt
3. Создание JAR архива.
Если в программе всё устраивает — самое время заняться её публикацией. Разумно все классы разместить в одном архиве — легче передавать и меньше места.
Java и тут позволяет обойтись встроенные утилитами.
Тема создания jar файлов и манифестов очень обширная, не буду в одной теме забивать этим голову. Рассмотрим самый простой случай:
jar.exe -cfm %PROJECT%.jar manifest.mf -C bin .
Ключ -cmf: это команда создать (c) jar файл (f) и внести в него данные из файла-манифеста (m). Последовательность тут очень важна. Другой вариант вызова:
jar.exe -cmf manifest.mf %PROJECT%.jar -C bin .
После имени файла создаваемого архива в первом примере идёт название файла-манифеста, а следом всё то, что мы в него запакуем.
Нас интересует содержимое папки bin (без неё самой).
Можно было бы включить а архив музыку и картинки, но доставать их оттуда, особенно музыку, достаточно накладно.
Лучше держать их отдельно.
Немного по файлу-манифесту:
Без него Java не разберётся какой именно файл в архиве нужно запускать. И уж тем более, виртуальная машина не знает ни о каких зависимостях.
Содержимое файла manifest.mf:
Manifest-Version: 1.0
Created-By: 1.7.0_72 (Oracle Corporation)
Main-Class: md.leonis.tetris.CrazyTetris
Class-Path: lib/commons-logging-1.2.jar lib/basicplayer3.0.jar lib/mp3spi1.9.5.jar lib/jl1.0.1.jar lib/tritonus_share-0.3.6.jar
- Manifest-Version: версия манифеста. Не меняем
- Created-By: версия вашей JDK
- Main-Class: полный путь к главному (исполняемому) файлу проекта
- Class-Path: пути, по которым можно найти подключаемые библиотеки.
4. Создание zip архива.
А вот теперь соберём всё, что относится к проекту в одном архиве:
7z.exe a -r -tzip -mx9 %PROJECT%.zip %PROJECT%.jar readme.txt resources lib
В этой команде архиватор 7z получает задание запаковать файлы, включая и содержимое поддиректорий в формат zip с максимальной степенью сжатия. Результирющий архив получит имя CrazyTetris.zip, и в него будут помещены файлы: CrazyTetris.jar, readme.txt, а так же содержимое папок resources и lib.
- compile.bat: компиляция и запуск в случае успеха
- run.bat: просто запуск на выполнение
- jar.bat: создание jar архива
- zip.bat: создание zip архива
_settings.bat
compile.bat
call _settings.bat SET FOLDER= IF NOT «%PACKAGE%»==»» SET FOLDER=%PACKAGE:.=% IF NOT «%PACKAGE%»==»» SET PACKAGE=%PACKAGE%. IF NOT «%FOLDER%»==»» SET FOLDER=%FOLDER% IF NOT EXIST .bin md .bin IF EXIST .bin%FOLDER%*.class DEL .bin%FOLDER%*.class IF EXIST errors.txt DEL errors.txt ECHO Compiling project %PACKAGE%%PROJECT%. REM ******************** REM команд(ы) компиляции REM ******************** javac -classpath %CLASSPATH% -d bin -sourcepath src src%FOLDER%%PROJECT%.java %XLINT% 2>>errors.txt ECHO. :wait IF NOT EXIST errors.txt GOTO wait FOR %%i IN (errors.txt) DO SET fsize=%%~zi IF NOT %fsize%==0 GOTO error ECHO Compiling succesful. Launching Java code.
REM ********************************** REM запуск откомпилированной программы REM ********************************** java -classpath %CLASSPATH% %PACKAGE%%PROJECT% 2>>errors.txt FOR %%i IN (errors.txt) DO SET fsize=%%~zi IF NOT %fsize%==0 GOTO error IF EXIST errors.txt DEL errors.txt GOTO end :error ECHO The compiler found the following errors: ECHO —————————————- ECHO. TYPE errors.txt ECHO. PAUSE :end
call _settings.bat ECHO Launching Java code. IF EXIST errors.txt DEL errors.txt IF NOT «%PACKAGE%»==»» SET PACKAGE=%PACKAGE%. ECHO OFF REM ********************************** REM запуск откомпилированной программы REM ********************************** java -classpath %CLASSPATH% %PACKAGE%%PROJECT% 2>>errors.txt ECHO. FOR %%i IN (errors.txt) DO SET fsize=%%~zi IF NOT %fsize%==0 GOTO error IF EXIST errors.txt DEL errors.txt GOTO end :error ECHO JVM found the following errors: ECHO ——————————- ECHO. TYPE errors.txt ECHO. PAUSE :end
Приятной работы
У этого подхода есть недостаток — привязка в Windows. Альтернативы:
ANT >>>
MAVEN >>>
Размещено в Мой креатив
Просмотров 9467 Комментарии 2
Всего комментариев 2
Комментарии
Leonis, советую посмотреть в сторону Ant. Отличный сборщик. Конфиг прописал в xml для каждого проекта и собирай на счастье. Сам сначала собирал батником, потом задолбало. Перешел на Ant.
В итоге компилировал, собирал, подписывал jar’ки и запускал тесты быстро и удобно.
Это всё прелюдия к «муравью». Он у меня уже скачан, установлен и только усталость не позволяет перевести проекты на его рельсы прямо сейчас. К тому же, на этих примерах укажу недостатки, они не идеальны, например, в плане переносимости в Linux — эти пакетные файлы работать как надо не будут. Ant это универсальный сборщик, не зависящий от платформы и используемых IDE.
Источник: tv-games.ru
Компиляция и выполнение java программы с командной строки
Создадим в любом текстовом редакторе файл HelloWorld.java и содержимым:
class HelloWorld < public static void main(String[] args) < System.out.println(«Hello World!»); >>
Создаем байт-код на основании исходного текста программы, командой:
# Проверить версию компилятора javac -version ## Если javac не найден, убедитесь, что в системной переменной Path указан путь до JDK # Скомпилировать исходник в байт-код javac HelloWorld.java ## Получаем файл HelloWorld.class с байт-кодом # Посмотреть байт-код можно командой javap -v HelloWorld.class # Запустить программу по имени класса в текущей директории java HelloWorld
Когда мы из командой строки вызываем javac, java, javap — то вызываются javac.exe, java.exe, javap.exe из директории bin вашего JDK в Windows 10.
Аргументы
Метод main может принимать массив строк переменной длины. Напишем и протестируем программу выводящую в стандартный поток вывода переданные в метод main аргументы при запуске программы.
public class HelloWorld < public static void main(String[] args) < System.out.println(«Hello World!»); for (int i = 0; i < args.length; i++) < System.out.println(args[i]); >> >
javac HelloWorld .java java HelloWorld arg0 arg1 arg2 arg4 Hello World! arg0 arg1 arg2 arg4
Источник: pc-zver.ru
Запускать программы на Java из командной строки
Программирование на Java очень гибкое и надежное. Мы также можем запускать его программы из командной строки. Для этого на вашем компьютере должна быть установлена Java, прежде чем вы сможете продолжить.
В этом руководстве мы обсудим, как запускать программы Java из командной строки.
Во-первых, нам нужен каталог bin, из которого установлен JDK. Как правило, его можно найти по следующему пути.
«C:Program FilesJavajdk1.8.0_91bin»
Теперь мы открываем командную строку и переходим в каталог, содержащий файл, который нам нужно запустить. Здесь нам нужно указать путь, чтобы система могла найти необходимые программы и инструменты JDK.
set path=%path%;C:Program FilesJavajdk1.5.0_09bin
Теперь убедитесь, что ваш файл Java должен иметь расширение .java .
yourfilename.java
Сначала мы компилируем файл .java в файл .class с помощью команды javac .
javac yourfilename.java
Наконец, мы можем запустить файл. Результат отображается в окне командной строки.
java yourfilename
Если при выполнении команды javac возникает какая-либо ошибка, это может быть связано с неправильным указанием пути.