====== Gradle ======
===== Сведения =====
:!: Сведения
Градл это про выполнение задач т.н. **tasks**, они предоставляются разными плагинами. Стандартный набор в пакете "Core Plugins", интересует категория "Utility".\\
# Инициализация проекта, в директории создаются служебные файлы и т.д.
gradle init --type java-application
===== Использование =====
==== ShadowJar ====
Есть несколько вариантов, один из это подключить плагин, в файле "build.gradle.kts" добавляем\\
**plugins { id("com.github.johnrengelman.shadow") }**\\
[[https://romanmarkunas.com/build/2018/11/13/0007-build-gradle-fat-jars/|Тут есть описание]]\\
:!: Типичный скрипт для сборки
Тут модификация shadowJar для того чтобы в имя файла не добавлялся постфикс "-all"\\
Так же можно явно задавать имя артефакту\\
Так же таска для публикации в nexus\\
plugins {
application
java
id("com.github.johnrengelman.shadow")
id("com.coditory.manifest")
id("maven-publish")
}
dependencies {
(зависимости могут варьироваться)
implementation(Deps.toml)
implementation(Deps.opencsv)
}
application {
mainClass.set("com.gmware.applications.(тут какой то класс)")
}
group = "com.gmware.applications"
version = "0.0.0.1-SNAPSHOT"
// При желании, так можно получить хэш последнего коммита, для записи в манифест
fun getGitCommit(): String {
val result = StringBuilder()
val process = ProcessBuilder("git", "rev-parse", "HEAD").start()
process.inputStream.reader(Charsets.UTF_8).use {
result.append(it.readText())
}
process.waitFor()
return result.toString().trim()
}
tasks {
"shadowJar"(com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar::class) {
archiveClassifier.set("")
manifest {
attributes(mapOf(
"Main-Class" to application.mainClass,
"Version" to version,
"Module-version" to getGitCommit()
))
}
}
}
publishing {
repositories {
maven {
url = uri("${properties["nexusUrl"]}/myApp-snapshot")
credentials {
username = "${properties["nexusUser"]}"
password = "${properties["nexusPassword"]}"
}
}
}
publications {
register("mavenJava", MavenPublication::class) {
artifact(tasks["shadowJar"])
}
}
}
Избавится от постфикса "-all" в имени джарки\\
параметр "jar.archiveClassifier.set("")"\\
# Вариант с таской shadowJar
tasks {
"shadowJar"(com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar::class) {
archiveClassifier.set("")
manifest {
attributes(mapOf(
"Main-Class" to application.mainClass,
"Version" to version,
"Module-version" to getGitCommit()
))
}
}
}
# Таска с Jar
fun configureJar(jar: Jar) {
jar.setManifestClassPathToRuntimeDependencies()
jar.doFirst {
jar.manifest {
attributes["Main-Class"] = application.mainClass
attributes["Module-Name"] = jar.archiveBaseName.get()
attributes["Module-Commit-Date"] = getCommitDate()
attributes["Created-By"] = System.getProperty("java.version")
}
}
jar.archiveFileName.set("my-name.jar")
jar.archiveClassifier.set("")
}
:!: Еще пример shadowJar
plugins {
id("application")
id("com.github.johnrengelman.shadow")
}
application {
mainClass.set("com.gmware.applications.myMainClass")
}
dependencies {
implementation(projects.utils)
implementation(projects.common)
(...)
implementation(projects.limitsmanagerLoader)
}
fun getGitCommit(): String {
requireExecutionPhase()
val result = StringBuilder()
val process = ProcessBuilder("git", "rev-parse", "HEAD").start()
process.inputStream.reader(Charsets.UTF_8).use {
result.append(it.readText())
}
process.waitFor()
return result.toString().trim()
}
tasks {
"shadowJar"(com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar::class) {
archiveClassifier.set("")
manifest {
attributes(mapOf(
"Main-Class" to application.mainClass,
"Module-version" to getGitCommit()
))
}
}
}
:!: Пример
plugins {
application
java
shadow
id("com.coditory.manifest")
id("maven-publish")
}
dependencies {
implementation(projects.utils)
...
}
application {
mainClass.set("com.gmware.applications.")
}
group = "com.gmware.applications."
version = "0.0.0.1-SNAPSHOT" // Перед сборкой установить версию
tasks {
"shadowJar"(com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar::class) {
archiveClassifier.set("")
manifest {
attributes(mapOf(
"Main-Class" to application.mainClass
))
}
}
}
publishing {
repositories {
maven {
url = uri("${properties["nxsUrl"]}/my-repo")
credentials {
username = "${properties["nxsUsr"]}"
password = "${properties["nxsPasswd"]}"
}
}
}
publications {
register("mavenJava", MavenPublication::class) {
artifact(tasks["shadowJar"])
}
}
}
==== Запуск из консоли ====
Сборка и загрузка в репозиторий\\
./gradlew -PnexusUrl=https://url/repository -PnexusUser= -PnexusPassword= :module-name:publish
:!: Разное
# Уровень языка с которым компилируется код
#
java {
sourceCompatibility = JavaVersion.VERSION_1_8 (максимальная версия java)
targetCompatibility = JavaVersion.VERSION_1_8 (минимальная версия java)
}
# Информация о классе
javap -verbose HelloWorldApp.class