I have the following build.gradle
content:
group 'com.example'
version '1.0-SNAPSHOT'
buildscript {
repositories {
mavenLocal()
mavenCentral()
jcenter()
maven { url "https://plugins.gradle.org/m2/" }
}
dependencies {
classpath "com.github.jengelman.gradle.plugins:shadow:2.0.1"
}
}
apply plugin: 'scala'
apply plugin: "com.github.johnrengelman.shadow"
sourceCompatibility = java_version
repositories {
mavenCentral()
}
dependencies {
// my dependencies:
compile group: 'org.apache.spark', name: "spark-sql_$scala_major", version: spark_version
testCompile group: 'junit', name: 'junit', version: '4.12'
}
The problem is that running gradle build
isn't creating a fat jar.
Looking at the task dependencies by running gradle tasks --all
shows that the shadowJar
task exists, but the build
task is not dependent on it:
:tasks
------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------
Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.
buildDependents - Assembles and tests this project and all projects that depend on it.
buildNeeded - Assembles and tests this project and all projects it depends on.
classes - Assembles main classes.
clean - Deletes the build directory.
jar - Assembles a jar archive containing the main classes.
testClasses - Assembles test classes.
Build Setup tasks
-----------------
init - Initializes a new Gradle build.
wrapper - Generates Gradle wrapper files.
Documentation tasks
-------------------
javadoc - Generates Javadoc API documentation for the main source code.
scaladoc - Generates Scaladoc for the main source code.
Help tasks
----------
buildEnvironment - Displays all buildscript dependencies declared in root project 'scalaGradleHW'.
components - Displays the components produced by root project 'scalaGradleHW'. [incubating]
dependencies - Displays all dependencies declared in root project 'scalaGradleHW'.
dependencyInsight - Displays the insight into a specific dependency in root project 'scalaGradleHW'.
dependentComponents - Displays the dependent components of components in root project 'scalaGradleHW'. [incubating]
help - Displays a help message.
model - Displays the configuration model of root project 'scalaGradleHW'. [incubating]
projects - Displays the sub-projects of root project 'scalaGradleHW'.
properties - Displays the properties of root project 'scalaGradleHW'.
tasks - Displays the tasks runnable from root project 'scalaGradleHW'.
Shadow tasks
------------
knows - Do you know who knows?
shadowJar - Create a combined JAR of project and runtime dependencies
Verification tasks
------------------
check - Runs all checks.
test - Runs the unit tests.
Other tasks
-----------
compileJava - Compiles main Java source.
compileScala - Compiles the main Scala source.
compileTestJava - Compiles test Java source.
compileTestScala - Compiles the test Scala source.
processResources - Processes main resources.
processTestResources - Processes test resources.
The 'build' task in Gradle is commonly mistaken for a task that builds all tasks in a project. The 'build' task is actually provided by the java-base plugin and includes the following tasks:
compileJava, processResources, classes, jar, assemble, compileTestJava, processTestResources, testClasses, test, and check
Instead of running 'gradle build' I recommend the use of defaultsTasks
`defaultTasks 'build', 'shadowJar'`
Putting that line in your build.gradle will allow Gradle to be invoked without arguments such that both build and shadowJar are both run.
> gradle
I am not familiar with the shadowJar plugin, but if it exposes a task named shadowJar, the use of a dependsOn line in build.gradle could simplify the defaultTasks line.
project.tasks.shadowJar.dependsOn build
simplifies the defaultTasks line to
defaultTasks 'shadowJar'