Gradle - java插件中的jar文件名

Posted

技术标签:

【中文标题】Gradle - java插件中的jar文件名【英文标题】:Gradle - jar file name in java plugin 【发布时间】:2011-10-09 17:51:52 【问题描述】:

我第一次尝试使用 Gradle。我正在尝试使用 maven java 项目来编译和创建 jar 文件。它正在编译和创建 build/libs 目录中的 jar 文件为

主干-XXXVERSION-SNAPSHOT.jar

我正在从这个 maven java 项目的主干目录运行 gradle 构建文件。

我想在jar文件名中获取项目名称(例如:project1),类似于

project1-XXXVERSION-SNAPSHOT.jar

在 build/libs 目录中。 请提出建议。

【问题讨论】:

注意,如果您使用 Spring Boot,您可能需要mind the bootJar task instead。 【参考方案1】:

目录结构如下:

trunk
˪ build
  ˪ libs
    ˪ project1-1.0-SNAPSHOT.jar 
˪ build.gradle

build.gradle 中包含以下内容:

apply plugin: 'java'
apply plugin: 'maven'

archivesBaseName = 'project1'
version = '1.0-SNAPSHOT'
group = 'example'
     

这将生成正确的 ZIP、POM 和 JAR。


另外,尝试设置:

archivesBaseName = 'project1'

或(已弃用):

jar.baseName = 'project1'

【讨论】:

只是为了保持讨论的完整性:第一个版本确实有效,它还可以生成正确的 zip、ma​​ven 档案等。我也觉得它更优雅。我将编辑我的答案以提供完整的脚本。 是的,这也有效,但我没有看到存储库中生成的 POM 和 JAR。在声明“存储库”后,我正在使用“uploadArchives”将其发布到 maven artifactory。 archivesBaseName 有效,但 jar.baseName 可能会出现问题,因为您的源 jar 可能未正确命名。 baseName 已被弃用(Gradle 6.2):docs.gradle.org/6.2.2/dsl/… 它已被 archivesBaseName 取代。 在 kotlin 中,archiveBaseName 是 project.base.archivesBaseName,从 gradle 6.2 开始【参考方案2】:

默认项目名称取自存储项目的目录。您应该为构建正确设置项目名称,而不是显式更改 jar 的命名。目前这在build.gradle 文件中是不可能的。相反,您必须在根目录中创建一个settings.gradle 文件。这个settings.gradle 文件应该包含这一行:

rootProject.name = 'project1'

【讨论】:

非常感谢您的解决方案。它对我有用。还发现我们可以对 jar 使用“doFirst”,它也可以。那么实现这一目标的最佳方法是什么。 “我们可以将 doFirst 用于 jar”是什么意思? jar 是一个“普通”的 gradle 任务,可以通过 doLast 和 doFirst 使用自定义操作闭包来增强它。 使用这个 sn-p 还可以确保您的其他 zip、ma​​ven 档案等具有正确的命名,因为它们都取决于您的项目名称 @koppor project.name 在 build.gradle 中是只读的很长一段时间。如前所述,您必须使用如上所示的 settings.gradle 文件来更改项目名称。 @DaniloTommasina 您可以在单个 settings.gradle 文件中为根项目和每个子项目指定项目的名称。【参考方案3】:

我最近迁移到 gradle 4.6(从 3.something)和

jar 
    baseName = 'myjarname'

停止工作,gradle 根据文件夹名称命名我的 jar。

所以我切换到了archivesBaseName = 'myjarname',它可以工作。

也许这对其他人也有帮助。

【讨论】:

【参考方案4】:

如果你有一些 submobule,你可以在 build.gradle (for jar) 中使用

configurations 
    jar.archiveName = 'submodule-jar.jar'

【讨论】:

【参考方案5】:

在 Kotlin DSL 中你也可以使用:

tasks.jar 
    archiveFileName.set("app.jar")

借助 Spring boot 和 Kotlin DSL,您可以使用:

tasks 
    bootJar 
        archiveFileName.set("app.jar")
    

【讨论】:

在 Spring Boot 上将此添加到 build.gradle 的末尾,但不起作用。 至少在 Kotlin DSL 中这是可行的。我已经调整了解决方案。【参考方案6】:

目前使用 Kotlin 作为 Gradle DSL。以下陈述对我有用:

tasks.withType<AbstractArchiveTask> 
    setProperty("archiveFileName", "hello-world.jar")

它也适用于 Spring Boot 可执行 jar。

如果您想保留版本号:

tasks.withType<AbstractArchiveTask> 
    setProperty("archiveBaseName", "hello-world")

它会产生类似hello-world-1.2.3.jar的东西

【讨论】:

【参考方案7】:

如果您使用较新的 Gradle 版本,baseNamearchiveName 现在将被弃用。相反,使用类似的东西

jar 
   archivesBaseName = 'project1'
   archiveVersion = '1.0-SNAPSHOT'

【讨论】:

【参考方案8】:

如果你想在 jar 文件名后面加上一个日期,你可以这样做:

jar 
    baseName +='_' +new java.text.SimpleDateFormat("dd_MM_yyyy").format(new java.util.Date())
    println(baseName) // just to verify

导致&lt;basename&gt;_07_05_2020.jar

【讨论】:

【参考方案9】:

您必须删除 build.gradle 文件中的“版本”标签!

【讨论】:

以上是关于Gradle - java插件中的jar文件名的主要内容,如果未能解决你的问题,请参考以下文章

没有可执行jar的Spring Boot 2 Gradle插件

Android Gradle 插件Gradle 依赖管理 ⑧ ( implementation fileTree 引入jar文件依赖 | implementation files 引入文件依赖 )

使用 Palantir Gradle 插件构建 Docker 容器时找不到 .jar 文件

想要使用 Gradle 将 repo 中的 .ebextensions (AWS Beanstalk) 目录复制到 Java jar 文件的根目录中

如何把springboot插件删除干净

Android Gradle 插件Gradle 构建机制 ① ( 空白工程 Gradle 构建文件 | IntelliJ IDEA 工程构建文件 | Android Studio 工程构建文件 )