Skip to content
This repository has been archived by the owner on Jun 10, 2021. It is now read-only.

ShadowJar + GradleNexusPlugin : Could not publish configuration 'archives' #67

Closed
sebastienvermeille opened this issue Sep 28, 2017 · 4 comments
Labels

Comments

@sebastienvermeille
Copy link

sebastienvermeille commented Sep 28, 2017

Hello Ben,
first of all thank you for maintaining and creation of this plugin.

In our project we use ShadowJar and I suppose it breaks a little bit the workflow of your plugin :/

Here is what I have in my build.gradle:

apply plugin: 'java'
apply plugin:'application'
apply plugin: 'com.github.johnrengelman.shadow'
apply plugin: 'com.bmuschko.nexus'
apply plugin: 'signing'

shadowJar {
    classifier = null // don't add "-all" to the generated jar
}

nexus {
    sign = true
    repositoryUrl = 'myrepo'
    snapshotRepositoryUrl = 'myRepo'
}

With this when I run gradle install :

:core:compileJava UP-TO-DATE
:core:processResources UP-TO-DATE
:core:generateBuildInfo UP-TO-DATE
:core:classes UP-TO-DATE
:core:jar UP-TO-DATE
:myapp:compileJava UP-TO-DATE
:myapp:processResources UP-TO-DATE
:myapp:generateBuildInfo UP-TO-DATE
:myapp:classes UP-TO-DATE
:myapp:jar
:myapp:startScripts UP-TO-DATE
:myapp:distTar
:myapp:distZip
:core:javadoc UP-TO-DATE
:myapp:javadoc UP-TO-DATE
:myapp:javadocJar UP-TO-DATE
:myapp:shadowJar
:myapp:startShadowScripts
:myapp:shadowDistTar
:myapp:shadowDistZip
:myapp:sourcesJar UP-TO-DATE
:myapp:compileTestJava UP-TO-DATE
:myapp:processTestResources NO-SOURCE
:myapp:testClasses UP-TO-DATE
:myapp:testsJar UP-TO-DATE
:myapp:signArchives SKIPPED
:myapp:install FAILED


FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':myapp:install'.
> Could not publish configuration 'archives'
   > A POM cannot have multiple artifacts with the same type and classifier. Already have MavenArtifact myapp:zip:zip:null, trying to add MavenArtifact myapp:zip:zip:null.

And this generate me :

build
|
|- distributions
    |- myapp-2.1.0R0-SNAPSHOT.tar
    |- myapp-2.1.0R0-SNAPSHOT.zip
    |- myapp-shadow-2.1.0R0-SNAPSHOT.tar
    |- myapp-shadow-2.1.0R0-SNAPSHOT.zip
|- libs
   |- myapp-2.1.0R0-SNAPSHOT.jar
   |- myapp-2.1.0R0-SNAPSHOT-javadoc.jar
   |- myapp-2.1.0R0-SNAPSHOT-sources.jar
   |- myapp-2.1.0R0-SNAPSHOT-tests.jar

After some investigations I discovered (maybe I am wrong) that I have multiple files with the same name (exl extension) in distributions directory maybe causing a problem.

So I added :

distZip.enabled = false
distTar.enabled = false
shadowDistTar.enabled = false
shadowDistZip.enabled = true

And then I only get :

build
|
|- distributions
    |- myapp-2.1.0R0-SNAPSHOT.zip <----- only one file
|- libs
   |- myapp-2.1.0R0-SNAPSHOT.jar
   |- myapp-2.1.0R0-SNAPSHOT-javadoc.jar
   |- myapp-2.1.0R0-SNAPSHOT-sources.jar
   |- myapp-2.1.0R0-SNAPSHOT-tests.jar

And the error is now:

* What went wrong:
Execution failed for task ':myapp:install'.
> Could not publish configuration 'archives'
   > Cannot publish artifact 'myapp.zip (com.company.project:myapp:2.1.0R0-SNAPSHOT)' (/home/me/git/projectxyz/myapp/build/distributions/myapp-2.1.0R0-SNAPSHOT.zip) as it does not exist.

Any idea about that ? I am really stucked here I spent almost one entire day around it looking on some help on irc but well it seems quite complicated to fix without really knowing gradle workflow.

Bonus (stacktrace):

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':myapp:install'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:98)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:68)
        at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:62)
        at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
        at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:88)
        at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:51)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
        at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.execute(DefaultTaskGraphExecuter.java:236)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.execute(DefaultTaskGraphExecuter.java:228)
        at org.gradle.internal.Transformers$4.transform(Transformers.java:169)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:106)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:61)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:228)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:215)
        at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:77)
        at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:58)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:32)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:113)
        at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:37)
        at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37)
        at org.gradle.execution.DefaultBuildExecuter.access$000(DefaultBuildExecuter.java:23)
        at org.gradle.execution.DefaultBuildExecuter$1.proceed(DefaultBuildExecuter.java:43)
        at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32)
        at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37)
        at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:30)
        at org.gradle.initialization.DefaultGradleLauncher$RunTasksAction.execute(DefaultGradleLauncher.java:230)
        at org.gradle.initialization.DefaultGradleLauncher$RunTasksAction.execute(DefaultGradleLauncher.java:227)
        at org.gradle.internal.Transformers$4.transform(Transformers.java:169)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:106)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:56)
        at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:161)
        at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:112)
        at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:95)
        at org.gradle.launcher.exec.GradleBuildController.run(GradleBuildController.java:66)
        at org.gradle.tooling.internal.provider.ExecuteBuildActionRunner.run(ExecuteBuildActionRunner.java:28)
        at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:41)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:26)
        at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:75)
        at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:49)
        at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:49)
        at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:31)
        at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:67)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72)
        at org.gradle.util.Swapper.swap(Swapper.java:38)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:60)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:72)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)
        at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:297)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
        at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:46)
Caused by: org.gradle.api.artifacts.PublishException: Could not publish configuration 'archives'
        at org.gradle.api.tasks.Upload.upload(Upload.java:67)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
        at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.doExecute(DefaultTaskClassInfoStore.java:141)
        at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:134)
        at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:123)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:692)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:675)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.execute(ExecuteActionsTaskExecuter.java:115)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.execute(ExecuteActionsTaskExecuter.java:109)
        at org.gradle.internal.Transformers$4.transform(Transformers.java:169)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:106)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:56)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:109)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:90)
        ... 70 more
Caused by: org.gradle.api.artifacts.PublishException: Cannot publish artifact 'myapp.zip (com.company.project:myapp:2.1.0R0-SNAPSHOT)' (/home/me/git/project/myapp/build/distributions/myapp-2.1.0R0-SNAPSHOT.zip) as it does not exist.
        at org.gradle.api.internal.artifacts.ivyservice.publisher.DefaultIvyDependencyPublisher.checkArtifactFileExists(DefaultIvyDependencyPublisher.java:64)
        at org.gradle.api.internal.artifacts.ivyservice.publisher.DefaultIvyDependencyPublisher.addPublishedArtifact(DefaultIvyDependencyPublisher.java:53)
        at org.gradle.api.internal.artifacts.ivyservice.publisher.DefaultIvyDependencyPublisher.publish(DefaultIvyDependencyPublisher.java:41)
        at org.gradle.api.internal.artifacts.ivyservice.publisher.IvyBackedArtifactPublisher.publish(IvyBackedArtifactPublisher.java:78)
        at org.gradle.api.internal.artifacts.ivyservice.IvyContextualArtifactPublisher$1.execute(IvyContextualArtifactPublisher.java:43)
        at org.gradle.api.internal.artifacts.ivyservice.IvyContextualArtifactPublisher$1.execute(IvyContextualArtifactPublisher.java:40)
        at org.gradle.internal.Transformers$4.transform(Transformers.java:169)
        at org.gradle.api.internal.artifacts.ivyservice.DefaultIvyContextManager.withIvy(DefaultIvyContextManager.java:61)
        at org.gradle.api.internal.artifacts.ivyservice.DefaultIvyContextManager.withIvy(DefaultIvyContextManager.java:39)
        at org.gradle.api.internal.artifacts.ivyservice.IvyContextualArtifactPublisher.publish(IvyContextualArtifactPublisher.java:40)
        at org.gradle.api.tasks.Upload.upload(Upload.java:65)
        ... 83 more


BUILD FAILED

Thank you very much in advance for your support. I hope I gave you all the keys to help me if it's not the case I would be happy to give you more informations.

@bmuschko
Copy link
Owner

bmuschko commented Oct 2, 2017

The reason this is happen is that the application plugin and the shadow plugin both create a JAR without a classifier. I'd need to further understand the use case you are trying to solve.

  • Why do you need the Shadow plugin exactly?
  • Why do you need the application plugin?
  • What is it you want to achieve?

@sebastienvermeille
Copy link
Author

sebastienvermeille commented Oct 3, 2017

@bmuschko my goal is to host our "fat" jars on a nexus repository. These are basically servers, or utilities that need to be versioned.

We use application plugin because we build some executables jar (hosted too on nexus) I created a maven registry extra for releases-stable releases-snapshot and so on

We use shadowJar because we want only one jar for our release. We start our rules-engine simply with java -jar rules-engine.jar . No need to place some libs somewhere and so on (easier to deploy/use).

Of course everything can be discussed but I think it's not wrong to want this :/

Do you mean application plugin and shadowjar are conflicting each others?

@bmuschko
Copy link
Owner

bmuschko commented Oct 3, 2017

We use application plugin because we build some executables jar (hosted too on nexus) I created a maven registry extra for releases-stable releases-snapshot and so on

The application plugin doesn't build executable JARs. It just creates distributions (bundled as ZIP or TAR files) that contain shell/batch scripts plus the JAR of your project and external dependencies. The JAR you are creating is still the plain JAR you'd get when applying the Java plugin.

We use shadowJar because we want only one jar for our release. We start our rules-engine simply with java -jar rules-engine.jar . No need to place some libs somewhere and so on (easier to deploy/use).

Then I don't get why you need the application plugin.

Do you mean application plugin and shadowjar are conflicting each others?

They are conflicting in the way you configured them for publishing. You removed the classifier from the JAR created by the Shadow plugin. In turn the JAR files from the application plugin and the Shadow plugin will have the same name and publishing attributes.

@sebastienvermeille
Copy link
Author

@bmuschko good to know. Thank for your explanations.

I thought the application plugin's role was to embed other libraries but in fact it is done in the shadowJar plugin. So effectively -> no need of application plugin.

After that I had to change some things that way:

def mainClassName = "com.company.project.MyMainClass"
jar {
    manifest {
        attributes 'Main-Class': mainClassName
    }
}

jar {
    manifest {
        attributes 'Main-Class': mainClassName
    }
}

shadowJar {
    mergeServiceFiles()
    configurations = [project.configurations.compile]
    classifier = null
}

artifacts {
    archives shadowJar
}

And now when I run :

gradle install or gradle uploadArchives

I get my javadoc, sources, tests, and fatjar uploaded to nexus like a charm :) It's beautifull

Thank you for your help ben !

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
Projects
None yet
Development

No branches or pull requests

2 participants