如何使用 maven-publish 和 artifactory-gradle-plugin 生成 maven-metata.xml?

     2023-02-26     13

关键词:

【中文标题】如何使用 maven-publish 和 artifactory-gradle-plugin 生成 maven-metata.xml?【英文标题】:How do I generate maven-metata.xml with maven-publish and the artifactory-gradle-plugin? 【发布时间】:2015-05-03 12:25:24 【问题描述】:

我在 groovy 中编写了一个 Gradle 插件并使用 Gradle 构建它。我有一个本地网络 Artifactory 服务器,我使用 Gradle Artifactory 插件和 Gradle 中的 maven-publish 插件发布结果。我有另一个 Gradle 构建脚本,它依赖于这个插件作为依赖项。如果我用特定版本列出我的依赖项,我就能够让这一切正常工作。我尝试使用 maven 版本范围(例如'[1.0,2.0)'),但这失败了,说它找不到 maven-metadata.xml。我检查了 Artifactory,果然,它不存在。我需要做什么来生成它,最好是在插件的构建过程中?

这是我的自定义 gradle 插件的 build.gradle 文件:

buildscript 
    repositories 
        maven 
            url "$artifactory_contextUrl/plugins-release"
            credentials 
                username = "$artifactory_user"
                password = "$artifactory_password"
            
        
    
    dependencies 
        classpath group: 'org.apache.directory.studio', name: 'org.apache.commons.io', version: '2.4'
        classpath group: 'org.jfrog.buildinfo', name: 'build-info-extractor-gradle', version: '2.0.9'
    


plugins 
    id 'com.jfrog.artifactory' version '3.0.1'


apply plugin: 'groovy'
apply plugin: 'maven-publish'

artifactory 
    contextUrl = "$artifactory_contextUrl"
    publish 
        repository 
            repoKey = 'plugins-snapshot-local'
            username = "$artifactory_user"
            password = "$artifactory_password"
            maven = true
        
        defaults 
            publications ('mavenJava')
        
    
    resolve 
        repository 
            repoKey = 'libs-release'
            username = "$artifactory_user"
            password = "$artifactory_password"
            maven = true
        
    


dependencies 
    compile gradleApi()
    compile localGroovy()


publishing 
    publications 
        mavenJava(MavenPublication) 
            from components.java
        
    

我搜索了 Gradle、Artifactory 和 Maven 文档以了解 maven-metadata.xml 以及如何生成和部署。它是什么是有道理的,我可能可以手动构建一个,但我找不到任何具体解释如何使用 maven-publish 插件或 artifactory-gradle-plugin 在 Gradle 中自动生成它的东西。我不想手动更新文件,因为这会破坏自动化工作,我不想切换到 mvn,因为我已经在 Gradle 上投入了很多。

【问题讨论】:

【参考方案1】:

groupId 必须添加到 publications 部分。实施后,maven-metadata.xml 文件将发布到工件存储库。

publishing 
    publications 
        mavenJava(MavenPublication) 
            groupId = 'com.group'
        
    

【讨论】:

【参考方案2】:

我遇到了同样的问题,结果发现 Artifactory 存储库不是 Maven 存储库,而是通用存储库。我花了很长时间才注意到,因为我没有创建存储库,并且我认为它是一个 Maven 存储库,否则部署/解析工作正常。 切换到 Maven 存储库后,发布时会生成 maven-metadata.xml。

【讨论】:

【参考方案3】:

maven-metadata.xml 应该由 Artifactory 处理。 您在 Artifactory 中的本地存储库布局是什么?

【讨论】:

这是 plugins-release-local 和 plugins-snapshot-local 的默认布局,它是 maven-2-default。我还应该提到它是 Artifactory 的开源版本,所以我实际上认为它可能是一个需要 Pro 或更高版本的功能。 好吧,开枪。我提到的第二个项目收到了一个 maven-metadata.xml 文件。我将尝试使用 groupId 的第一个,看看是否会有所不同。 果然添加了groupId导致Artifactory生成了一个maven-metadata.xml文件。 我不同意。构建工具需要检查存储库中是否已存在 maven-metadata.xml。如果它存在,它需要下载它并用新信息更新它,但要附加到它上面。如果它不存在,那么它需要生成一个新的。为您生成此文件的不是工件存储库管理器。当然,如果有计划任务,它可以做到这一点,但实际上必须由构建和部署工具来处理。【参考方案4】:

接受的答案是正确的。我投了赞成票。但是,也有这个警告。

我有一个多模块项目,所以我将使用“allprojects”。如果您有一个整体/单一 jar ( :( ).. 您可以使用与“allprojects”不同的范围。

这里的关键是你设置了“组”。 (以及版本)

所有项目

apply plugin: 'java-library'
apply plugin: 'maven-publish'
apply plugin: 'com.jfrog.artifactory'


repositories 
    jcenter()


group = 'com.group'

version = '1.0-SNAPSHOT'

好的,现在 build.gradle(在我的多模块项目中不是 root-build.gradle)(但 root build.gradle 中的值会相似)

下面是我的非根 build.gradle 文件的全部内容

// the "name" variable inside the publications/myPublicationName block is getting overwritten.  so create a variable here to capture the name (as the artifactid)
def artifactIdForPublicationBlockHolder = "$name"


dependencies 
    testImplementation group: 'junit', name: 'junit', version: junitVersion


println("hey.here.read.me")
println("group=$group")
println("version=$version")
println("artifactId=$name")


publishing 
    publications 
        myCustomPublicationName(MavenPublication) 
            // groupId, artifactId and version have defaults, so do not arbitrarily override : https://docs.gradle.org/current/userguide/publishing_maven.html#publishing_maven:publications

//your value below could be slightly different, look for *.jar after you do ./gradlew. build (note, this path value (of "./") is relative to the non-root-build.gradle path, not the overall root-build.gradle
"./build/libs/$artifactIdForPublicationBlockHolder-$version.jar"
        
    

正如链接所说,您将获得默认值

// groupId、artifactId 和 version 有默认值,请勿随意覆盖:https://docs.gradle.org/current/userguide/publishing_maven.html#publishing_maven:publications

你只需要设置这些值,就像我在上面展示的那样

group = 'com.group' 
version = '1.0-SNAPSHOT'

代码

通过磨床几次后

myCustomPublicationName(MavenPublication)

我发现自定义设置的东西越少越好。并且更喜欢使用默认值...这意味着在 build.gradle 中设置驱动默认值的值...而不是设置 myCustomPublicationName(MavenPublication)

改变里面的值

myCustomPublicationName(MavenPublication)

应该保留(恕我直言)当默认设置不适合您时。这通常是极少数的时间。

注意:

“$name”位于我的非根目录顶部的 gradle.build 正在由我的多模块项目的目录结构填充。

我不知道它在非多模块中是如何工作的,因为我从不编写单体。

我的代码中的settings.gradle 示例:

rootProject.name = 'com.me.myproject-rootProjectName'

include ':source:java:mydatalayer'
include ':source:java:mybizlogic'
include ':source:java:mydomain'

以下奖励报价:

此外,模块化分解是软件的关键组成部分 质量。如果你有一个紧密耦合的系统,当你调整一个 组件,整个系统崩溃。如果您从 API 的角度考虑, 模块间界限清晰,因此您可以维护和改进 一个模块而不影响其他模块。

大规模重构被证明是困难的。如果你建造一些东西作为 单体系统,然后发现你在整个系统中都有重复的代码 地方,并且你想正确地重构它,你将拥有一个巨大的 工作。相反,如果你把它写成组件,但你得到了一些 组件边界有点错误,您可以轻松调整它们。

-- 谷歌前首席 Java 架构师 Joshua Bloch。模块化分解链接

【讨论】:

Gradle with maven-publish:如何自动版本化并将目录中的非 gradle jar 发布到 Artifactory

】Gradlewithmaven-publish:如何自动版本化并将目录中的非gradlejar发布到Artifactory【英文标题】:Gradlewithmaven-publish:howtoautoversionandpublishnon-gradlejarsinadirectorytoArtifactory【发布时间】:2014-07-0817:31:28【问题描述】:作为从ant迁移到gradle的... 查看详情

android上传私有插件到私有maven-publish(代码片段)

不管是前端开发还是后端开发,都会涉及私有中间件的开发工作,对于这些私有的中间件,由于不方便对外开放,那么只能上传私有的Maven仓库。在Android开发中,我们如何将一个插件上传私有仓库呢?1,搭建私有仓库关于如何... 查看详情

如何使用旧的 maven 插件在 gradle 中的本地和远程 repo 之间切换?

...布时间】:2016-07-1322:38:23【问题描述】:我没有使用新的maven-publish插件,它看起来很棒并且非常适合这个用例,因为我一直在阅读没有人可以让jar的签名工作(尽管我愿意接受解释的答案以及我还没有找到 查看详情

如何使用 PHP 和 Smarty 同时获取数据并在浏览器中显示?

】如何使用PHP和Smarty同时获取数据并在浏览器中显示?【英文标题】:HowtofetchthedataanddisplayitinabrowsersimultaneouslyusingPHPandSmarty?【发布时间】:2013-12-2417:44:01【问题描述】:我的网站使用PHP、MySQL、Smarty、jQuery、AJAX等。目前,我正... 查看详情

Gradle maven-publish 不构建独立的 spring-boot 应用程序

】Gradlemaven-publish不构建独立的spring-boot应用程序【英文标题】:Gradlemaven-publishdoesnotbuildstandalonespring-bootapplication【发布时间】:2014-11-3011:26:57【问题描述】:当我使用gradlebuild构建一个spring-boot应用程序(到一个独立的jar)时,... 查看详情

gradle部署

...需要签署已发布的POM文件使用Maven插件发布Gradle默认提供maven-publish插件。它用于发布gradle脚本。看看下面的代码。applyplugin:‘java‘applyplugin:‘maven-publish‘publishing{publications{maven 查看详情

Intellij 和 Eclipse 无法找到库工件

...将在Android和Java项目中使用。我正在使用AndroidStudio附带的maven-publish插件以.aar和.jar格式将此库发布到我自己的远程工件存储库。我可以 查看详情

pythonascii_arty.py(代码片段)

查看详情

androidstudio使用mavenpush插件上传私有maven-已成功使用到项目中(代码片段)

...面pluginsid'com.android.library'id'kotlin-android'id'maven-publish'taskgenerateSourcesJar(type:Jar)fromandroid.sourceSets.main.java.srcDirsclassifier'sources'defversionName="1.0.0-SNAPSHOT"//SNAPSHOT_REPOSITORY_URL是测试的RELEASE_REPOSITORY_URL是生... 查看详情

androidstudio使用mavenpush插件上传私有maven-已成功使用到项目中(代码片段)

...面pluginsid'com.android.library'id'kotlin-android'id'maven-publish'taskgenerateSourcesJar(type:Jar)fromandroid.sourceSets.main.java.srcDirsclassifier'sources'defversionName="1.0.0-SNAPSHOT"//SNAPSHOT_REPOSITORY_URL是测试的RELEASE_REPOSITORY_URL是生... 查看详情

androidstudio使用mavenpush插件上传私有maven-已成功使用到项目中(代码片段)

...面pluginsid'com.android.library'id'kotlin-android'id'maven-publish'taskgenerateSourcesJar(type:Jar)fromandroid.sourceSets.main.java.srcDirsclassifier'sources'defversionName="1.0.0-SNAPSHOT"//SNAPSHOT_REPOSITORY_URL是测试的RELEASE_REPOSITORY_URL是生... 查看详情

如何使用hammer.js防止默认触摸

】如何使用hammer.js防止默认触摸【英文标题】:Howtopreventdefaultontouchwithhammer.js【发布时间】:2013-03-0213:39:20【问题描述】:如果用触摸设备点击锚点,我想阻止它点击,但如果用鼠标点击,我想正常操作。原因是,在桌面上,您... 查看详情

使用 Artifactory 和/或 Gradle 自动化版本号

】使用Artifactory和/或Gradle自动化版本号【英文标题】:AutomatingversionnumberswithArtifactoryand/orGradle【发布时间】:2015-02-1507:54:39【问题描述】:我们使用:Gradle构建(我们的构建脚本)CI用竹子用于binrepo的工件在Bamboo上,我们使用Art... 查看详情

idecode::blocks16.01安装设置和使用

  发现Code::Blocks和SublimeText一样,都是很简单好使的IDE(集成开发环境),一看微软家的VS2015,现在出到2017了,安装包就是好几十个G,C盘真是吃不消。  官网下载:http://www.codeblocks.org/downloads/26   设置光标颜色: http... 查看详情

gradlespringbootmavenpublish--发布只包含依赖关系和约束,不包含版本。

我在Gradle中使用maven-publish插件来发布我的SpringBoot应用程序jar。我运行了通常的任务。./gradlewartifactorypublish.然而,出现了以下错误,我可以理解其含义。>Task:assembleArtifact>Task:application-jar:compileJavaUP-TO-DATE>Task:application-j 查看详情

如何从 Laravel Artisan 触发单元测试

】如何从LaravelArtisan触发单元测试【英文标题】:HowtotriggerunittestingfromLaravelArtisan【发布时间】:2018-07-2122:28:12【问题描述】:我有一种情况,我使用PHPUnit进行了一些单元测试,我想从laravel的工匠控制台实用程序触发它们。我goo... 查看详情

安卓上传aar到jitpack仓库使用和示例(代码片段)

...加mavenurl'https://jitpack.io'./jplib/build.gradle中增加id'maven-publish'同时增加afterEvaluate字段所有内容,参考build.gradleafterEvaluatepublishingpublications//CreatesaMavenpublicationcalled" 查看详情

jenkins使用遇到问题记录

提交代码后使用jenkins打包,使用的代码不是最新查看svn,发现jenkins使用的是交老的版本,最新的文件再svn上是正常的。原因jenkins和svn时间不同步,svn时间略快,jenkins获取自己当前时间下的代码。解决方法:方法一、同步svn、je... 查看详情