Загрузка...

JAR в Java

Упакуйте скомпилированные файлы классов в jar, чтобы отправлять и запускать их одним файлом. В Pack.java оставьте публичный класс Pack, из main выведите packed, скомпилируйте через javac Pack.java, затем создайте Pack.jar командой jar --create --file Pack.jar Pack.class. Запустите java -cp Pack.jar Pack — на экране будет packed. Во второй демонстрации печатается shipped и используется jar с Main-Class, чтобы работала команда java -jar Pack.jar. Этот урок про упаковку jar, а не про проверку JUnit с @Test и не про вывод accessor у Records.

Один jar, запуск через -cp

Откройте Pack.java. Имя публичного класса оставьте Pack. Удалите остаточные assert JUnit из SumCheck, демо Records из Card, конвейеры Streams из Pipe и обходы lambda из Cue, если они заслоняют тему jar. Учебный файл — крошечная программа с main, которую вы упаковываете, а не тестовый класс с assertEquals.
В Pack.main выведите одно слово:
System.out.println("packed");
Сначала компиляция:
javac Pack.java
Когда скобки сходятся, javac молчит и пишет Pack.class. Затем создайте jar из файла класса:
jar --create --file Pack.jar Pack.class
Запустите класс из jar в classpath:
java -cp Pack.jar Pack
На экране packed. Для этой учебной формы вы не запускаете java Pack из рассыпанных классов. Вы просите JVM загрузить Pack из Pack.jar.

Pack jar -cp prints packed

java
public class Pack {
    public static void main(String[] args) {
        System.out.println("packed");
    }
}

Пройдите путь один раз. javac Pack.java создаёт Pack.class. jar --create --file Pack.jar Pack.class кладёт этот класс в Pack.jar. java -cp Pack.jar Pack запускает Pack.main. println пишет packed. Никакой @Test не выполняется. Никакой t.name() не выполняется. Никакой stream().map не выполняется.
Пока смотрите на папку, произнесите правило для новичка: скомпилируйте исходник, создайте jar из файла .class, запустите с -cp и именем публичного класса. На этой странице не придумывайте проверки JUnit внутри Pack.java. Не считайте jar вторым компилятором — javac по-прежнему строит класс; jar только упаковывает.
Если из оставшегося файла SumCheck всё ещё виден зелёный отчёт JUnit, переключитесь на Pack и оставьте вывод packed. Если jar не находит Pack.class, снова скомпилируйте перед созданием архива.

Jar с Main-Class, запуск через -jar

Оставьте тот же публичный класс Pack. Измените вывод, чтобы вторую учебную форму было легко назвать:
System.out.println("shipped");
Скомпилируйте снова:
javac Pack.java
Создайте jar, который записывает класс входа:
jar --create --file Pack.jar --main-class Pack Pack.class
Запустите через launcher jar:
java -jar Pack.jar
На экране shipped. --main-class Pack сообщает jar, какой публичный класс содержит main. java -jar читает эту запись и запускает её. Для каждой учебной формы держите один ясный вывод, чтобы слово на экране легко называлось.

Pack jar -jar prints shipped

java
public class Pack {
    public static void main(String[] args) {
        System.out.println("shipped");
    }
}

Пройдите путь один раз. javac Pack.java обновляет Pack.class. jar --create --file Pack.jar --main-class Pack Pack.class упаковывает класс и сохраняет имя входа. java -jar Pack.jar запускает Pack.main. На экране shipped. Две демонстрации — две учебные формы. Сначала докажите запуск -cp, который ждёт packed. Затем докажите запуск -jar, который ждёт shipped. В обеих формах общие публичный класс Pack и привычка jar --create --file.
Если вы запустите java -jar Pack.jar на jar без --main-class, launcher падает, потому что класс входа не записан. Такой неудачный jar — не второй учебный файл. Второй учебный файл включает --main-class Pack.

Привычки JAR

Создание, запуск по classpath, Main-Class и запуск -jar остаются отдельными шагами для новичка.

📊 JAR habits for Pack

Привычка Форма Проверка для новичка
Создание jar --create --file Pack.jar Pack.class кладёт Pack.class в Pack.jar
Запуск classpath java -cp Pack.jar Pack для первой демо экран показывает packed
Main-Class jar --create --file Pack.jar --main-class Pack Pack.class сохраняет класс входа Pack
Запуск jar java -jar Pack.jar для второй демо экран показывает shipped
Сначала компиляция javac Pack.java обновите .class перед пересозданием jar

JAR — это не JUnit и не Records

JUnit помечал проверки @Test и сравнивал ожидаемые значения. Records держали компактные компоненты, которые выводили через accessor. JAR упаковывает файлы классов для отправки и запуска. Не смешивайте эти три роли в одном учебном файле сегодня.
packed здесь — слово экрана первой демо из Pack.main при запуске jar через -cp. Это не assertEquals(5, ...) и не t.name() из record Tag. Когда оставшийся файл SumCheck всё ещё говорит об ожидаемой 5, оставьте это историей и сохраните строку вывода Pack.
Без javac нет свежего Pack.class для упаковки. Без jar --create нет Pack.jar. Без пути -cp или -jar с Main-Class вы не показали формы запуска этого урока. Держите аннотации JUnit вне этой страницы. Держите заголовки record вне этой страницы.

Проверка папки на последней опциональной странице

После успешного создания выведите список папки. Должны быть вместе Pack.java, Pack.class и Pack.jar. Отредактируйте исходник, сохраните, выполните javac Pack.java, пересоздайте jar той же привычкой create, затем снова запустите. Устаревший jar может спрятать изменённый вывод, если после правки пропустить create.
Если jar жалуется на отсутствующий class-файл, сначала компиляция. Если java -cp Pack.jar Pack ничего не печатает, убедитесь, что main всё ещё вызывает println. Если java -jar Pack.jar говорит, что нет main manifest attribute, пересоздайте с --main-class Pack.
Не вставляйте @Test из SumCheck в Pack. Не вставляйте record Tag из Card вместо упаковки. Опциональная работа JAR — архив файлов классов, который вы запускаете через -cp или -jar.

Конец опционального пути

Вы можете оставить публичный класс Pack, вывести packed, скомпилировать через javac Pack.java, создать Pack.jar командой jar --create --file Pack.jar Pack.class, выполнить java -cp Pack.jar Pack, затем вывести shipped, пересоздать с --main-class Pack и запустить java -jar Pack.jar. Таблица разделяет create, classpath, Main-Class и запуск jar. Это последняя опциональная страница Java на карте курса.
Демо Pack держите для ясной пары по упаковке. Файлы JUnit SumCheck держите вне этой страницы, когда тренируете jar. Файлы Records Card — вне этой страницы при тренировке jar. Не придумывайте новые опциональные темы на этой странице — карта заканчивается здесь. Эти привычки — контрольная точка опционального пути. Когда первый запуск показывает packed или второй — shipped, JAR выполнил свою работу в этом уроке.
Последний проход по папке: один публичный Pack, совпадающий .class, Pack.jar на месте, команда create помнится, запуск -cp или -jar соответствует открытой демо, без ожидания Scanner, без обязательного assertion. Скомпилируйте, пересоздайте jar и ещё раз запустите открытую демо. Если экран всё ещё показывает packed или shipped, форма JAR надёжна и опциональный путь Java завершён. На каждое чтение держите одну ясную привычку упаковки, чтобы каждый проход учил ту же карту.

🧠 Проверьте Свои Знания

Готов к Началу

Проверьте Свои Знания

Бросьте себе вызов с помощью этой интерактивной викторины и узнайте, насколько хорошо вы понимаете тему

❓
5
Вопросы
🎯
70%
Для Прохождения
♾️
∞
Время
🔄
∞
Попытки

📝 Инструкции

  • Внимательно прочитайте каждый вопрос
  • Выберите лучший ответ на каждый вопрос
  • Вы можете пересдавать тест столько раз, сколько захотите
  • Ваш прогресс будет показан вверху