I have this Gradle setup with four projects, a parent with three children, where a Java Servlet JSON 'backend' is built into a war-file, and then a static HTML5 'frontend' consuming this is built into a zip. Both these "installs" their artifcats to the local maven repo.
The third sibling project 'merger' depends on these two artifacts, to build a "merged" war by simply "zipping them together".
However, once I had this up and running as intended, I obviously had to test the bootstrap-scenario by deleting the artifacts from the local repo.
Now I suddenly get "Artifact 'no.company:frontend:1.0-SNAPSHOT@zip' not found".
Is it not possible to depend on artifacts which will be produced by the current build?
Edit:
Based on another idea (and the reply from Peter discouraging this Maven logic), this version looks promising, not traversing Maven (note: it works!):
// ## From frontend's build.gradle:
task zipFrontend(dependsOn: 'buildFrontend', type: Zip) {
from ('dist/')
}
// ## From backend's build.gradle:
apply plugin: 'war'
// ## From merger's build.gradle:
task mergeFrontAndBack(dependsOn: [':backend:war',
':frontend:zipFrontend'], type: War) {
from zipTree(project(':frontend').tasks['zipFrontend'].archivePath)
from zipTree(project(':backend').tasks['war'].archivePath)
destinationDir(buildDir)
}
Edit 2:
Based upon Peter's comment about not reaching into siblings' project structure and his concrete suggestions, here's the resulting piece (note: it works!):
// ## From frontend's build.gradle:
task zipFrontend(dependsOn: 'buildFrontend', type: Zip) {
from ('dist/')
}
configurations { zip }
artifacts { zip zipFrontend }
// ## From backend's build.gradle:
apply plugin: 'war'
configurations { jsonOnlyWar }
artifacts { jsonOnlyWar war }
// ## From merger's build.gradle:
configurations { merge }
dependencies {
merge project(path: ':backend', configuration: 'jsonOnlyWar')
merge project(path: ':frontend', configuration: 'zip')
}
task mergeFrontAndBack(dependsOn: configurations.merge, type: War) {
from { configurations.merge.collect { zipTree(it) } }
destinationDir(buildDir)
}
A project dependency is a special form of an execution dependency. It causes the other project to be built first and adds the jar with the classes of the other project to the classpath. It also adds the dependencies of the other project to the classpath. You can trigger a gradle :api:compile .
Releases of a module hosted on a repository can provide metadata to declare those transitive dependencies. By default, Gradle resolves transitive dependencies automatically. The version selection for transitive dependencies can be influenced by declaring dependency constraints.
Simply open the gradle tab (can be located on the right) and right-click on the parent in the list (should be called "Android"), then select "Refresh dependencies". This should resolve your issue.
The local Maven repository (and Gradle's install
task) should only be used when exchanging artifacts with Maven builds. It's not meant to be used for exchanging artifacts between projects of a Gradle build, and installing into the local Maven repository won't happen automatically.
Instead, merger
needs to declare project dependencies on the other two projects. For example:
configurations {
merge
}
dependencies {
merge project(":frontend"), project(":backend")
}
task merge(type: Zip) {
from { configurations.merge.collect { zipTree(it) } }
}
This assumes that frontend
and backend
correctly declare their artifacts. (This may happen automatically, for example if the war
plugin is used.)
You'll find much more on this in the Gradle User Guide, in particular the multi-project builds chapter.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With