<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Maven on bramp.net</title>
    <link>https://blog.bramp.net/</link>
    <description>Recent content in Maven on bramp.net</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-GB</language>
    <lastBuildDate>Sat, 01 Apr 2017 15:21:27 -0700</lastBuildDate>
    <atom:link href="https://blog.bramp.net/tags/maven/" rel="self" type="application/rss+xml" />
    
    <item>
      <title>Maven Plugins on Java 8</title>
      <link>https://blog.bramp.net/post/2017/04/01/maven-plugins-on-java-8/</link>
      <pubDate>Sat, 01 Apr 2017 15:21:27 -0700</pubDate>
      
      <guid>https://blog.bramp.net/post/2017/04/01/maven-plugins-on-java-8/</guid>
      <description><p>As part of my standard Maven configuration, I like to use two plugins backed by Google technologies, the first to help keep my code formatted correctly, and the second to check for compile time errors. However, Google recently moved to require JDK 1.8, which broke anyone trying to compile my projects with an older JDK. In this article I&rsquo;ll quickly explain how to configure Maven to work around this problem.</p>
<p>Specifically I use the following two plugins:</p>
<ul>
<li>
<p><a href="https://github.com/coveo/fmt-maven-plugin">coveo/fmt-maven-plugin</a> (which uses <a href="https://github.com/google/google-java-format">google-java-format</a>). This follows the <a href="https://google.github.io/styleguide/javaguide.html">Google&rsquo;s Java Style</a> guide, and reformats the code to ensure it stays consistent. This is great when accepting external contributions, as it keeps the code base uniform, and avoids style discussion on pull requests.</p>
</li>
<li>
<p><a href="https://github.com/codehaus-plexus/plexus-compiler">plexus-compiler-javac-errorprone</a> (which uses Google&rsquo;s <a href="https://github.com/google/error-prone">errorprone</a>). This is a static code analysis tool, that checks for simple errors at compile time, and fails the build if they are found. Again, this helps improve the quality of the code.</p>
</li>
</ul>
<p>Even though my projects typically target 1.7, these plugins require to run under 1.8. Really I&rsquo;d prefer I could bump all my projects to target 1.8+, but since a few of my projects are libraries (which other people include into their projects), that is easier said than done. To deal with this, I changed my Maven configuration to only run these two plugins when run under the sufficient JDK. This means those using a older JDK don&rsquo;t get the benefits, but since locally I use JDK 8, and all my open source projects use <a href="https://travis-ci.org">Travis CI</a>, eventually these issues will be identified.</p>
<p>So if you get an error like</p>
<pre tabindex="0"><code>java.lang.UnsupportedClassVersionError: com/google/googlejavaformat/java/FormatterException : Unsupported major.minor version 52.0
</code></pre><p>or</p>
<pre tabindex="0"><code>An API incompatibility was encountered while executing org.apache.maven.plugins:maven-compiler-plugin:3.5.1:compile: java.lang.UnsupportedClassVersionError: javax/tools/DiagnosticListener : Unsupported major.minor version 52.0
</code></pre><p>Please update to JDK 1.8, or update your Maven configuration to restrict these plugins to when run on a modern JDK:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-xml" data-lang="xml"><span class="line"><span class="cl"><span class="nt">&lt;project&gt;</span>
</span></span><span class="line"><span class="cl">...
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;profiles&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&lt;profile&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="nt">&lt;id&gt;</span>java18<span class="nt">&lt;/id&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="nt">&lt;activation&gt;</span>
</span></span><span class="line"><span class="cl">                <span class="nt">&lt;jdk&gt;</span>1.8<span class="nt">&lt;/jdk&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="nt">&lt;/activation&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="nt">&lt;build&gt;</span>
</span></span><span class="line"><span class="cl">                <span class="nt">&lt;plugins&gt;</span>
</span></span><span class="line"><span class="cl">                    <span class="nt">&lt;plugin&gt;</span>
</span></span><span class="line"><span class="cl">                        <span class="nt">&lt;groupId&gt;</span>com.coveo<span class="nt">&lt;/groupId&gt;</span>
</span></span><span class="line"><span class="cl">                        <span class="nt">&lt;artifactId&gt;</span>fmt-maven-plugin<span class="nt">&lt;/artifactId&gt;</span>
</span></span><span class="line"><span class="cl">                        <span class="nt">&lt;executions&gt;</span>
</span></span><span class="line"><span class="cl">                            <span class="nt">&lt;execution&gt;</span>
</span></span><span class="line"><span class="cl">                                <span class="nt">&lt;goals&gt;</span>
</span></span><span class="line"><span class="cl">                                    <span class="nt">&lt;goal&gt;</span>format<span class="nt">&lt;/goal&gt;</span>
</span></span><span class="line"><span class="cl">                                <span class="nt">&lt;/goals&gt;</span>
</span></span><span class="line"><span class="cl">                            <span class="nt">&lt;/execution&gt;</span>
</span></span><span class="line"><span class="cl">                        <span class="nt">&lt;/executions&gt;</span>
</span></span><span class="line"><span class="cl">                    <span class="nt">&lt;/plugin&gt;</span>
</span></span><span class="line"><span class="cl">                    <span class="nt">&lt;plugin&gt;</span>
</span></span><span class="line"><span class="cl">                        <span class="nt">&lt;groupId&gt;</span>org.apache.maven.plugins<span class="nt">&lt;/groupId&gt;</span>
</span></span><span class="line"><span class="cl">                        <span class="nt">&lt;artifactId&gt;</span>maven-compiler-plugin<span class="nt">&lt;/artifactId&gt;</span>
</span></span><span class="line"><span class="cl">                        <span class="nt">&lt;configuration&gt;</span>
</span></span><span class="line"><span class="cl">                            <span class="nt">&lt;compilerId&gt;</span>javac-with-errorprone<span class="nt">&lt;/compilerId&gt;</span>
</span></span><span class="line"><span class="cl">                            <span class="nt">&lt;forceJavacCompilerUse&gt;</span>true<span class="nt">&lt;/forceJavacCompilerUse&gt;</span>
</span></span><span class="line"><span class="cl">                            <span class="nt">&lt;showWarnings&gt;</span>true<span class="nt">&lt;/showWarnings&gt;</span>
</span></span><span class="line"><span class="cl">                            <span class="nt">&lt;compilerArgs&gt;</span>
</span></span><span class="line"><span class="cl">                                <span class="nt">&lt;arg&gt;</span>-Xlint:all<span class="nt">&lt;/arg&gt;</span>
</span></span><span class="line"><span class="cl">                            <span class="nt">&lt;/compilerArgs&gt;</span>
</span></span><span class="line"><span class="cl">                        <span class="nt">&lt;/configuration&gt;</span>
</span></span><span class="line"><span class="cl">                        <span class="nt">&lt;dependencies&gt;</span>
</span></span><span class="line"><span class="cl">                            <span class="nt">&lt;dependency&gt;</span>
</span></span><span class="line"><span class="cl">                                <span class="nt">&lt;groupId&gt;</span>org.codehaus.plexus<span class="nt">&lt;/groupId&gt;</span>
</span></span><span class="line"><span class="cl">                                <span class="nt">&lt;artifactId&gt;</span>plexus-compiler-javac-errorprone<span class="nt">&lt;/artifactId&gt;</span>
</span></span><span class="line"><span class="cl">                                <span class="nt">&lt;version&gt;</span>2.8.1<span class="nt">&lt;/version&gt;</span>
</span></span><span class="line"><span class="cl">                            <span class="nt">&lt;/dependency&gt;</span>
</span></span><span class="line"><span class="cl">                            <span class="c">&lt;!-- override plexus-compiler-javac-errorprone&#39;s dependency on
</span></span></span><span class="line"><span class="cl"><span class="c">                                 Error Prone with the latest version --&gt;</span>
</span></span><span class="line"><span class="cl">                            <span class="nt">&lt;dependency&gt;</span>
</span></span><span class="line"><span class="cl">                                <span class="nt">&lt;groupId&gt;</span>com.google.errorprone<span class="nt">&lt;/groupId&gt;</span>
</span></span><span class="line"><span class="cl">                                <span class="nt">&lt;artifactId&gt;</span>error_prone_core<span class="nt">&lt;/artifactId&gt;</span>
</span></span><span class="line"><span class="cl">                                <span class="nt">&lt;version&gt;</span>2.0.19<span class="nt">&lt;/version&gt;</span>
</span></span><span class="line"><span class="cl">                            <span class="nt">&lt;/dependency&gt;</span>
</span></span><span class="line"><span class="cl">                        <span class="nt">&lt;/dependencies&gt;</span>
</span></span><span class="line"><span class="cl">                    <span class="nt">&lt;/plugin&gt;</span>
</span></span><span class="line"><span class="cl">                <span class="nt">&lt;/plugins&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="nt">&lt;/build&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&lt;/profile&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;/profiles&gt;</span>
</span></span><span class="line"><span class="cl">...
</span></span><span class="line"><span class="cl"><span class="nt">&lt;/project&gt;</span>
</span></span></code></pre></div><p>This defines a new profile, that is only &ldquo;activated&rdquo; under Java 1.8. When activated the <code>&lt;build&gt;</code> section has the two additional plugins added.
Ensure that these plugins are no longer mentioned in the regular <code>&lt;build&gt;</code> section, and only in the <code>&lt;profile&gt;&lt;build&gt;</code> section.</p>
<p>An example of this change can be found in <a href="https://github.com/bramp/ffmpeg-cli-wrapper/commit/4985ba3ab3ef84839bc0f4ca8b63573b77e33c67">recent commit</a>.</p>
</description>
    </item>
    
  </channel>
</rss>
