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 | Наборы исходников для упаковки; пустое значение означает все нетестовые наборы. | нет |
from | JAR других участников рабочего пространства, которые распаковываются в данный JAR; каждый из них собирается заранее: from { project("x") }. Их манифесты отбрасываются; их зависимости добавляются в экспортируемый и публикуемый POM этого проекта. | нет |
resources | Дополнительные файлы: пути или new { from = …; into = … }. | нет |
manifest | Дополнительные атрибуты META-INF/MANIFEST.MF. | нет |
manifestFile | Файл манифеста вместо сгенерированного. | — |
excludes | Исключаемые записи: шаблон с / * ? [ ] — glob по пути; имя с точками — префикс пакета. | нет |
options.entrypoint | Main-Class. | jvm.main |
options.compress | Сжимать записи. | true |
options. | Добавлять атрибуты 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, excludes | Glob-шаблоны путей по исходникам. |
Jvm.JavadocJar | Назначение |
|---|---|
sources | Наборы исходников для документирования; пустое значение означает все нетестовые наборы. |
groups | Группы пакетов: заголовок и список пакетов. |
links | URL внешней документации. |
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" }
}
}
}| Свойство | Назначение | По умолчанию |
|---|---|---|
from | JAR-артефакты с кодом приложения; пустое значение означает все объявленные JAR или JAR с классами проекта. | нет |
name | Имя каталога и скриптов запуска. | ключ артефакта |
entrypoint | Главный класс. | jvm.main |
defaultJvmArgs | Параметры JVM в скриптах, после jvm.flags. | нет |
executableDir | Каталог для скриптов. | "bin" |
contents | Дополнительные файлы в корне, в той же форме, что и ресурсы набора исходников. | нет |
options.unixStartScript, options. | Генерировать соответствующий скрипт. | true |
options.archives | "zip" и/или "tar" (gzip). | нет |
dependsOn | Артефакты, которые собираются первыми. | нет |
| Результат | Путь |
|---|---|
| Дерево установки | . |
| Архивы | . |
elide runзапускает установленное дерево с параметрами JVM из скриптов.- Скрипты также читают
JAVA_OPTSи<NAME>_OPTS(sample-app→SAMPLE_APP_OPTS). - POSIX-скрипт следует по символическим ссылкам на себя; в Windows запускайте скрипт напрямую или через
PATH. name,version(при архивации) и каждоеintoдолжны быть допустимыми именами файлов на всех платформах: без/,\,:*?"<>|, управляющих символов, точки или пробела в конце и без имён устройств Windows, таких какNUL. Недопустимые имена прерывают сборку до того, как она что-либо запишет.
Участники рабочего пространства используют Jvm.Jar соседнего проекта через project("core"); см.
Рабочие пространства.