Как запустить программу из нескольких скомпилированных файлов из консоли

Обновлено: 07.07.2024

Это далеко не все пробемы, которые могут возникнуть при наличии программы "монстра". Поэтому при разработке программ рекомендуется их разбивать на куски, которые функционально ограничены и закончены. В этом значительно помогает сам язык C++, предоставляя свой богатый синтаксис.

Для того, чтобы вынести функцию или переменную в отдельный файл надо перед ней поставить зарезервированное слово extern. Давайте для примера создадим программу из нескольких файлов. Сначала создадим главную программу, в которой будут две внешние процедуры. Назовем этот файл main.c:

Теперь создаем два файла, каждый из которых будет содержать полное определение внешней функции из главной программы. Файлы назовем f1.c и f2.c:

После этого процесс компиляции программы с помощью gcc будет выглядеть несколько иначе от описанного в "Шаг 1 - Компиляция программ на языке C/C++".

Компилировать можно все файлы одновременно одной командой, перечисляя составные файлы через пробел после ключа -c:

Или каждый файл в отдельности:

В результате работы компилятора мы получим три отдельных объектных файла:

Чтобы их собрать в один файл с помощью gcc надо использовать ключ -o, при этом линкер соберет все файлы в один:

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

На экране появится результат работы:

Теперь, если мы изменим какую-то из процедур, например f1():

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

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

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

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

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

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

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

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

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

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

Для работы с несколькими классами нужен classpath. Он похож на файловую систему, в которой содержатся классы, а функцию папок выполняют пакеты (packages). На этом этапе стоит задуматься об отделении файлов исходного кода от скомпилированных файлов. Как правило исходники находятся в каталоге src, а скомпилированные классы — в bin. Например, у нас есть класс Box и класс BoxMachine , в котором содержится метод main . Класс Box : Он находится в пакете src, это необходимо зафиксировать. Класс BoxMachine : Этот класс также находится в пакете src. В методе main он создает пять объектов класса Box разного размера и выводит в консоль информацию о них. Чтобы скомпилировать эту группу классов, необходимо из главного каталога (в котором лежат папки src и bin) использовать команду javac с аргументами: -d — флаг, после которого следует указать расположение, куда попадут скомпилированные классы. Это очень удобно, так как перекладывать, например, 1000 классов — очень трудоемкий процесс. bin — название папки. ./src/* — расположение исходных файлов. * указывает, что необходимо скомпилировать все файлы. Теперь скомпилированные классы появились в папке bin. Для их запуска используется команда java из той же директории, также с аргументами: -classpath — флаг, после которого следует указать местоположение скомпилированных классов. Java будет искать главный класс и все сопутствующие именно в этой директории. ./bin — название папки, в которой находятся скомпилированные классы. BoxMachine — название главного класса. Как и в первом случае, не следует указывать .class , так как это название класса, а не файла. Вывод:

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

Чтобы программу было легко переносить и запускать, можно собрать скомпилированные классы в jar-файл — архив классов. Главное отличие от zip или rar-архивов — наличие файла манифеста. В этом манифесте указывается главный класс, который будет запускаться при выполнении jar-файла, classpath, а также много дополнительной информации. В главном каталоге создадим файл manifest.mf. Его содержимое будет следующим: main-class указывает класс, который содержит метод main и будет выполнен при запуске. class-path — путь к скомпилированным классам или дополнительным библиотекам. Настало время собрать настоящую программу без IDE с помощью команды jar: -cmf — флаг, после которого следует указать путь к файлу манифеста. manifest.mf — путь к манифесту. box-machine.jar — название выходного jar-файла. -С — флаг, после которого указывается путь к скомпилированным классам. . — путь, куда будет помещен jar-файл. В нашем случае —это главный каталог. Теперь можно запустить. Запуск jar-файлов выполняется также с помощью команды java, но следом нужно указать флаг -jar : он говорит о том, что запускается Jar-файл, а второй аргумент — путь к jar -файлу, включая расширение: Вывод:

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

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

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

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

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

Maven

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

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

Gradle

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

Заключение

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

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

Привет, я использовал IDE, но теперь мне нужно запустить и скомпилировать из командной строки.

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

Вы знаете, как все скомпилировать с помощью javac?

Это должно сделать это (могут потребоваться дополнительные элементы пути к классам через переключатель командной строки -cp ):

Но если ваш процесс сборки станет более сложным (а так оно и будет!), Вам следует изучить возможность использования Apache Ant для сборки автоматизация.

Вам следует использовать такие инструменты сборки, как Maven или Ant для таких задач.

На начальных этапах, когда проект не очень сложен, вы можете использовать следующую строку для компиляции с соответствующим путем к классам (как предлагает @Michael):

javac Support/*.java Me/*.java Wrapers/*.java

Если вам действительно нужно просто использовать javac и стандартные команды UNIX, вы можете сделать это:

Во многих случаях Ant бывает излишним. Просто используйте файл BAT, если вы работаете в Windows, или сценарий оболочки (файл sh), если вы работаете в Linux. Вы можете создать текстовый файл, содержащий все ваши команды javac, и просто запустить этот файл, когда захотите построить.

Например, я использую следующий файл bat для создания одного из своих приложений:

Чтобы скомпилировать команду Выполнить ниже [она сохранит все файлы классов в папке классов]

javac -d классы Поддержка / *. java Me / *. java Wrapers / *. java

** Примечание: сначала необходимо создать папку классов.

Чтобы запустить приложение Java, выполните команду ниже

Замените mainfile_name своим основным файлом.

Настоящий ответ - javac -d (места, где должны быть созданы и размещены классы) -sourcepath (источник пакета в корне) -cp (путь к классам зависимостей, который снова может быть папкой классов, в которой классы создаются и хранятся) full полное имя файла java.

Я компилирую несколько файлов в каталоге (javac *.java), но у меня есть проблема, когда я пытаюсь это сделать:

Я получаю ошибки компиляции, говоря, что javac не может найти символ объекта.

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

Основная программа находится в папке с драйверами.

this is a screenshot of the folders

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

ОТВЕТЫ

Ответ 1

Javac документация содержит всю необходимую информацию. Однако было бы полезно использовать Ant или Maven для построения командной строки.

Эта страница служит хорошим примером использования первого javac, а затем Ant для создания простого проекта.

Вот пример проекта и как его можно скомпилировать с помощью javac.

Древовидная структура проекта такова:

Существует два специальных каталога - build для хранения скомпилированных классов и src для размещения исходных файлов (может быть в разных подкаталогах - пакетах).

Следующая команда компилирует весь проект и помещает результат в каталог build .

-sourcepath src указывает каталог src как место, где весь источник может быть найден компилятором. Опция -d build сообщает компилятору, куда поместить скомпилированные файлы.

Опция src/**/*.java сообщает компилятору, какие файлы нужно компилировать. В этом конкретном случае он сообщает javac посмотреть два уровня вниз и выбрать все *.java на этом уровне.

Если существуют файлы *.java на разных уровнях, необходимо указать список файлов. Для этого можно создать такой список как внешний файл и передать эти файлы, как в опции ввода для javac .

Вот как это можно сделать в Linux/Unix:

Вышеупомянутая команда создает файл source.txt, содержащий полные пути для найденных *.java файлов. В этом примере он содержит:

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

Обратите внимание, что @source.txt указан в конце, который сообщает компилятору, где искать список исходных файлов. Также обратите внимание, что параметр -sourcepath можно опустить.

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

Как можно заметить, каталог build теперь содержит скомпилированные файлы классов в соответствующих пакетах.

И если вы хотите запустить его, предположив, например, что Driver имеет метод main , следующая программа выполняет программу.

Обратите внимание, что в Unix используется разделитель файлов : (двоеточие), для Windows его можно изменить на ; (точка с запятой).

Ответ 2

Я компилирую несколько файлов в каталоге (javac *.java)

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

и т.д. для любого вашего макета пакета/каталога. Каждая командная строка javac будет скомпилировать все файлы в названном каталоге и все .java файлы в других пакетах/каталогах, от которых он зависит, которые еще не скомпилированы или устарели.

См. документацию инструмента для javac .

Ответ 3

1) Используйте командную строку, чтобы указать все файлы для компиляции

2) Создайте файл со всеми именами файлов (вывод из поиска, возможно) и запустите javac @argfile

Читайте также: