Gradle:使用';maven publish';自定义独立插件中的插件

Gradle:使用';maven publish';自定义独立插件中的插件,gradle,groovy,maven-publish,Gradle,Groovy,Maven Publish,在我的第三个问题之后,我几乎感觉像是在发垃圾邮件,因为我的问题看起来很琐碎。但我只是在Gradle Docs中找不到任何关于我的案例的帮助,其他关于stackoverflow的问题也没有帮助 这次:我不能在我自己的独立自定义插件中使用maven publish插件。到目前为止,我的插件的代码是: package com.sample.gradle; import org.gradle.api.Project; import org.gradle.api.Plugin; public clas

在我的第三个问题之后,我几乎感觉像是在发垃圾邮件,因为我的问题看起来很琐碎。但我只是在Gradle Docs中找不到任何关于我的案例的帮助,其他关于stackoverflow的问题也没有帮助

这次:我不能在我自己的独立自定义插件中使用
maven publish
插件。到目前为止,我的插件的代码是:

package com.sample.gradle;

import org.gradle.api.Project;
import org.gradle.api.Plugin;

public class SampleGradlePlugin implements Plugin<Project> {
    public void apply(Project project) {

        project.apply plugin: 'application'
        project.apply plugin: 'maven-publish'
        project.apply plugin: 'maven'

        project.publishing.publications {
            maven(MavenPublication) {
                groupId project.group
                artifactId project.name
                version=project.version
                from components.java
            }
        }

        project.uploadArchives {
            repositories {
                mavenDeployer {
                    repository(url: project.Repo_Upload_Internal){
                        authentication(userName: project.Repo_Upload_User, password: project.Repo_Upload_Pass)
                    }        
                    snapshotRepository(url: project.Repo_Upload_Snapshot){
                        authentication(userName: project.Repo_Upload_User, password: project.Repo_Upload_Pass)
                    }
                }
            }
        }
        //this try/catch is not important for my question
        try{
            project.repositories {
                maven {
                    url project.Repo_Gp_Internal
                    credentials {
                        username project.Repo_Gp_User;
                    }
                }
            }
        }
        catch(MissingPropertyException e){
            println "Info: '"+e.getProperty()+"' not declared in \\"+project.name+"\\gradle.properties"
        }
    }
}
我的错在哪里?我忘了什么


如果有人回答,请告诉我你是如何获得知识的

现在找到了一个适合我的解决方案。我不再使用
maven publish
插件了。只有
maven
插件。然后我把这段代码放在我自己插件的末尾:

    project.configurations {
        deployerJars 
    }
    project.dependencies {
        deployerJars "org.apache.maven.wagon:wagon-http:2.2"
    }   
    project.uploadArchives {
        repositories {
            mavenDeployer {
                repository(url: project.Repo_Upload_Internal){
                    authentication(userName: project.Repo_Upload_User, password: project.Repo_Upload_Pass)
                }        
                snapshotRepository(url: project.Repo_Upload_Snapshot){
                    authentication(userName: project.Repo_Upload_User, password: project.Repo_Upload_Pass)
                }
            }
        }
    }
进一步:

我还没有找到抑制zip和tar文件上传的方法。我仍然需要在几个
build.gradle
文件中复制和粘贴一些代码来完成这项工作。这是一个代码:

configurations.archives.with {
    artifacts.remove artifacts.find { it.archiveTask.is distZip }
    artifacts.remove artifacts.find { it.archiveTask.is distTar }
}

我还不能在我的自定义插件中修改代码

现在找到了一个适合我的解决方案。我不再使用
maven publish
插件了。只有
maven
插件。然后我把这段代码放在我自己插件的末尾:

    project.configurations {
        deployerJars 
    }
    project.dependencies {
        deployerJars "org.apache.maven.wagon:wagon-http:2.2"
    }   
    project.uploadArchives {
        repositories {
            mavenDeployer {
                repository(url: project.Repo_Upload_Internal){
                    authentication(userName: project.Repo_Upload_User, password: project.Repo_Upload_Pass)
                }        
                snapshotRepository(url: project.Repo_Upload_Snapshot){
                    authentication(userName: project.Repo_Upload_User, password: project.Repo_Upload_Pass)
                }
            }
        }
    }
进一步:

我还没有找到抑制zip和tar文件上传的方法。我仍然需要在几个
build.gradle
文件中复制和粘贴一些代码来完成这项工作。这是一个代码:

configurations.archives.with {
    artifacts.remove artifacts.find { it.archiveTask.is distZip }
    artifacts.remove artifacts.find { it.archiveTask.is distTar }
}

我还不能在我的自定义插件中修改代码

传递给project.publishing.publications的闭包在执行时上下文中没有
project
。这意味着
maven发布
不在闭包上下文中,即使您将
maven插件
应用于
project

如果在构建脚本中编写插件,默认情况下,它会将
project
作为上下文,但作为独立插件编写时,上下文是不同的

您可以对闭包
setDelegate(project)
设置上下文,然后传递它:

def publicationsClosure =  {
    maven(MavenPublication) {
        groupId project.group
        artifactId project.name
        version=project.version
        from components.java
    }
}
publicationsClosure.setDelegate(project)
project.publishing.publications(publicationsClosure)

我在一个插件中也遇到了同样的错误,当我读到这篇文章时,我最终意识到发生了什么:

您传递给project.publishing.publications的闭包在执行时在上下文中没有
project
。这意味着
maven发布
不在闭包上下文中,即使您将
maven插件
应用于
project

如果在构建脚本中编写插件,默认情况下,它会将
project
作为上下文,但作为独立插件编写时,上下文是不同的

您可以对闭包
setDelegate(project)
设置上下文,然后传递它:

def publicationsClosure =  {
    maven(MavenPublication) {
        groupId project.group
        artifactId project.name
        version=project.version
        from components.java
    }
}
publicationsClosure.setDelegate(project)
project.publishing.publications(publicationsClosure)

我在一个插件中也遇到了同样的错误,当我读到这篇文章时,我终于意识到发生了什么:

在我的例子中,我修复了错误消息,添加了以下内容:

import org.gradle.api.publish.maven.MavenPublication

但后来遇到了其他问题,最终使用解决了所有问题。在我的案例中,我修复了错误消息,添加了以下内容:

import org.gradle.api.publish.maven.MavenPublication

但后来又遇到了其他问题,最终使用了,解决了所有问题。这对我来说是可行的,gradle 4.10和maven publish

在我的自定义plugin.groovy中:

import org.gradle.api.publish.maven.MavenPublication

...

project.extensions.configure PublishingExtension, new ClosureBackedAction( {
                publications{
                    mycustompub(MavenPublication) {
                        groupId = project.group
                        artifactId = <artifact name>
                        artifact source: <path to artifact>, extension: 'zip'
                    }
            }})
import org.gradle.api.publish.maven.MavenPublication
...
project.extensions.configure PublishingExtension,新ClosureBackedAction({
出版物{
mycustompub(MavenPublication){
groupId=project.group
artifactId=
工件源:,扩展名:“zip”
}
}})

在gradle 4.10和maven publish中,这对我来说很有效

在我的自定义plugin.groovy中:

import org.gradle.api.publish.maven.MavenPublication

...

project.extensions.configure PublishingExtension, new ClosureBackedAction( {
                publications{
                    mycustompub(MavenPublication) {
                        groupId = project.group
                        artifactId = <artifact name>
                        artifact source: <path to artifact>, extension: 'zip'
                    }
            }})
import org.gradle.api.publish.maven.MavenPublication
...
project.extensions.configure PublishingExtension,新ClosureBackedAction({
出版物{
mycustompub(MavenPublication){
groupId=project.group
artifactId=
工件源:,扩展名:“zip”
}
}})

如果未导入MavenPublication,使用Groovy构建可能不会引发编译错误。在这种情况下会引发“不支持仅按名称创建元素”错误。如果未导入MavenPublication,则使用Groovy构建可能不会引发编译错误。在本例中会抛出“不支持仅按名称创建元素”错误。仅供参考,防止上载zip和tar文件的代码与Gradle 4.x及更高版本的代码冲突。我在3.x和4.x Gradle上找到了一个类似的解决方案,似乎做了同样的事情,在
//不要将ZIP和TAR发行版上载到Maven repo configurations.archives.with{artifacts.removeAll{it.file=~'TAR'}artifacts.removeAll{it.file=~'ZIP'}
FYI,防止上载zip和tar文件的代码与Gradle 4.x及更高版本的代码冲突。我在3.x和4.x Gradle上找到了一个类似的解决方案,它似乎做了同样的事情,在
//不要将ZIP和TAR发行版上载到Maven repo configurations.archives.with{artifacts.removeAll{it.file=~'TAR'}artifacts.removeAll{it.file=~'ZIP'}