【问题标题】:Java/Groovy/Gradle : How can I change the jar name (but not artifact-id) for publication?Java/Groovy/Gradle:如何更改 jar 名称(但不是 artifact-id)以进行发布?
【发布时间】:2021-09-19 10:56:03
【问题描述】:

很快我将发布一个新版本的my library,它由几个模块组成。对于这个版本,我现在使用的是 Gradle 7,所以我正在考虑更改一些我认为需要修复的内容:

这是库声明(例如,thread 模块):

group: 'com.intellisrc', name: 'thread', version: '2.8.0'

发布时,它会生成一个名称为:thread-2.8.0.jar 的 jar,我希望它是:intellisrc-thread-2.8.0.jar,因为它更具描述性(除此之外,它可以正常工作)。

要修复它,一种选择是更改artifact-id,因此声明将变为:

group: 'com.intellisrc', name: 'intellisrc-thread', version: '2.8.0'

但我不希望更改它,因为消费者必须更新它并且可能会造成混淆。

我想如果我可以更改 jar 名称和发布文件(pom.xml、module.json),它应该可以工作。

到目前为止,我能够使用以下方法更改它在build/libs/ 中生成的 jar 文件名:

jar {
    archiveBaseName.set("intellisrc-" + project.name)
}

publishing内部:

publishing {
    publications {
       mavenJava(MavenPublication) {
           artifactId project.name
           from components.java
           
           pom {
               ...
               archivesBaseName = "intellisrc-" + project.name
               ...
           }
       }
    }
}

默认情况下,pom-default.xml 中没有文件名。我关注了this recommendation,并补充道:

pom {
    properties = [
        "jar.finalName" : archivesBaseName + "-" + project.version
    ]
}

pom-default.xml文件中添加:

  <properties>
    <jar.finalName>com.intellisrc.core-2.8.0-SNAPSHOT</jar.finalName>
  </properties>

但是在module.json 中名称并没有改变:

...
      "files": [
        {
          "name": "thread-2.8.0.jar",
          "url": "thread-2.8.0.jar",
          "size": 92799,
          ...

有没有办法从 gradle 更改 module.json 中的这些值?我可以考虑解码json文件并替换它的值,但我希望有更好的方法来做到这一点。

当我执行gradle publishToMavenLocal 时,.m2/repository/com/intellisrc/ 上安装的 jar 没有改变:它仍然是 thread-2.8.0.jar(尽管在 build/libs 中正确),我不知道为什么。

如何在不更改 artifact-id 的情况下重命名 jar,使其与 publishpublishToMavenLocal 一起使用?

这是完整的build.gradle

plugins {
    id 'groovy'
    id 'java-library'
    id 'maven-publish'
    id 'signing'
}

def currentVersion = "2.8.0-SNAPSHOT"

allprojects {
    group = groupName
    version = currentVersion
    repositories {
        mavenLocal()
        mavenCentral()
    }
}

/**
 * Returns project description
 * @param name
 * @return
 */
static String getProjectDescription(String name) {
    String desc = ""
    switch (name) {
        case "core":
            desc = "Basic functionality that is usually needed " +
                    "in any project. For example, configuration, " +
                    "logging, executing commands, controlling " +
                    "services and displaying colors in console."
            break
        case "etc":
            desc = "Extra functionality which is usually very " +
                    "useful in any project. For example, monitoring " +
                    "Hardware, compressing or decompressing data, " +
                    "store data in memory cache, manage system " +
                    "configuration in a multithreading safe environment " +
                    "(using Redis as default), simple operations with " +
                    "bytes, etc."
            break
        case "db":
            desc = "Manage databases, such as MySQL, SQLite, " +
                    "BerkeleyDB, Postgresql. Create, store and " +
                    "perform CRUD operations to data without having " +
                    "to use SQL (a light-weight implementation as " +
                    "alternative to Hibernate)."
            break
        case "net":
            desc = "Classes related to networking. For example, " +
                    "sending emails through SMTP, connecting or " +
                    "creating TCP/UDP servers, getting network " +
                    "interfaces and perform netmask calculations, etc."
            break
        case "serial":
            desc = "Manage serial communication easily. It uses " +
                    "JSSC library on the background."
            break
        case "web":
            desc = "Create restful HTTP (GET, POST, PUT, DELETE, etc) " +
                    "or WebSocket application services. Manage JSON " +
                    "data from and to the server easily. It is build " +
                    "on top of Spark-Java Web Framework, so it is " +
                    "very flexible and powerful, but designed to be " +
                    "elegant and easier to use."
            break
        case "crypt":
            desc = "Offers methods to encode, decode, hash and encrypt " +
                    "information. It is built using the BountyCastle " +
                    "library and simplifying its usage without reducing " +
                    "its safety."
            break
        case "thread":
            desc = "Manage Tasks (Threads) with priority and watches " +
                    "its performance. You can create parallel processes " +
                    "easily, processes which are executed in an interval, " +
                    "as a service or after a specified amount of time. " +
                    "This module is very useful to help you to identify " +
                    "bottlenecks and to manage your main threads in a " +
                    "single place."
            break
        case "term":
            desc = "Anything related to terminal is in this module " +
                    "(except AnsiColor, which is in core). It uses JLine " +
                    "to help you create interactive terminal (console) " +
                    "applications easily. It also contains some tools " +
                    "to display progress with colors."
            break
        case "img":
            desc = "Classes for using Images (BufferedImage, File, FrameShot) " +
                    "and non-opencv related code, trying to keep dependencies " +
                    "to a minimum. It also includes common geometric operations."
            break
        case "cv":
            desc = "Classes for Computer Vision (extension to OpenCV). " +
                    "Convert image formats, crop, rotate images or draw " +
                    "objects on top of them. It simplifies grabbing images " +
                    "from any video source."
            break
    }
    return desc
}

subprojects {
    apply plugin: 'groovy'
    apply plugin: 'java-library'
    apply plugin: 'maven-publish'
    apply plugin: 'signing'

    dependencies {
        //def groovyVer = "2.5.14"
        def groovyVer = "3.0.7"
        def groovyExt = "3.0.8.7"
        def spock = "2.0-groovy-3.0"
        def junit = "4.13.2"

        boolean isDev = currentVersion.contains("SNAPSHOT")
        def deps = ["org.codehaus.groovy:groovy-all:${groovyVer}"]
        if(isDev) {
            deps.each { api it }
        } else {
            deps.each { compileOnly it } //Link it so we can choose version
        }
        // Always include groovy-extend and expose it to consumers:
        api "com.intellisrc:groovy-extend:${groovyExt}"
        testImplementation "org.spockframework:spock-core:${spock}"
        testImplementation "junit:junit:${junit}"
    }
    jar {
        archiveBaseName.set("intellisrc-" + archiveBaseName.get())
    }
    java {
        withSourcesJar()
        withJavadocJar()
    }
    // Used to publish to MavenLocal
    publishing {
        repositories {
            maven {
                def releasesRepoUrl = "https://oss.sonatype.org/service/local/staging/deploy/maven2"
                def snapshotsRepoUrl = "https://oss.sonatype.org/content/repositories/snapshots"
                url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl
                credentials {
                    username = ossrhUsername
                    password = ossrhPassword
                }
            }
        }
       publications {
           mavenJava(MavenPublication) {
               artifactId project.name
               from components.java

               pom {
                   name = projectName + " : " + project.name.capitalize() + " Module"
                   description = getProjectDescription(project.name) ?: projectDescription
                   url = projectURL
                   inceptionYear = projectSince
                   archivesBaseName = "intellisrc-" + project.name
                   properties = [
                        "jar.finalName" : archivesBaseName + "-" + project.version
                   ]

                   licenses {
                       license {
                           name = 'GNU General Public License v3.0'
                           url = 'https://www.gnu.org/licenses/gpl-3.0.en.html'
                           distribution = 'repo'
                       }
                   }
                   developers {
                       developer {
                           id = authorId
                           name = authorName
                           email = authorEmail
                       }
                   }
                   scm {
                       url = projectURL
                       connection = "scm:git:${projectURL}.git"
                       developerConnection = "scm:git:${projectDevURL}"
                   }
               }
           }
       }
    }

    signing {
        required {
            !version.endsWith("SNAPSHOT")
        }
        sign publishing.publications.mavenJava
    }

    tasks.named('test') {
        // Use JUnit Platform for unit tests.
        useJUnitPlatform()
    }
}

【问题讨论】:

  • 不要。这样做会破坏很多工具。

标签: java maven gradle groovy maven-publish


【解决方案1】:

这是做不到的。

Maven 本地存储库中的 JAR 名称始终为 artifactId-version.jar(或者,如果您有分类器,则为 artifactId-version-classifier.jar)。这是一个固定的 Maven 结构。

【讨论】:

  • 这就是finalName评论的意思,rignt?:finalName modifies the name of the artifact created in the local target directory of the project. However, irrespective of using finalName, Maven will still install conventionally named artifacts in the repository.。好的,那我就保持原样。
猜你喜欢
  • 2018-09-30
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2016-12-24
  • 2013-04-16
  • 1970-01-01
  • 2019-04-13
  • 1970-01-01
相关资源
最近更新 更多