# Google Java Formatter as external application

**URL:** <https://discuss.gradle.org/t/google-java-formatter-as-external-application/19775>\
**Category:** Help/Discuss\
**Created:** [September 28, 2016, 2:49pm UTC](https://discuss.gradle.org/t/google-java-formatter-as-external-application/19775 "2016-09-28T14:49:53Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![sormuras](https://sea1.discourse-cdn.com/gradle/user_avatar/discuss.gradle.org/sormuras/32/5611_2.png) [@sormuras](https://discuss.gradle.org/u/sormuras)\
**Post date:** [September 28, 2016, 2:49pm UTC](https://discuss.gradle.org/t/google-java-formatter-as-external-application/19775/1 "2016-09-28T14:49:54Z")

</div>

Running the current snapshot version of [Google-Java-Formatter](https://github.com/sormuras/google-java-format) against all source sets, I frist tried the plugin [https://github.com/sherter/google-java-format-gradle-plugin](https://github.com/sherter/google-java-format-gradle-plugin). It does not support the current snapshot API. Here’s my hand-crafted solution. Download with dependencies and execute as a Java program:

```
configurations {
    format
}

dependencies {
    format "com.google.googlejavaformat:google-java-format:1.2-SNAPSHOT"
}

task downloadFormat(type: Copy) {
    from configurations.format
    into "$buildDir/format"
}

task runFormat(type: JavaExec) {

    def mainJavaFiles = sourceSets.main.allJava.files
    mainJavaFiles.removeIf{ file -> file.name.endsWith('module-info.java') }

    classpath = fileTree(dir: "$buildDir/format", include: '*.jar')

    main 'com.google.googlejavaformat.java.Main'
    args '--replace'
    args mainJavaFiles
    args sourceSets.test.allJava.files
}

runFormat.dependsOn downloadFormat

```

Is there a more Gradle-way to solve this?

---

<div class="post-metadata">

**Author:** ![Ned\_Twigg](https://sea1.discourse-cdn.com/gradle/user_avatar/discuss.gradle.org/ned_twigg/32/1516_2.png) [@Ned\_Twigg](https://discuss.gradle.org/u/Ned_Twigg)\
**Post date:** [October 6, 2016, 5:28pm UTC](https://discuss.gradle.org/t/google-java-formatter-as-external-application/19775/2 "2016-10-06T17:28:09Z")

</div>

Don’t mean to sidetrack you, but it might be easier to accomplish this using the [spotless](https://github.com/diffplug/spotless) plugin, which formats code using the Eclipse formatter.

```groovy
plugins {
    id 'com.diffplug.gradle.spotless' version '2.0.0'
}

spotless {
    java {
        eclipseFormatFile 'googlestyle.xml'
    }
}

```

Google [maintains an eclipse formatter for their style](https://github.com/google/styleguide/blob/gh-pages/eclipse-java-google-style.xml).

---

<div class="post-metadata">

**Author:** ![sormuras](https://sea1.discourse-cdn.com/gradle/user_avatar/discuss.gradle.org/sormuras/32/5611_2.png) [@sormuras](https://discuss.gradle.org/u/sormuras)\
**Post date:** [October 7, 2016, 10:13am UTC](https://discuss.gradle.org/t/google-java-formatter-as-external-application/19775/3 "2016-10-07T10:13:25Z")

</div>

Hi Ned, Google maintain- **ed** it until **4 Feb 2014**.

The sweet thing about google-java-format is that it does not require any configuration - just run it out of the box.

---

<div class="post-metadata">

**Author:** ![Ned\_Twigg](https://sea1.discourse-cdn.com/gradle/user_avatar/discuss.gradle.org/ned_twigg/32/1516_2.png) [@Ned\_Twigg](https://discuss.gradle.org/u/Ned_Twigg)\
**Post date:** [October 7, 2016, 3:48pm UTC](https://discuss.gradle.org/t/google-java-formatter-as-external-application/19775/4 "2016-10-07T15:48:43Z")

</div>

Good to know. I’ve added an issue to Spotless for handling this.

> <https://github.com/diffplug/spotless/issues/33>

---

<div class="post-metadata">

**Author:** ![Ned\_Twigg](https://sea1.discourse-cdn.com/gradle/user_avatar/discuss.gradle.org/ned_twigg/32/1516_2.png) [@Ned\_Twigg](https://discuss.gradle.org/u/Ned_Twigg)\
**Post date:** [October 7, 2016, 5:41pm UTC](https://discuss.gradle.org/t/google-java-formatter-as-external-application/19775/5 "2016-10-07T17:41:43Z")

</div>

Turns out someone is using Spotless to do what you want. Here’s a code snippet:

```gradle
buildscript {
    repositories {
        jcenter()
        maven { url 'https://oss.sonatype.org/content/repositories/snapshots' }
    }
    dependencies {
        classpath 'com.google.googlejavaformat:google-java-format:1.2-SNAPSHOT'
    }
}

plugins {
    id "com.diffplug.gradle.spotless" version "2.1.0"
}

spotless {
    java {
        customLazyGroovy('google-java-format') {
            com.google.googlejavaformat.java.Formatter formatter = new com.google.googlejavaformat.java.Formatter()
            return { source -> formatter.formatSource(source) }
        }
    }
}

```

---

<div class="post-metadata">

**Author:** ![sormuras](https://sea1.discourse-cdn.com/gradle/user_avatar/discuss.gradle.org/sormuras/32/5611_2.png) [@sormuras](https://discuss.gradle.org/u/sormuras)\
**Post date:** [October 7, 2016, 6:58pm UTC](https://discuss.gradle.org/t/google-java-formatter-as-external-application/19775/6 "2016-10-07T18:58:38Z")

</div>

> [@Ned\_Twigg](#):
>
> ```
> customLazyGroovy
> 
> ```

Fresh from spotless 2.1.0 😉 Looks promising,

---

<div class="post-metadata">

**Author:** ![Ned\_Twigg](https://sea1.discourse-cdn.com/gradle/user_avatar/discuss.gradle.org/ned_twigg/32/1516_2.png) [@Ned\_Twigg](https://discuss.gradle.org/u/Ned_Twigg)\
**Post date:** [October 7, 2016, 7:11pm UTC](https://discuss.gradle.org/t/google-java-formatter-as-external-application/19775/7 "2016-10-07T19:11:03Z")

</div>

😆 Yeah. I’ve long told people "use `customLazy`", but turns out that Groovy and Java 8 functional interfaces only sort of get along, so I finally found out today that we needed a groovy-workaround for Groovy buildscripts.

---

<div class="post-metadata">

**Author:** ![sormuras](https://sea1.discourse-cdn.com/gradle/user_avatar/discuss.gradle.org/sormuras/32/5611_2.png) [@sormuras](https://discuss.gradle.org/u/sormuras)\
**Post date:** [October 7, 2016, 7:38pm UTC](https://discuss.gradle.org/t/google-java-formatter-as-external-application/19775/8 "2016-10-07T19:38:22Z")

</div>

[:spotlessApplied](https://github.com/sormuras/stash/commit/63464666f469fb58f0612d651fc83b7b3118eccf)

Thanks.

---

<div class="post-metadata">

**Author:** ![sormuras](https://sea1.discourse-cdn.com/gradle/user_avatar/discuss.gradle.org/sormuras/32/5611_2.png) [@sormuras](https://discuss.gradle.org/u/sormuras)\
**Post date:** [October 7, 2016, 10:51pm UTC](https://discuss.gradle.org/t/google-java-formatter-as-external-application/19775/9 "2016-10-07T22:51:12Z")

</div>

Since **spotless 2.2.0** Ned added support for google-java-format directly. See [https://github.com/diffplug/spotless#applying-to-java-source-google-java-format](https://github.com/diffplug/spotless#applying-to-java-source-google-java-format)

```
spotless {
    java {
        googleJavaFormat()
    }
}
```
