如何编写Gradle脚本以便将shadowjar发布到Artifactory中

时间:2016-02-01 13:31:12

标签: java gradle build

我在我的java项目中使用shadowJar。 我想把结果推到神器中。

我的gradle脚本看起来像这样,我不知道如何连接点:

shadowJar {
    baseName = 'com.mycompany.myapp'
    manifest {
        attributes 'Main-Class': 'myapp.starter'
    }
}


  ]
    apply plugin: 'java'
    apply plugin: 'idea'
    apply plugin: 'maven'
    apply plugin: 'com.github.johnrengelman.shadow'


    // rep for the project
    repositories {
        mavenCentral()
        maven {
            url 'http://repo.company:8081/artifactory/libs-release'
            credentials {
                username = "${repo_user}"
                password = "${repo_password}"
            }
        }
        maven {
            url 'http://repo.company:8081/artifactory/libs-snapshot'
            credentials {
                username = "${repo_user}"
                password = "${repo_password}"
            }
        }

}


publishing {
    publications {
        mavenJava(MavenPublication) {
            from components.java

            artifact sourceJar {
                classifier "sources"
            }
        }
    }
}

如何编写gradle来获取shadowjar文件?

感谢, 射线。

7 个答案:

答案 0 :(得分:6)

publication部分使用maven-publish插件确定您要发布的内容。

在您当前的配置中,from components.java将发布项目的默认jar工件,工件sourceJar将发布sourceJar。要发布不同的jar,您需要修改(或添加新的)发布。

shadowJar {
  baseName = 'myproject-shadow'
  classifier = ''
}

publishing {
  publications {
    shadow(MavenPublication) {
      from components.shadow
      artifactId = 'myproject-shadow'
    }
  }
}

jar名称中使用的版本来自project.version。

答案 1 :(得分:3)

[x1,y1]插件中的API已更改,这适用于我[x'1,y'1]http://imperceptiblethoughts.com/shadow/#publishing_shadow_jars

shadow

答案 2 :(得分:2)

你看过https://cmake.org/Bug/view.php?id=10365了吗?这可以帮助您满足您的需求,从Artifactory中解析和部署工件。

您可以使用插件发布,省略' artifactory'来自不发布任何内容的项目的插件。请注意,这不适用于包含约定对象的根项目,因此需要应用插件。 为要应用插件的每个项目手动激活相应的artifactoryPublish Gradle任务。 例如,在我们的Gradle项目示例中,您可以运行: ./gradlew clean api:artifactoryPublish shared:artifactoryPublish

答案 3 :(得分:2)

以下是我使用shadow插件和maven-publish插件让Gradle发布到我们的Nexus仓库所做的工作:(运行发布任务:" gradle publish")

plugins {
    id 'com.github.johnrengelman.shadow' version '1.2.4'
}

apply plugin: 'maven-publish'

publishing {
    publications {
        shadow(MavenPublication) {
            from components.shadow
            groupId 'myGroupId'
            artifactId 'myArtifactId'
        }
    }
    repositories {
        maven {
            url "http://nexus.mycompany.com/repository/stuff"
            credentials {
                username = "${System.env.NEXUS_USERNAME}"
                password = "${System.env.NEXUS_PASSWORD}"
            }
        }
    }
}

答案 4 :(得分:1)

您可以使用此功能:

build.gradle.kts

plugins {
    kotlin("jvm")
    `maven-publish`
    id("com.github.johnrengelman.shadow") version "6.0.0"
}

publishing {
    publications {
        val publication = create<MavenPublication>("shadow")
        project.shadow.component(publication)
    }
}

答案 5 :(得分:0)

有点晚了,但是我想向您展示如何使它工作。也许它可以像我一样帮助某人在这个问题上绊脚石:

build.gradle.kts:

plugins {
    java
    `maven-publish`
    id("com.github.johnrengelman.shadow") version "5.1.0"
}
publishing {
    publications {
        create<MavenPublication>("maven") {
            from(components["java"])
            artifact(tasks["shadowJar"])
        }
    }
    repositories {
        maven {
          /* ... */
        }
    }
}

上面的示例是用Kotlin编写的,如果您更喜欢Groovy,则需要编写以下代码:

build.gradle:

publishing {
  publications {
    shadow(MavenPublication) {
      from components.java
      artifact shadowJar
    }
  }
}

(在这里找到:https://libraries.io/github/johnrengelman/shadow

答案 6 :(得分:0)

没有其他答案考虑多模块项目。对于多模块项目,没有人为每个模块配置发布。相反,它是在根构建文件中完成的。

此外,在多模块项目中,通常只需要将一个模块作为可执行的JAR镜像即可。将影子插件应用于每个模块是没有意义的。

以下是使用Kotlin DSL实现上述所有功能的方法:

在子项目中:

plugins {
    id("com.github.johnrengelman.shadow")
}
...
project.tasks.findByName("jar")?.enabled = false

tasks.withType<com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar> {
    mergeServiceFiles()
    archiveClassifier.set("")
    manifest {
        attributes(mapOf("Main-Class" to "com.mycompany.MainClass"))
    }
}

在根项目中:

publications {
    create<MavenPublication>("maven") {
        afterEvaluate {
            val shadowJar = tasks.findByName("shadowJar")
            if (shadowJar == null) from(components["java"])
            else artifact(shadowJar)
        }
        artifact(kdocJar)
        artifact(sourcesJar)
    }
    ...
}

关键是afterEvaluate配置。有关详细信息,请参见this

每个人都在谈论的project.shadow.component(publication)在根项目中不存在,并且不会在Kotlin DSL中进行编译。 ShadowExtension仅在应用插件的项目中存在。