首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Artifactory +自定义Gradle插件编程实现(2022)

Artifactory +自定义Gradle插件编程实现(2022)
EN

Stack Overflow用户
提问于 2022-01-24 19:47:49
回答 1查看 237关注 0票数 0

我正在尝试创建一个定制的gradle插件(100% java),它将自动配置Artifactory,从而避免了以下DSL的需要:

代码语言: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

    }
}
}

我正试图重新创建@agrosner自己的解决方案(来自https://stackoverflow.com/a/25669431/1880280),但我缺少了"ArtifactoryAction“。我哪儿都找不到。

@agrosner发布的非工作版本是以下代码:

代码语言: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());

有人能帮助更新100%的java版本吗?

另外,下面的DSL将如何处理?

代码语言:javascript
运行
复制
artifactory {
publish {
    repository {
        repoKey =  'default-gradle-dev-local' // The Artifactory repository key to publish to
        username = "${artifactory_user}" // The publisher user name
        password = "${artifactory_password}" // The publisher password
        maven       = true
    }
    defaults {
        publications('mavenJava')
        publishArtifacts = true
        publishPom = true
    }
}}

提前感谢

塞萨尔

ps。在@agrosner问题线程上发布的DSL版本对我来说没有用。我需要一个Java版本。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-25 22:08:27

对于与ArtifactoryAction相关的第一个问题:这既不是Gradle api,也不是与Artifactory插件相关的API,但很可能是响应作者自己实现的自定义类,作为声明自定义Artifactory maven回购的快捷方式。

请参阅这个API,用于声明maven存储库:

代码语言:javascript
运行
复制
MavenArtifactRepository maven​(Action<? super MavenArtifactRepository> action)

所以你可以使用:

代码语言:javascript
运行
复制
project.getRepositories().maven( mavenArtifactRepository -> {
     mavenArtifactRepository.setUrl(contextUrl + MAVEN_PUBLIC_REPO);
     mavenArtifactRepository.getCredentials().setUsername("user");
     mavenArtifactRepository.getCredentials().setPassword("password");
});

或者将操作代码包装到Action<? super MavenArtifactRepository>的自定义实现中:

代码语言:javascript
运行
复制
project.getRepositories().maven( new ArtifactoryAction(contextUrl + MAVEN_PUBLIC_REPO, "user", "password")        );

[...]
// custom action class, defined somewhere else
class ArtifactoryAction implements Action<MavenArtifactRepository> {
    private final String url, userName, password;

    ArtifactoryAction(String url, String userName, String password) {
        this.url = url; this.userName = userName; this.password = password;
    }

    @Override
    public void execute(MavenArtifactRepository target) {
        target.setUrl(url);
        target.getCredentials().setUsername(userName);
        target.getCredentials().setPassword(password);
    }
}

有关artifactory { } DSL的java翻译的另一个问题,请参阅下面的完整示例和一些内联注释。(没有测试,而是从我的kotlin实现中翻译出来的,它工作得很好)

代码语言:javascript
运行
复制
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.publish.maven.plugins.MavenPublishPlugin;
import org.jfrog.gradle.plugin.artifactory.ArtifactoryPlugin;
import org.jfrog.gradle.plugin.artifactory.ArtifactoryPluginUtil;
import org.jfrog.gradle.plugin.artifactory.dsl.ArtifactoryPluginConvention;
import org.jfrog.gradle.plugin.artifactory.dsl.PublisherConfig;

public class CustomArtifactoryPlugin implements Plugin<Project> {

    private static String MAVEN_PUBLIC_REPO = "/maven-public";
    private String contextUrl = "MY_CUSTOM_REPO_BASE_URL";

    @Override
    public void apply(Project project) {

        // Base gradle publishing plugin
        //  - maven plugin for pulishing java artefacts
        //  - ivy plugin if for publishing other type of artefacts: rpms, archives, ..
        project.getPluginManager().apply(MavenPublishPlugin.class);
        // project.getPluginManager().apply(IvyPublishPlugin.class);

        // Apply the Artifactory plugin
        project.getPluginManager().apply(ArtifactoryPlugin.class);

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

        // Configure artifactory plugin - using 'withPlugin' ensures that plugin has already been applied
        project.getPluginManager().withPlugin("com.jfrog.artifactory", appliedPlugin -> {
            // artifactory {
            ArtifactoryPluginConvention pluginConvention = ArtifactoryPluginUtil.getArtifactoryConvention(project);
            //    contextUrl = "${contextUrl}"
            pluginConvention.setContextUrl(contextUrl);
            //    publish {
            PublisherConfig publisherConfig = new PublisherConfig(pluginConvention);
            pluginConvention.setPublisherConfig(publisherConfig);
            //      repository {
            pluginConvention.getPublisherConfig().repository(repository -> {
                //      repoKey =  'default-gradle-dev-local'  ...
                repository.setRepoKey("default-gradle-dev-local"); // The Artifactory repository key to publish to
                repository.setUsername("${artifactory_user}"); // The publisher user name
                repository.setPassword("${artifactory_password}"); // The publisher password
                repository.setMavenCompatible(true);
            });
            //      defaults {
            pluginConvention.getPublisherConfig().defaults(artifactoryTask -> {
                //      publications('mavenJava')
                artifactoryTask.publications("mavenJava");
                artifactoryTask.setPublishArtifacts("true");
                artifactoryTask.setPublishPom("true");
            });

        });
    }

}

编辑发布配置,您可以这样做:

代码语言:javascript
运行
复制
        // create maven publication
        project.getExtensions().configure(PublishingExtension.class, publishingExtension -> {
            publishingExtension.publications(publications -> {
                publications.create("mavenPublication", MavenPublication.class, mavenPublication -> {
                    mavenPublication.setVersion("1.0.0");
                    mavenPublication.setGroupId("groupId");
                    mavenPublication.from(project.getComponents().findByName("java"));
                });
            });
        });
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70839640

复制
相关文章

相似问题

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