Перейти к содержимому

Сборка JAR

Создавайте, просматривайте и распаковывайте JAR с помощью elide jar, собирайте JAR, JAR с исходниками и Javadoc, а также готовые к запуску дистрибутивы приложений в проекте Elide.

На этой странице

Elide создаёт и читает JAR-файлы напрямую с помощью elide jar и собирает их как артефакты проекта.

Создание, просмотр и распаковка

Параметры jar указываются после --:

elide jar -- --create --file app.jar -C out .                              # create
elide jar -- --list --file app.jar                                         # list
elide jar -- --extract --file app.jar --dir extracted                      # extract
elide jar -- --create --file app.jar --main-class com.example.Main -C out . # executable JAR
elide jar -- -help

Компиляция и создание JAR

elide javac --jar target/app.jar -- src/Main.java src/Util.java
elide javac --jar target/app.jar --manifest src/MANIFEST.MF -- src/Main.java

Артефакты проекта

amends "elide:project.pkl"
import "elide:Jvm.pkl" as Jvm

artifacts {
  ["app"] = new Jvm.Jar {
    name = "app"
    options {
      entrypoint = "com.example.Main"
    }
  }
}

elide build записывает результат в .dev/artifacts/jar/<name>/. JAR содержит классы и ресурсы всех нетестовых наборов исходников.

Jvm.Jar

СвойствоНазначениеПо умолчанию
nameИмя файла; "app" и "app.jar" дают app.jar.ключ артефакта
sourcesНаборы исходников для упаковки; пустое значение означает все нетестовые наборы.нет
fromJAR других участников рабочего пространства, которые распаковываются в данный JAR; каждый из них собирается заранее: from { project("x") }. Их манифесты отбрасываются; их зависимости добавляются в экспортируемый и публикуемый POM этого проекта.нет
resourcesДополнительные файлы: пути или new { from = …; into = … }.нет
manifestДополнительные атрибуты META-INF/MANIFEST.MF.нет
manifestFileФайл манифеста вместо сгенерированного.—
excludesИсключаемые записи: шаблон с / * ? [ ] — glob по пути; имя с точками — префикс пакета.нет
options.entrypointMain-Class.jvm.main
options.compressСжимать записи.true
options.defaultManifestPropertiesДобавлять атрибуты Implementation-*.true
mainПри упаковке не читается; используйте options.entrypoint.—
dependsOnАртефакты, которые собираются первыми.нет
artifacts {
  ["app"] = new Jvm.Jar {
    sources { "main" }
    excludes {
      "com.example.internal"   // a package and its subpackages
      "**/*.proto"             // a path glob
    }
    manifest {
      ["Implementation-Vendor"] = "Example"
    }
    resources {
      "LICENSE.txt"
      new { from = "config"; into = "META-INF/config" }
    }
  }
}

JAR с исходниками и Javadoc

artifacts {
  ["sources"] = new Jvm.SourceJar {
    classifier = "sources"
    excludes { "**/internal/**" }
  }
  ["javadoc"] = new Jvm.JavadocJar {
    windowTitle = "Example API"
    links { "https://docs.oracle.com/en/java/javase/25/docs/api/" }
    groups {
      ["Core"] { "com.example.core" }
    }
  }
}
Jvm.SourceJarНазначение
sourcesНаборы исходников для упаковки; пустое значение означает все нетестовые наборы.
classifierВставляется перед расширением (app-sources.jar).
includes, excludesGlob-шаблоны путей по исходникам.
Jvm.JavadocJarНазначение
sourcesНаборы исходников для документирования; пустое значение означает все нетестовые наборы.
groupsГруппы пакетов: заголовок и список пакетов.
linksURL внешней документации.
excludesШаблоны того, что не документируется.
windowTitle, docTitleЗаголовки окна и документа.
generator"auto" (по умолчанию): Dokka, если среди исходников есть Kotlin, иначе javadoc. "javadoc" или "dokka" выбирает один из них.

Исходники с Kotlin документируются с помощью Dokka вместо javadoc, включая соседний код на Java; generator = "javadoc" документирует только файлы Java. Dokka работает в отдельном процессе JVM. Elide загружает его JAR из Maven при первой сборке Javadoc JAR для Kotlin и кеширует их в локальном репозитории Maven, поэтому первой сборке нужен доступ к сети. При каждой сборке Dokka также загружает списки пакетов по своим ссылкам на JDK, стандартную библиотеку и links; --offline пропускает эти запросы. Dokka читает sources, links и excludes (исключённый пакет и его подпакеты пропускаются); groups и заголовки применяются только к javadoc, и Elide выдаёт предупреждение, если заголовки заданы для Dokka.

Готовые к запуску дистрибутивы приложений

Jvm.JvmApplication — готовое к запуску дерево каталогов, как в плагине application для Gradle: JAR среды выполнения в lib/, скрипты запуска в bin/ и необязательные архивы.

artifacts {
  ["dist"] = new Jvm.JvmApplication {
    from { "app" }
    entrypoint = "com.example.Main"
    defaultJvmArgs { "-Xmx512m" }
    contents {
      new { from = "config"; into = "etc" }
    }
    options {
      archives { "zip"; "tar" }
    }
  }
}
СвойствоНазначениеПо умолчанию
fromJAR-артефакты с кодом приложения; пустое значение означает все объявленные JAR или JAR с классами проекта.нет
nameИмя каталога и скриптов запуска.ключ артефакта
entrypointГлавный класс.jvm.main
defaultJvmArgsПараметры JVM в скриптах, после jvm.flags.нет
executableDirКаталог для скриптов."bin"
contentsДополнительные файлы в корне, в той же форме, что и ресурсы набора исходников.нет
options.unixStartScript, options.windowsStartScriptГенерировать соответствующий скрипт.true
options.archives"zip" и/или "tar" (gzip).нет
dependsOnАртефакты, которые собираются первыми.нет
РезультатПуть
Дерево установки.dev/artifacts/install/<name>/
Архивы.dev/artifacts/distributions/
  • elide run запускает установленное дерево с параметрами JVM из скриптов.
  • Скрипты также читают JAVA_OPTS и <NAME>_OPTS (sample-app → SAMPLE_APP_OPTS).
  • POSIX-скрипт следует по символическим ссылкам на себя; в Windows запускайте скрипт напрямую или через PATH.
  • name, version (при архивации) и каждое into должны быть допустимыми именами файлов на всех платформах: без /, \, :*?"<>|, управляющих символов, точки или пробела в конце и без имён устройств Windows, таких как NUL. Недопустимые имена прерывают сборку до того, как она что-либо запишет.

Участники рабочего пространства используют Jvm.Jar соседнего проекта через project("core"); см. Рабочие пространства.

Была ли эта страница полезной?