首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Artifactory +自定义Gradle插件编程

Artifactory +自定义Gradle插件编程
EN

Stack Overflow用户
提问于 2014-08-28 19:10:37
回答 3查看 2.8K关注 0票数 1

我正在编写一个自定义插件,以消除对以下内容的需求:

代码语言:javascript
复制
artifactory {
    contextUrl = "${artifactory_contextUrl}"   //The base Artifactory URL if not overridden by the publisher/resolver
    publish {
        repository {
            contextUrl = "${artifactory_contextUrl}"
            repoKey = 'android-dev'
            username = "${artifactory_user}"
            password = "${artifactory_password}"
            maven = true

        }
    }
    resolve {
        repository {
            contextUrl = "${artifactory_contextUrl}"
            repoKey = 'android-dev-distributions'
            username = "${artifactory_user}"
            password = "${artifactory_password}"
            maven = true

        }
    }
}

下面是我是如何以编程方式这样做的:

代码语言:javascript
复制
 DefaultExtraPropertiesExtension ext = (((DefaultExtraPropertiesExtension) project.property("ext")));
        ext.setProperty("artifactory", new ArtifactoryDsl(contextUrl, publish, resolve));

这应该能行,对吧?ArtifactoryDsl对象具有所有正确的字段(contextUrl、发布、解析及其各自的内部字段)。

这是一个错误:

代码语言:javascript
复制
14:46:49.752 [ERROR] [org.gradle.BuildExceptionReporter] Caused by: java.lang.IllegalStateException:    Context URL cannot be empty
14:46:49.753 [ERROR] [org.gradle.BuildExceptionReporter]    at org.jfrog.build.client.ArtifactoryClientConfiguration.getContextUrl(ArtifactoryClientConfiguration.java:111)
14:46:49.754 [ERROR] [org.gradle.BuildExceptionReporter]    at org.jfrog.build.client.ArtifactoryClientConfiguration$PublisherHandler.getContextUrl(ArtifactoryClientConfiguration.java:225)
14:46:49.754 [ERROR] [org.gradle.BuildExceptionReporter]    at org.jfrog.gradle.plugin.artifactory.extractor.BuildInfoTask.prepareAndDeploy(BuildInfoTask.java:526)
14:46:49.755 [ERROR] [org.gradle.BuildExceptionReporter]    at org.jfrog.gradle.plugin.artifactory.extractor.BuildInfoTask.collectProjectBuildInfo(BuildInfoTask.java:440)
14:46:49.755 [ERROR] [org.gradle.BuildExceptionReporter]    at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:63)
14:46:49.755 [ERROR] [org.gradle.BuildExceptionReporter]    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.doExecute(AnnotationProcessingTaskFactory.java:219)
14:46:49.756 [ERROR] [org.gradle.BuildExceptionReporter]    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:212)
14:46:49.756 [ERROR] [org.gradle.BuildExceptionReporter]    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:201)
14:46:49.757 [ERROR] [org.gradle.BuildExceptionReporter]    at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:533)
14:46:49.757 [ERROR] [org.gradle.BuildExceptionReporter]    at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:516)
14:46:49.758 [ERROR] [org.gradle.BuildExceptionReporter]    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
14:46:49.777 [ERROR] [org.gradle.BuildExceptionReporter]    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)
14:46:49.778 [ERROR] [org.gradle.BuildExceptionReporter]    ... 66 more
EN

回答 3

Stack Overflow用户

发布于 2014-08-29 02:08:28

不,这不管用。您的插件必须应用Artifactory插件,然后使用project.artifactory (Groovy)或project.getExtensions().getByName("artifactory") (project.getExtensions().getByName("artifactory"))获取该对象,然后配置该对象。

票数 4
EN

Stack Overflow用户

发布于 2014-09-04 15:30:42

对于任何好奇如何实现这一目标的人,我都是这样做的:

在您的build.gradle中,确保您可以访问Artifactory类:

代码语言:javascript
复制
compile "org.jfrog.buildinfo:build-info-extractor-gradle:2.2.4"

接下来,在您的自定义插件的()方法中:

代码语言:javascript
复制
        // Set up plugins so we never need to add them to a build.gradle
        project.getPlugins().apply(MAVEN);
        project.getPlugins().apply(ARTIFACTORY);
        project.setGroup(GROUP);

        // Add Artifactory repo to the repositories
        project.getRepositories().maven(new ArtifactoryAction(contextUrl + ARTIFACTORY_REPO_ENDPOINT, user, pass));

        // We will define the plugin convention here so all of our libraries do not need to
        // declare the artifactory closure manually
        ArtifactoryPluginConvention pluginConvention =
                ArtifactoryPluginUtil.getArtifactoryConvention(project);
        pluginConvention.setContextUrl(contextUrl);

        PublisherConfig publisherConfig = new PublisherConfig(pluginConvention);
        publisherConfig.setContextUrl(contextUrl);
        pluginConvention.setPublisherConfig(publisherConfig);

        // Use reflection to access private field
        PublisherConfig.Repository repository = null;

        Field[] fields = PublisherConfig.class.getDeclaredFields();
        for(Field field : fields) {
            if(field.getName().equalsIgnoreCase("repository")) {
                try {
                    field.setAccessible(true);
                    repository = (PublisherConfig.Repository) field.get(publisherConfig);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

        if(repository != null) {
            repository.setPassword(pass);
            repository.setUsername(user);
            repository.setRepoKey(PUBLISHER_REPO_KEY);
            repository.setMavenCompatible(true);
        }

        GradleArtifactoryClientConfigUpdater.update(pluginConvention.getClientConfig(), project.getRootProject());
票数 1
EN

Stack Overflow用户

发布于 2019-08-06 15:30:14

“谢谢你,”格罗夫纳说,“我也找了很长时间,你的回答挽救了我的日子!”

对于任何想要用groovy实现插件的人,下面是基于上一篇文章的实现:

PS:我用的是org.jfrog.buildinfo:build-info-extractor-gradle:4.9.8mave-publish

PS 2:出于某种原因,有必要将maven应用于根项目。否则就会出现错误Extension of type 'PublishingExtension' does not exist. Currently registered extension types: [ExtraPropertiesExtension]

代码语言:javascript
复制
class Plugin implements Plugin<Project> {
    @Override
    void apply(Project project) {

        //Maven publication plugin needs to be applied to root also
        project.rootProject.pluginManager.apply "maven-publish"
        project.pluginManager.apply "maven-publish"

        project.plugins.apply "com.jfrog.artifactory"


        def artifactory_contextUrl = project.artifactory_contextUrl
        def artifactory_writer_user = project.artifactory_writer_user
        def artifactory_writer_password = project.artifactory_writer_password

        // We will define the plugin convention here so all of our libraries do not need to
        // declare the artifactory closure manually
        ArtifactoryPluginConvention pluginConvention = ArtifactoryPluginUtil.getArtifactoryConvention(project)
        //uses closures to set the configuration
        pluginConvention.artifactory {
            contextUrl = "${artifactory_contextUrl}"
            publish{
                repository {
                    repoKey = 'repo name here'
                    username = "${artifactory_writer_user}"
                    password = "${artifactory_writer_password}"
                    maven = true
                }
                defaults {
                    publications('plugin')
                }
            }
        }
//commits changes
GradleArtifactoryClientConfigUpdater.update(pluginConvention.clientConfig, project.rootProject)


    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25556305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档