问题描述
很快我将发布一个新版本的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
]
}
<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/
上的 jars 没有改变:它仍然是 thread-2.8.0.jar
(尽管在 build/libs
中正确),我不是知道为什么。
如何在不更改工件 ID 的情况下重命名 jar 以使其适用于 publish
和 publishToMavenLocal
?
这是完整的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()
}
}
解决方法
这是不可能的。
Maven 本地存储库中 JAR 的名称始终为 artifactId-version.jar
(或者,如果您有分类器,则为 artifactId-version-classifier.jar
)。这是一个固定的Maven结构。