如何使用Gradle构建Groovy JAR并将其发布到内部存储库

时间:2014-08-12 07:07:43

标签: groovy jar gradle artifactory

我有一个Groovy项目,我正在尝试使用Gradle构建它。首先,我想要一个package任务,通过根据其依赖项编译它来创建JAR。然后我需要为该JAR生成Maven POM并将JAR / POM发布到内部Artifactory仓库。 build.gradle

apply plugin: "groovy"
apply plugin: "maven-publish"

repositories {
    maven {
        name "artifactory01"
        url "http://myartifactory/artifactory/libs-release"
    }
}
dependencies {
    compile "long list starts here"
}

// Should compile up myapp-<version>.jar
jar {
}

// Should publish myapp-<version>.jar and its (generated) POM to our in-house Maven/Artifactory repo.
publishing {
    publications {
        myPublication(MavenPublication) {
            from components.java
            artifact sourceJar {
                classifier "source"
            }

            pom.withXml {
                // ???
            }
        }
    }
}

task wrapper(type: Wrapper) {
    gradleVersion = '1.11'
}

但是我不相信我已经使用jar任务正确设置了版本控制(例如,我怎样才能创建myapp-1.2.1myapp-1.2.2相比?我也不知道我认为我的publications配置设置正确:pom.withXml中的内容应该是什么?

2 个答案:

答案 0 :(得分:12)

非常欢迎您使用artifactory插件。 文档可以在our user guide中找到,您可以在下面找到一个完整的gradle构建示例。

运行gradle build artifactoryPublish以构建和发布项目。

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath(group: 'org.jfrog.buildinfo', name: 'build-info-extractor-gradle', version: '3.0.1')
    }
}
apply plugin: 'java'
apply plugin: 'maven-publish'
apply plugin: 'com.jfrog.artifactory'

group = 'com.jfrog.example'
version = '1.2-SNAPSHOT'
status = 'SNAPSHOT'

dependencies {
    compile 'org.slf4j:slf4j-api:1.7.5'
    testCompile 'junit:junit:4.11'
}

task sourcesJar(type: Jar, dependsOn: classes) {
    classifier = 'sources'
    from sourceSets.main.allSource
}

publishing {
    publications {
        main(MavenPublication) {
            from components.java
            artifact sourcesJar
    }
}

artifactory {
    contextUrl = 'http://myartifactory/artifactory'
    resolve {
        repository {
            repoKey = 'libs-release'
        }
    }
    publish {
        repository {
            repoKey = 'libs-snapshot-local'
            username = 'whatever'
            password = 'whatever123'
        }
        defaults {
            publications 'main'
        }
    }
}

答案 1 :(得分:2)

package是Java / Groovy中的关键字,您必须使用不同的语法来声明具有该名称的任务。

无论如何,package的任务声明应该被移除,因为jar任务已经达到了这个目的。 jar任务配置(jar { from ... })应位于最外层(不嵌套在另一个任务中),但from configurations.compile不太可能是您想要的,因为它将包含Jars的编译依赖项Jar(常规Java类加载器无法处理),而不是将它们合并到Jar中。 (你甚至确定你需要一个肥胖的罐子吗?)

同样,应删除publish任务声明,并替换为publishing { publications { ... } }

此外,可能应删除buildscript块,并将repositories { ... }dependencies { ... }移至最外层。 (buildscript { dependencies { ... } }声明构建脚本本身的依赖关系(例如Gradle插件),而不是要编译/运行的代码的依赖关系。)

我建议查看完整Gradle分发(samples)的gradle-all目录中的许多自包含示例构建。