# Gradle Command-Line

Useful commands (`gw` comes from https://github.com/dougborg/gdub, otherwise `./gradlew` can be used instead):

## Build and run

      # Build and start JMeter GUI
      gw runGui

      # Build project and copy relevant jars to rootDir/lib, and start JMeter
      gw createDist; ./bin/jmeter

      # Build all distributions (source, binary)
      gw :src:dist:assemble

## Base project info

      # Display all submodules
      gw projects

      # Different tasks for current module
      gw tasks

## Cleaning build directories

Technically `clean` should not be required, every time it is required it might be a bug.
However it might be useful to perform a "clean" build:

      # Cleans current project (submodule)
      gw clean

      # Cleans the specified project
      gw :src:core:clean

## Dependencies

      # Displays dependencies. Gradle's "configurations" are something like different classpaths.
      gw dependencies

      # Displays dependencies for all projects
      gw allDependencies

      # Analyze why the project depends on `org.ow2.asm:asm`
      gw dependencyInsight --dependency org.ow2.asm:asm

      # Verify checksums of dependencies
      # Checksum verification is done by default
      # Expected checksums are stored in /checksum.properties file
      # Actual checksums are stored in /build/checksum/computed.checksum.properties

## Static checks

### Release Audit Tool

      # Run RAT
      gw rat

### Code Formatting

      # Run spotlessApply and checkstyleAll
      gw style

      # Run checkstlye for all
      gw checkstyleAll

#### Fine Grained Formatting Commands

      # Run checkstyle for main (non-test) code
      gw checkstyleMain

      # Run checkstyle for test code
      gw checkstyleTest

      # Run Spotless checks
      gw spotlessCheck

      # Fix any issues found by Spotless
      gw spotlessApply

## Compiling Code

      gw compileJava
      gw compileTestJava
      ...

## Build Project

      # Just build jar (see build/libs/*.jar)
      gw jar

      # "build" is a default task to "execute all the actions"
      gw build

      # Test might be skipped by `-x test` (Gradle's default way to skip task by name)
      gw -x test build

      # Build project in parallel
      gw build --parallel

## Tests

Gradle automatically tracks task dependencies, so if you modify a file in `/src/jorphan/*`,
then you can invoke `gw check` at project level or in `core`, and Gradle will automatically
build only the required jars and files.

      # Runs all the tests (unit tests, checkstyle, etc)
      gw check

      # Runs just unit tests
      gw test

      # Runs just core tests
      gw :src:core:test

## Coverage

      # Generates code coverage report for the test task to build/reports/jacoco/test/html
      gw jacocoTestReport

      # Generate combined coverage report
      gw jacocoReport

## Generate Javadocs

      # Builds javadoc to build/docs/javadoc subfolder
      gw javadoc

      # Builds javadoc jar to build/libs/jorphan-javadoc.jar
      gw javadocJar

## Site

      # Creates preview of a site to build/docs/site
      gw :src:dist:previewSite

      # Builds and publishes site preview to a Git repository
      gw :src:dist:pushPreviewSite

## Maven

      # publishes Maven artifact to local repository
      gw publishToMavenLocal

      # Generate all pom files
      # The resulting files are placed under build/publications folder
      gw generatePom

## Release Artifacts

      # Builds ZIP and TGZ artifacts for the release
      gw :src:dist:assemble

## Signing

It is implemented via [gradle signing plugin](https://docs.gradle.org/5.2.1/userguide/signing_plugin.html),
so it is done automatically provided credentials are specified via
[signatory credentials](https://docs.gradle.org/5.2.1/userguide/signing_plugin.html#sec:signatory_credentials)

      # Signs all the artifacts of the current module
      # see results in build/**/*.asc
      gw sign
> **Note:** signing is performed as a part of *release artifact build* so it will be
> performed with `gw :src:dist:assemble`

## Releasing

      # Builds the project, pushes artifacts to svn://.../dev,
      # stages artifacts to Nexus staging repository
      gw prepareVote -Prc=1

> **Note:** The above step uses [an asf-like release environment](https://github.com/vlsi/asflike-release-environment),
> so it does not alter public repositories

      # Prepare another release candidate
      gw prepareVote -Prc=2 -Pasf

      # Release staged artifacts to SVN and Nexus
      gw publishDist -Prc=2 -Pasf
