Содержание

Gradle

Сведения

:!: Сведения

Градл это про выполнение задач т.н. tasks, они предоставляются разными плагинами. Стандартный набор в пакете «Core Plugins», интересует категория «Utility».

  # Инициализация проекта, в директории создаются служебные файлы и т.д.
gradle init --type java-application

Использование

ShadowJar

Есть несколько вариантов, один из это подключить плагин, в файле «build.gradle.kts» добавляем
plugins { id(«com.github.johnrengelman.shadow») }

Тут есть описание

:!: Типичный скрипт для сборки

Тут модификация 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.<module_name>")
}
 
group = "com.gmware.applications.<repo_group_name>"
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=<user> -PnexusPassword=<passwd> :module-name:publish
:!: Разное
  # Уровень языка с которым компилируется код
  # 
java {
    sourceCompatibility = JavaVersion.VERSION_1_8 (максимальная версия java)
    targetCompatibility = JavaVersion.VERSION_1_8 (минимальная версия java)
}
 
  # Информация о классе
javap -verbose HelloWorldApp.class