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

如何使用Gradle构建Groovy JAR并将其发布到内部repo,groovy,jar,gradle,artifactory,Groovy,Jar,Gradle,Artifactory,我有一个Groovy项目,正在尝试与Gradle一起构建它。首先,我需要一个包任务,该任务通过根据依赖项编译JAR来创建JAR。然后,我需要为该JAR生成一个Maven POM,并将JAR/POM发布到内部的Artifactory repo。build.gradle: apply plugin: "groovy" apply plugin: "maven-publish" repositories { maven { name "artifactory01"

我有一个Groovy项目,正在尝试与Gradle一起构建它。首先,我需要一个
任务,该任务通过根据依赖项编译JAR来创建JAR。然后,我需要为该JAR生成一个Maven POM,并将JAR/POM发布到内部的Artifactory repo。
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'
}
apply插件:“groovy”
应用插件:“maven发布”
存储库{
马文{
名称“artifactory01”
url“http://myartifactory/artifactory/libs-release"
}
}
依赖关系{
编译“长列表从这里开始”
}
//应该编译myapp-.jar
罐子{
}
//应该将myapp-.jar及其(生成的)POM发布到我们的内部Maven/Artifactory repo。
出版{
出版物{
我的出版物(MavenPublication){
来自components.java
工件源jar{
分类器“源”
}
pom.withXml{
// ???
}
}
}
}
任务包装器(类型:包装器){
gradleVersion='1.11'
}

但是,我认为我没有正确地使用
jar
任务设置版本控制(例如,我如何才能让它创建
myapp-1.2.1
而不是
myapp-1.2.2
?我也不认为我的
出版物配置设置正确:应该在
pom中设置什么。使用XML

是Java/Groovy中的一个关键字,您必须使用不同的语法来声明任务。)那个名字

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

同样,应该删除
publish
任务声明,并将其替换为
publishing{publications{…}

另外,可能应该删除
buildscript
块,并且
repositories{…}
dependentials{…}
移动到最外层。(
buildscript{dependentials{…}
声明构建脚本本身的依赖项(例如Gradle插件),而不是要编译/运行的代码的依赖项。)


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

非常欢迎您为此使用
artifactory
插件。 文档可以在和下面找到,您可以找到gradle build的完整工作示例

运行
gradlebuildartifactorypublish
以生成和发布项目

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'
        }
    }
}

谢谢@Peter Niederwieser-请查看我的编辑。您的输入非常有用,我按照您的建议将其与
gradle all
中的代码示例拼凑在一起。不过,我有几个后续问题:(1)运行
gradle jar
时如何实现版本控制?对于发布,我应该在
pom.withXml
中放置什么?您可以设置
version
属性。除非您想添加其他(可选)内容,否则无需使用
pom.withXml
关于POM的信息。谢谢@JBaruch,我一定会尝试一下!好奇:我如何使用这个构建脚本打包(JAR)并发布JAR?我假设
gradle JAR
gradle publish
?再次感谢!