Gradle 4.7, Boot plugin v2.0.2.RELEASE, using Maven plugin to publish

To customize the name of the artifact, the following is necessary:

jar {
    archiveName "citylist-builder.jar"
}
bootJar {
    archiveName "citylist-builder.jar"
}

If the above configurations don't match, ./gradlew clean build install fails with a message as follows:

* What went wrong:
Execution failed for task ':my-project:install'.
> Could not publish configuration 'archives'
   > Cannot publish artifact '<archiveName in bootJar>.jar' (/path/to/my-project/build/libs/my-project-2.11.0-beta-SNAPSHOT.jar) as it does not exist.

Since the boorJar task is of type Jar, we shouldn't need to duplicate the configuration.

Comment From: wilkinsona

The Maven plugin's install task installs the archives in the archives configuration into the local Maven repository. By default, this is the artifact created by the jar task. By configuring both jar and bootJar with the same name, you're tricking Gradle into installing the artifact created by the bootJar task when it thinks it's installing the artifact created by the jar task. This is problematic as install depends on the jar task but doesn't depend on the bootJar task.

Boot's Gradle plugin uses a separate configuration named bootArchives. By default it will contain the artifact created by the bootJar task. As described in the documentation an uploadBootArchives task is automatically created. We should do something similar with a bootInstall task.

Comment From: wilkinsona

You can configure a bootInstall task by adding the following to your project's build.gradle:

task bootInstall(type: Upload) {
    configuration = project.configurations.bootArchives
    // Install to the local Maven repository
    repositories.mavenInstaller()
    // It's a fat jar. Clear the scope mappings so that the pom has no dependencies
    repositories.withType(MavenResolver.class) { resolver ->
        resolver.pom.scopeMappings.mappings.clear()
    }
}

Comment From: asarkar

install depends on the jar task but doesn't depend on the bootJar task.

Wouldn't it be easier to set up an explicit dependency (in my project) instead of creating bootInstall task, like so

install.dependsOn(bootJar)

The docs say the jar task is disabled by the Boot plugin.

I used install as an example because that's where the build is currently failing, but from what you're saying, I think publishing to a remote repo would have the same problem.

Comment From: wilkinsona

Wouldn't it be easier to set up an explicit dependency (in my project) instead of creating bootInstall task

Not really, no. You're still tricking Gradle into uploading the artifact produced by bootJar when it thinks it's uploading the artifact produced by jar.

I think publishing to a remote repo would have the same problem.

I don't think it does. There's already an uploadBootArchives task that uploads the contents of the bootArchives configuration. This is described in the documentation that I linked to above.

Comment From: asarkar

But creating a new task bootInstall won't make gradle install work unless I keep both jars, the original one, and the fat one.

Comment From: wilkinsona

You shouldn't be using gradle install. Its documented purpose is to install the artifacts in the archives configuration and, as I explained above, the artifact produced by bootJar is part of the bootArchives configuration. The bootInstall task I showed above will install the artifacts from the bootArchives configuration.

Comment From: asarkar

It's not working for me (I've some additional baggage). I'll have to create a sample project and report back.

Comment From: spring-projects-issues

If you would like us to look at this issue, please provide the requested information. If the information is not provided within the next 7 days this issue will be closed.

Comment From: spring-projects-issues

Closing due to lack of requested feedback. If you would like us to look at this issue, please provide the requested information and we will re-open the issue.

Comment From: wilkinsona

Despite the lack of feedback, I still think this is a change that's worth making. It would, however, still be nice to know why it apparently didn't work for @asarkar.

Comment From: asarkar

@wilkinsona I had to put this on ice due to some other high-priority work, so didn't get time to look into it further. Sorry about that. I expect to pick it back up in a couple of weeks.

Comment From: maxtacco

Hi, I have the same issue. What is the recommended solution for this case?

Comment From: maxtacco

Ok, for now I just enabled jar task to make things work. If archive names produced by jar and bootJar are the same one needs to add classifier property to either jar or bootJar as described in the docs or change archiveName property.

Comment From: wilkinsona

Gradle's maven plugin has been deprecated in favour of maven-publish so I don't think we should make any changes to our maven plugin integration.