Как скомпилировать с помощью bash-скрипта мультипакетный Java-проект, использующий JAR-файл - PullRequest
0 голосов
/ 18 мая 2019

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

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

У меня есть 3 папки (пакеты)

  1. client: классы клиентского процесса
  2. сервер: классы серверного процесса
  3. sharedClasses: классы полезны как для клиента, так и для сервера (например, User.java)

Также я использую Gson в качестве jar-файла, который необходим в пакете sharedClasses

  • например, в sharedClasses есть класс Message, который использует Gson для преобразования в строку json

Я много пытался создать сценарий, который компилирует все это, но каждый раз, когда я получаю «ClassNotFoundException» или что-то в этом роде: онлайн-руководства по пониманию пути к классам и т. Д. Довольно плохие.

Может кто-нибудь сказать мне, как сделать мой сценарий и объяснить, почему все делается так, как они? Спасибо

1 Ответ

0 голосов
/ 19 мая 2019

Переменные пути являются концепцией во всех операционных системах Unix и Windows. Они не являются изобретением Java, но Java основывает на них свои собственные пути к классам и путям модулей.

Значение переменной пути - это просто строка, содержащая список местоположений файлов, разделенных двоеточием (:) в Unix или точкой с запятой (;) в Windows.

Самая распространенная переменная пути это просто PATH. (Я полагаю, что в Windows каноническое имя переменной - Path, но переменные среды не чувствительны к регистру в Windows, поэтому в большинстве случаев ее можно назвать PATH.)

Когда вы пытаетесь выполнить программу в командной строке, указав имя команды без компонентов каталога, операционная система проверяет каждое расположение файла в PATH по порядку и для каждого расположения, которое является каталогом, Система будет искать совпадение там. Первое совпадение - это то, что используется операционной системой.

Java заимствует эту концепцию для пути к классам. В первые дни Java это было точно так же: если ваш classpath был /home/giulio:/opt/libraries, и вы искали класс с именем com.example.ConnectionFactory, Java искала бы скомпилированный файл с именем com/example/ConnectionFactory.class в / home / giulio а затем в /opt/libraries.

Вскоре пути к классам было разрешено содержать файлы, которые являются сжатыми архивами классов, в дополнение к каталогам. Ваш путь к классу может содержать /home/giulio:/opt/libraries/foolib.jar, и в этом случае Java сначала проверит наличие запрошенного класса в / home / giulio, поскольку это каталог, а если это не удастся, то будет искать соответствующую запись в / opt / library / Архивный файл foolib.jar. (Zip-файлы также приемлемы, и на самом деле .jar-файл на самом деле представляет собой просто zip-файл с несколькими специальными записями, специфичными для Java.)

Итак, если вы хотите указать Java, чтобы в определенных местах искать библиотеки, укажите их в classpath.

Например, при компиляции кода клиента:

projectroot=`dirname "$0"`
javac -classpath "$projectroot"/sharedClasses/classes \
    -d "$projectroot"/client/classes \
    "$projectroot"/client/src/*.java

Когда вы запускаете код:

java -classpath "$projectroot"/sharedClasses/classes:"$projectroot"/client/classes \
    edu.acme.giulio.client.Main
...