<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Java Build Tools &#8211; Best DevOps</title>
	<atom:link href="https://www.bestdevops.com/tag/java-build-tools/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.bestdevops.com</link>
	<description>Lets Learn, Do it &#38; Share! Thats a Best DevOps!!!</description>
	<lastBuildDate>Sun, 27 Jun 2021 09:58:24 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>
	<item>
		<title>Java Build Tools: Ant vs. Maven vs. Gradle</title>
		<link>https://www.bestdevops.com/java-build-tools-ant-vs-maven-vs-gradle/</link>
					<comments>https://www.bestdevops.com/java-build-tools-ant-vs-maven-vs-gradle/#respond</comments>
		
		<dc:creator><![CDATA[anil]]></dc:creator>
		<pubDate>Mon, 01 May 2017 08:48:51 +0000</pubDate>
				<category><![CDATA[Build and Release]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[DevOps Tools]]></category>
		<category><![CDATA[Ant]]></category>
		<category><![CDATA[Ant or Maven or Gradle]]></category>
		<category><![CDATA[Build Tools]]></category>
		<category><![CDATA[Gradle]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Java Build Tools]]></category>
		<category><![CDATA[Maven]]></category>
		<guid isPermaLink="false">http://www.bestdevops.com/?p=1426</guid>

					<description><![CDATA[Source &#8211; 126kr.com For anything but the most trivial applications, compiling Java from the command line is an exercise in masochism. [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Source &#8211; 126kr.com</p>
<p>For anything but the most trivial applications, compiling Java from the command line is an exercise in masochism. The difficulty including dependencies and making executable .<span id="IL_AD2" class="IL_AD">jar files</span>is why build tools were created.</p>
<p>For this example, we will be compiling this trivial application:</p>
<div>
<div id="highlighter_823465" class="syntaxhighlighter html">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="html plain">package com.example.iscream;</code></div>
<div class="line number2 index1 alt1"></div>
<div class="line number3 index2 alt2"><code class="html plain">import com.example.iscream.service.DailySpecialService;</code></div>
<div class="line number4 index3 alt1"><code class="html plain">import java.util.List;</code></div>
<div class="line number5 index4 alt2"></div>
<div class="line number6 index5 alt1"><code class="html plain">public class Application {</code></div>
<div class="line number7 index6 alt2"><code class="html spaces">    </code><code class="html plain">public static void main(String[] args) {</code></div>
<div class="line number8 index7 alt1"><code class="html spaces">        </code><code class="html plain">System.out.println("Starting store!\n\n==============\n");</code></div>
<div class="line number9 index8 alt2"></div>
<div class="line number10 index9 alt1"><code class="html spaces">        </code><code class="html plain">DailySpecialService dailySpecialService = new DailySpecialService();</code></div>
<div class="line number11 index10 alt2"><code class="html spaces">        </code><code class="html plain">List&lt;</code><code class="html keyword">String</code><code class="html plain">&gt; dailySpecials = dailySpecialService.getSpecials();</code></div>
<div class="line number12 index11 alt1"></div>
<div class="line number13 index12 alt2"><code class="html spaces">        </code><code class="html plain">System.out.println("Today's specials are:");</code></div>
<div class="line number14 index13 alt1"><code class="html spaces">        </code><code class="html plain">dailySpecials.forEach(s -&gt; System.out.println(" - " + s));</code></div>
<div class="line number15 index14 alt2"><code class="html spaces">    </code><code class="html plain">}</code></div>
<div class="line number16 index15 alt1"><code class="html plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div>
<div id="highlighter_973604" class="syntaxhighlighter html">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="html plain">package com.example.iscream.service;</code></div>
<div class="line number2 index1 alt1"></div>
<div class="line number3 index2 alt2"><code class="html plain">import com.google.common.collect.Lists;</code></div>
<div class="line number4 index3 alt1"><code class="html plain">import java.util.List;</code></div>
<div class="line number5 index4 alt2"></div>
<div class="line number6 index5 alt1"><code class="html plain">public class DailySpecialService {</code></div>
<div class="line number7 index6 alt2"></div>
<div class="line number8 index7 alt1"><code class="html spaces">    </code><code class="html plain">public List&lt;</code><code class="html keyword">String</code><code class="html plain">&gt; getSpecials() {</code></div>
<div class="line number9 index8 alt2"><code class="html spaces">        </code><code class="html plain">return Lists.newArrayList("Salty Caramel", "Coconut Chip", "Maui Mango");</code></div>
<div class="line number10 index9 alt1"><code class="html spaces">    </code><code class="html plain">}</code></div>
<div class="line number11 index10 alt2"><code class="html plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<h3>Ant</h3>
<p>The program <code>make</code> has been used for over forty years to compile <span id="IL_AD1" class="IL_AD">source code</span> into applications. As such, it was the natural choice in Java’s early years. Unfortunately, a lot of the assumptions and conventions with C programs don’t translate well to the Java ecosystem. To make (har) building the Java Tomcat application easier, James Duncan Davidson wrote Ant. Soon, other open source projects started using Ant, and from there it quickly spread throughout the community.</p>
<h4>Build files</h4>
<p>Ant build files are written in XML and are called <code>build.xml</code> by convention. I know even the word “XML” makes some people shudder, but in small doses it isn’t too painful. I promise. Ant calls the different phases of the build process “targets”. Targets that are defined in the build file can then be invoked using the <code>ant TARGET</code> command where <code>TARGET</code> is the name of the target.</p>
<p>Here’s the complete build file with the defined targets:</p>
<div>
<div id="highlighter_725486" class="syntaxhighlighter html">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
<div class="line number27 index26 alt2">27</div>
<div class="line number28 index27 alt1">28</div>
<div class="line number29 index28 alt2">29</div>
<div class="line number30 index29 alt1">30</div>
<div class="line number31 index30 alt2">31</div>
<div class="line number32 index31 alt1">32</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="html plain">&lt;</code><code class="html keyword">project</code><code class="html plain">&gt;</code></div>
<div class="line number2 index1 alt1"></div>
<div class="line number3 index2 alt2"><code class="html spaces">    </code><code class="html plain">&lt;</code><code class="html keyword">path</code> <code class="html color1">id</code><code class="html plain">=</code><code class="html string">"classpath"</code><code class="html plain">&gt;</code></div>
<div class="line number4 index3 alt1"><code class="html spaces">        </code><code class="html plain">&lt;</code><code class="html keyword">fileset</code> <code class="html color1">dir</code><code class="html plain">=</code><code class="html string">"lib"</code> <code class="html color1">includes</code><code class="html plain">=</code><code class="html string">"**/*.jar"</code><code class="html plain">/&gt;</code></div>
<div class="line number5 index4 alt2"><code class="html spaces">    </code><code class="html plain">&lt;/</code><code class="html keyword">path</code><code class="html plain">&gt;</code></div>
<div class="line number6 index5 alt1"></div>
<div class="line number7 index6 alt2"><code class="html spaces">    </code><code class="html plain">&lt;</code><code class="html keyword">target</code> <code class="html color1">name</code><code class="html plain">=</code><code class="html string">"clean"</code><code class="html plain">&gt;</code></div>
<div class="line number8 index7 alt1"><code class="html spaces">        </code><code class="html plain">&lt;</code><code class="html keyword">delete</code> <code class="html color1">dir</code><code class="html plain">=</code><code class="html string">"build"</code><code class="html plain">/&gt;</code></div>
<div class="line number9 index8 alt2"><code class="html spaces">    </code><code class="html plain">&lt;/</code><code class="html keyword">target</code><code class="html plain">&gt;</code></div>
<div class="line number10 index9 alt1"></div>
<div class="line number11 index10 alt2"><code class="html spaces">    </code><code class="html plain">&lt;</code><code class="html keyword">target</code> <code class="html color1">name</code><code class="html plain">=</code><code class="html string">"compile"</code><code class="html plain">&gt;</code></div>
<div class="line number12 index11 alt1"><code class="html spaces">        </code><code class="html plain">&lt;</code><code class="html keyword">mkdir</code> <code class="html color1">dir</code><code class="html plain">=</code><code class="html string">"build/classes"</code><code class="html plain">/&gt;</code></div>
<div class="line number13 index12 alt2"><code class="html spaces">        </code><code class="html plain">&lt;</code><code class="html keyword">javac</code> <code class="html color1">srcdir</code><code class="html plain">=</code><code class="html string">"src/main/java"</code></div>
<div class="line number14 index13 alt1"><code class="html spaces">               </code><code class="html color1">destdir</code><code class="html plain">=</code><code class="html string">"build/classes"</code></div>
<div class="line number15 index14 alt2"><code class="html spaces">               </code><code class="html color1">classpathref</code><code class="html plain">=</code><code class="html string">"classpath"</code><code class="html plain">/&gt;</code></div>
<div class="line number16 index15 alt1"><code class="html spaces">    </code><code class="html plain">&lt;/</code><code class="html keyword">target</code><code class="html plain">&gt;</code></div>
<div class="line number17 index16 alt2"></div>
<div class="line number18 index17 alt1"><code class="html spaces">    </code><code class="html plain">&lt;</code><code class="html keyword">target</code> <code class="html color1">name</code><code class="html plain">=</code><code class="html string">"jar"</code><code class="html plain">&gt;</code></div>
<div class="line number19 index18 alt2"><code class="html spaces">        </code><code class="html plain">&lt;</code><code class="html keyword">mkdir</code> <code class="html color1">dir</code><code class="html plain">=</code><code class="html string">"build/jar"</code><code class="html plain">/&gt;</code></div>
<div class="line number20 index19 alt1"><code class="html spaces">        </code><code class="html plain">&lt;</code><code class="html keyword">jar</code> <code class="html color1">destfile</code><code class="html plain">=</code><code class="html string">"build/jar/IScream.jar"</code> <code class="html color1">basedir</code><code class="html plain">=</code><code class="html string">"build/classes"</code><code class="html plain">/&gt;</code></div>
<div class="line number21 index20 alt2"><code class="html spaces">    </code><code class="html plain">&lt;/</code><code class="html keyword">target</code><code class="html plain">&gt;</code></div>
<div class="line number22 index21 alt1"></div>
<div class="line number23 index22 alt2"><code class="html spaces">    </code><code class="html plain">&lt;</code><code class="html keyword">target</code> <code class="html color1">name</code><code class="html plain">=</code><code class="html string">"run"</code> <code class="html color1">depends</code><code class="html plain">=</code><code class="html string">"jar"</code><code class="html plain">&gt;</code></div>
<div class="line number24 index23 alt1"><code class="html spaces">        </code><code class="html plain">&lt;</code><code class="html keyword">java</code> <code class="html color1">fork</code><code class="html plain">=</code><code class="html string">"true"</code> <code class="html color1">classname</code><code class="html plain">=</code><code class="html string">"com.example.iscream.Application"</code><code class="html plain">&gt;</code></div>
<div class="line number25 index24 alt2"><code class="html spaces">            </code><code class="html plain">&lt;</code><code class="html keyword">classpath</code><code class="html plain">&gt;</code></div>
<div class="line number26 index25 alt1"><code class="html spaces">                </code><code class="html plain">&lt;</code><code class="html keyword">path</code> <code class="html color1">refid</code><code class="html plain">=</code><code class="html string">"classpath"</code><code class="html plain">/&gt;</code></div>
<div class="line number27 index26 alt2"><code class="html spaces">                </code><code class="html plain">&lt;</code><code class="html keyword">path</code> <code class="html color1">location</code><code class="html plain">=</code><code class="html string">"build/jar/IScream.jar"</code><code class="html plain">/&gt;</code></div>
<div class="line number28 index27 alt1"><code class="html spaces">            </code><code class="html plain">&lt;/</code><code class="html keyword">classpath</code><code class="html plain">&gt;</code></div>
<div class="line number29 index28 alt2"><code class="html spaces">        </code><code class="html plain">&lt;/</code><code class="html keyword">java</code><code class="html plain">&gt;</code></div>
<div class="line number30 index29 alt1"><code class="html spaces">    </code><code class="html plain">&lt;/</code><code class="html keyword">target</code><code class="html plain">&gt;</code></div>
<div class="line number31 index30 alt2"></div>
<div class="line number32 index31 alt1"><code class="html plain">&lt;/</code><code class="html keyword">project</code><code class="html plain">&gt;</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>With these targets defined, you may run <code>ant clean</code> , <code>ant compile</code> , <code>ant jar</code> , <code>ant run</code> to compile, build, and run the application we built.</p>
<p>Of course, the build file you’re likely to encounter in a real project is going to be much more complex than this example. Ant has dozens of built-in tasks , and it’s possible to define custom tasks too. A typical build might move around files, assemble documentation, run tests, publish build artifacts, etc. If you are lucky and are working on a well-maintained project, the build file should “just work”. If not, you may have to make tweaks for your specific computer. Keep an eye out for <code>.properties</code> files referenced by the build file that may contain configurable filepaths, environments, etc.</p>
<h4>Summary</h4>
<p>While setting up a build script takes some time up front, hopefully you can see the benefit of using one over passing commands manually to Java. Of course, Ant isn’t without its own problems. First, there are few enforced standards in an Ant script. This provides flexibility, but at the cost of every build file being entirely different. In the same way that knowing Java doesn’t mean you can jump into any codebase, knowing Ant doesn’t mean you can jump into any Ant file–you need to take time to understand it. Second, the imperative nature of Ant means build scripts can get very, very long. One example I found is over 2000 lines long ! Finally, we learned Ant has no built-in capability for dependency management, although it can be supplemented with Ivy. These limitations along with some other build script annoyances led to the creation of Maven in the early 2000s.</p>
<h3>Maven</h3>
<p>Maven is really two tools in one: a dependency manager and a build tool. Like Ant it is XML-based, but unlike Ant, it outlines fairly rigid standards. Furthermore, Maven is declarative allowing you to define <em>what</em> your build should do and less about <em>how</em> to do it. These advantages make Maven appealing; build files are much more standard across projects and developers spend less time tailoring the files. As such, Maven has become somewhat of a de facto standard in the Java world.</p>
<h4>Maven Phases</h4>
<p>The most common build phases are included in Maven and can be executed by running <code>mvn PHASE</code> (where <code>PHASE</code> is the phase name). The most common phase you will invoke is <code>install</code>because it will fully build and test the project, then create a build artifact.</p>
<p>Although it isn’t actually a phase, the command <code>mvn clean</code> deserves a mention. Running that command will “clean” your local build directory (i.e. <code>/target</code> ), and remove compiled classes, resources, packages, etc. In theory, you should just be able to run <code>mvn <span id="IL_AD3" class="IL_AD">install</span></code> and your build directory will be updated automatically. However, it seems that enough developers (including myself) have been burned by this not working that we habitually run <code>mvn clean install</code> to force the project to build from scratch.</p>
<h4>Project Object Model (POM) Files</h4>
<p>Maven’s build files are called Project Object Model files, usually just abbreviated to POM, and are saved as <code>pom.xml</code> in the root directory of a project. In order for Maven to work out of the box, it’s important to follow this directory structure:</p>
<div>
<div id="highlighter_925346" class="syntaxhighlighter html">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="html plain">.</code></div>
<div class="line number2 index1 alt1"><code class="html plain">├── pom.xml</code></div>
<div class="line number3 index2 alt2"><code class="html plain">└── src</code></div>
<div class="line number4 index3 alt1"><code class="html spaces">    </code><code class="html plain">├── main</code></div>
<div class="line number5 index4 alt2"><code class="html spaces">    </code><code class="html plain">│   ├── java</code></div>
<div class="line number6 index5 alt1"><code class="html spaces">    </code><code class="html plain">│   │    &lt;-- Your Java code goes here</code></div>
<div class="line number7 index6 alt2"><code class="html spaces">    </code><code class="html plain">│   ├── resources</code></div>
<div class="line number8 index7 alt1"><code class="html spaces">    </code><code class="html plain">│   │    &lt;-- Non-code files that your app/library needs</code></div>
<div class="line number9 index8 alt2"><code class="html spaces">    </code><code class="html plain">└── test</code></div>
<div class="line number10 index9 alt1"><code class="html spaces">        </code><code class="html plain">├── java</code></div>
<div class="line number11 index10 alt2"><code class="html spaces">        </code><code class="html plain">│    &lt;-- Java tests</code></div>
<div class="line number12 index11 alt1"><code class="html spaces">        </code><code class="html plain">├── resources</code></div>
<div class="line number13 index12 alt2"><code class="html spaces">        </code><code class="html plain">│    &lt;-- Non-code files that your tests need</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>As mentioned previously, Maven has dependency management built in. The easiest way to find the correct values are from the project&#8217;s website or the MVNRepository site. For our build, we also need to use one of Apache&#8217;s official plugins&#8211;the Shade plugin. This plugin is used to build fat <code>.jar</code> files.</p>
<p>Here&#8217;s the complete POM file:</p>
<div>
<div id="highlighter_375242" class="syntaxhighlighter html">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
<div class="line number27 index26 alt2">27</div>
<div class="line number28 index27 alt1">28</div>
<div class="line number29 index28 alt2">29</div>
<div class="line number30 index29 alt1">30</div>
<div class="line number31 index30 alt2">31</div>
<div class="line number32 index31 alt1">32</div>
<div class="line number33 index32 alt2">33</div>
<div class="line number34 index33 alt1">34</div>
<div class="line number35 index34 alt2">35</div>
<div class="line number36 index35 alt1">36</div>
<div class="line number37 index36 alt2">37</div>
<div class="line number38 index37 alt1">38</div>
<div class="line number39 index38 alt2">39</div>
<div class="line number40 index39 alt1">40</div>
<div class="line number41 index40 alt2">41</div>
<div class="line number42 index41 alt1">42</div>
<div class="line number43 index42 alt2">43</div>
<div class="line number44 index43 alt1">44</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="html plain">&lt;?</code><code class="html keyword">xml</code> <code class="html color1">version</code><code class="html plain">=</code><code class="html string">"1.0"</code> <code class="html color1">encoding</code><code class="html plain">=</code><code class="html string">"UTF-8"</code><code class="html plain">?&gt;</code></div>
<div class="line number2 index1 alt1"><code class="html plain">&lt;</code><code class="html keyword">project</code> <code class="html color1">xmlns</code><code class="html plain">=</code><code class="html string">"http://maven.apache.org/POM/4.0.0"</code> <code class="html color1">xmlns:xsi</code><code class="html plain">=</code><code class="html string">"http://www.w3.org/2001/XMLSchema-instance"</code> <code class="html color1">xsi:schemaLocation</code><code class="html plain">=</code><code class="html string">"http://maven.apache.org/POM/4.0.0                       https://maven.apache.org/xsd/maven-4.0.0.xsd"</code><code class="html plain">&gt;</code></div>
<div class="line number3 index2 alt2"><code class="html spaces">   </code><code class="html plain">&lt;</code><code class="html keyword">modelVersion</code><code class="html plain">&gt;4.0.0&lt;/</code><code class="html keyword">modelVersion</code><code class="html plain">&gt;</code></div>
<div class="line number4 index3 alt1"><code class="html spaces">   </code><code class="html plain">&lt;</code><code class="html keyword">groupId</code><code class="html plain">&gt;com.example&lt;/</code><code class="html keyword">groupId</code><code class="html plain">&gt;</code></div>
<div class="line number5 index4 alt2"><code class="html spaces">   </code><code class="html plain">&lt;</code><code class="html keyword">artifactId</code><code class="html plain">&gt;iscream&lt;/</code><code class="html keyword">artifactId</code><code class="html plain">&gt;</code></div>
<div class="line number6 index5 alt1"><code class="html spaces">   </code><code class="html plain">&lt;</code><code class="html keyword">version</code><code class="html plain">&gt;0.0.1-SNAPSHOT&lt;/</code><code class="html keyword">version</code><code class="html plain">&gt;</code></div>
<div class="line number7 index6 alt2"><code class="html spaces">   </code><code class="html plain">&lt;</code><code class="html keyword">packaging</code><code class="html plain">&gt;jar&lt;/</code><code class="html keyword">packaging</code><code class="html plain">&gt;</code></div>
<div class="line number8 index7 alt1"><code class="html spaces">   </code><code class="html plain">&lt;</code><code class="html keyword">properties</code><code class="html plain">&gt;</code></div>
<div class="line number9 index8 alt2"><code class="html spaces">      </code><code class="html plain">&lt;</code><code class="html keyword">maven.compiler.source</code><code class="html plain">&gt;1.8&lt;/</code><code class="html keyword">maven.compiler.source</code><code class="html plain">&gt;</code></div>
<div class="line number10 index9 alt1"><code class="html spaces">      </code><code class="html plain">&lt;</code><code class="html keyword">maven.compiler.target</code><code class="html plain">&gt;1.8&lt;/</code><code class="html keyword">maven.compiler.target</code><code class="html plain">&gt;</code></div>
<div class="line number11 index10 alt2"><code class="html spaces">      </code><code class="html plain">&lt;</code><code class="html keyword">project.build.sourceEncoding</code><code class="html plain">&gt;UTF-8&lt;/</code><code class="html keyword">project.build.sourceEncoding</code><code class="html plain">&gt;</code></div>
<div class="line number12 index11 alt1"><code class="html spaces">   </code><code class="html plain">&lt;/</code><code class="html keyword">properties</code><code class="html plain">&gt;</code></div>
<div class="line number13 index12 alt2"><code class="html spaces">   </code><code class="html plain">&lt;</code><code class="html keyword">dependencies</code><code class="html plain">&gt;</code></div>
<div class="line number14 index13 alt1"><code class="html spaces">      </code><code class="html plain">&lt;</code><code class="html keyword">dependency</code><code class="html plain">&gt;</code></div>
<div class="line number15 index14 alt2"><code class="html spaces">         </code><code class="html plain">&lt;</code><code class="html keyword">groupId</code><code class="html plain">&gt;com.google.guava&lt;/</code><code class="html keyword">groupId</code><code class="html plain">&gt;</code></div>
<div class="line number16 index15 alt1"><code class="html spaces">         </code><code class="html plain">&lt;</code><code class="html keyword">artifactId</code><code class="html plain">&gt;guava&lt;/</code><code class="html keyword">artifactId</code><code class="html plain">&gt;</code></div>
<div class="line number17 index16 alt2"><code class="html spaces">         </code><code class="html plain">&lt;</code><code class="html keyword">version</code><code class="html plain">&gt;21.0&lt;/</code><code class="html keyword">version</code><code class="html plain">&gt;</code></div>
<div class="line number18 index17 alt1"><code class="html spaces">      </code><code class="html plain">&lt;/</code><code class="html keyword">dependency</code><code class="html plain">&gt;</code></div>
<div class="line number19 index18 alt2"><code class="html spaces">   </code><code class="html plain">&lt;/</code><code class="html keyword">dependencies</code><code class="html plain">&gt;</code></div>
<div class="line number20 index19 alt1"><code class="html spaces">   </code><code class="html plain">&lt;</code><code class="html keyword">build</code><code class="html plain">&gt;</code></div>
<div class="line number21 index20 alt2"><code class="html spaces">      </code><code class="html plain">&lt;</code><code class="html keyword">plugins</code><code class="html plain">&gt;</code></div>
<div class="line number22 index21 alt1"><code class="html spaces">         </code><code class="html plain">&lt;</code><code class="html keyword">plugin</code><code class="html plain">&gt;</code></div>
<div class="line number23 index22 alt2"><code class="html spaces">            </code><code class="html plain">&lt;</code><code class="html keyword">groupId</code><code class="html plain">&gt;org.apache.maven.plugins&lt;/</code><code class="html keyword">groupId</code><code class="html plain">&gt;</code></div>
<div class="line number24 index23 alt1"><code class="html spaces">            </code><code class="html plain">&lt;</code><code class="html keyword">artifactId</code><code class="html plain">&gt;maven-shade-plugin&lt;/</code><code class="html keyword">artifactId</code><code class="html plain">&gt;</code></div>
<div class="line number25 index24 alt2"><code class="html spaces">            </code><code class="html plain">&lt;</code><code class="html keyword">version</code><code class="html plain">&gt;2.3&lt;/</code><code class="html keyword">version</code><code class="html plain">&gt;</code></div>
<div class="line number26 index25 alt1"><code class="html spaces">            </code><code class="html plain">&lt;</code><code class="html keyword">executions</code><code class="html plain">&gt;</code></div>
<div class="line number27 index26 alt2"><code class="html spaces">               </code><code class="html plain">&lt;</code><code class="html keyword">execution</code><code class="html plain">&gt;</code></div>
<div class="line number28 index27 alt1"><code class="html spaces">                  </code><code class="html plain">&lt;</code><code class="html keyword">phase</code><code class="html plain">&gt;package&lt;/</code><code class="html keyword">phase</code><code class="html plain">&gt;</code></div>
<div class="line number29 index28 alt2"><code class="html spaces">                  </code><code class="html plain">&lt;</code><code class="html keyword">goals</code><code class="html plain">&gt;</code></div>
<div class="line number30 index29 alt1"><code class="html spaces">                     </code><code class="html plain">&lt;</code><code class="html keyword">goal</code><code class="html plain">&gt;shade&lt;/</code><code class="html keyword">goal</code><code class="html plain">&gt;</code></div>
<div class="line number31 index30 alt2"><code class="html spaces">                  </code><code class="html plain">&lt;/</code><code class="html keyword">goals</code><code class="html plain">&gt;</code></div>
<div class="line number32 index31 alt1"><code class="html spaces">                  </code><code class="html plain">&lt;</code><code class="html keyword">configuration</code><code class="html plain">&gt;</code></div>
<div class="line number33 index32 alt2"><code class="html spaces">                     </code><code class="html plain">&lt;</code><code class="html keyword">transformers</code><code class="html plain">&gt;</code></div>
<div class="line number34 index33 alt1"><code class="html spaces">                        </code><code class="html plain">&lt;</code><code class="html keyword">transformer</code> <code class="html color1">implementation</code><code class="html plain">=</code><code class="html string">"org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"</code><code class="html plain">&gt;</code></div>
<div class="line number35 index34 alt2"><code class="html spaces">                           </code><code class="html plain">&lt;</code><code class="html keyword">mainClass</code><code class="html plain">&gt;com.example.iscream.Application&lt;/</code><code class="html keyword">mainClass</code><code class="html plain">&gt;</code></div>
<div class="line number36 index35 alt1"><code class="html spaces">                        </code><code class="html plain">&lt;/</code><code class="html keyword">transformer</code><code class="html plain">&gt;</code></div>
<div class="line number37 index36 alt2"><code class="html spaces">                     </code><code class="html plain">&lt;/</code><code class="html keyword">transformers</code><code class="html plain">&gt;</code></div>
<div class="line number38 index37 alt1"><code class="html spaces">                  </code><code class="html plain">&lt;/</code><code class="html keyword">configuration</code><code class="html plain">&gt;</code></div>
<div class="line number39 index38 alt2"><code class="html spaces">               </code><code class="html plain">&lt;/</code><code class="html keyword">execution</code><code class="html plain">&gt;</code></div>
<div class="line number40 index39 alt1"><code class="html spaces">            </code><code class="html plain">&lt;/</code><code class="html keyword">executions</code><code class="html plain">&gt;</code></div>
<div class="line number41 index40 alt2"><code class="html spaces">         </code><code class="html plain">&lt;/</code><code class="html keyword">plugin</code><code class="html plain">&gt;</code></div>
<div class="line number42 index41 alt1"><code class="html spaces">      </code><code class="html plain">&lt;/</code><code class="html keyword">plugins</code><code class="html plain">&gt;</code></div>
<div class="line number43 index42 alt2"><code class="html spaces">   </code><code class="html plain">&lt;/</code><code class="html keyword">build</code><code class="html plain">&gt;</code></div>
<div class="line number44 index43 alt1"><code class="html plain">&lt;/</code><code class="html keyword">project</code><code class="html plain">&gt;</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>At this point you can run <code>mvn package</code> and you will see the <code>iscream-0.0.1-SNAPSHOT.jar</code> file inside of the <code>target</code> folder. If you run <code>java -jar iscream-0.0.1-SNAPSHOT.jar</code> you can run the application.</p>
<h4>Summary</h4>
<p>Although Maven has made considerable strides in making builds easier, all Maven users have found themselves banging their head against the wall with a tricky Maven problem at one time or another. I&#8217;ve already mentioned some usability problems with plugins, but there&#8217;s also the problem of &#8220;The Maven Way&#8221;. Anytime a build deviates from what Maven expects, it can be difficult to put in a work-around. Many projects are &#8220;normal&#8230;except for that one weird thing we have to do&#8221;. And the more &#8220;weird things&#8221; in the build, the harder it can be to bend Maven to your will. Wouldn&#8217;t it be great if we could combine the flexibility of Ant with the features of Maven? That&#8217;s exactly what Gradle is trying to do.</p>
<h3>Gradle</h3>
<p>The first thing you will notice about a Gradle build script is that it is not XML! In fact, Gradle uses a domain specific language (DSL) based on Groovy, which is another programming language that can run on the JVM.</p>
<p>The DSL defines both the core parts of the build file and specific build steps called &#8220;tasks&#8221;. It is also extensible making it very easy to define your own tasks. And of course, Gradle also has a rich third-party plugin library. Let&#8217;s dive in.</p>
<h4>Build files</h4>
<p>Gradle build files are appropriately named <code>build.gradle</code> and start out by configuring the build. For our project we need to take advantage of a fat jar plugin, so we will add the Shadow plugin to the build script configuration.</p>
<p>In order for Gradle to download the plugin, it has to look in a repository, which is an index for artifacts. Some repositories are known to Gradle and can be referred to simply as<code>mavenCentral()</code> or <code>jcenter()</code> . The Gradle team decided to not reinvent the wheel when it comes to repositories and instead relies on the existing Maven and Ivy dependency ecosystems.</p>
<h4>Tasks</h4>
<p>Finally after Ant&#8217;s obscure &#8220;target&#8221; and Maven&#8217;s confusing &#8220;phase&#8221;, Gradle gave a reasonable name to their build steps: &#8220;tasks&#8221;. We use Gradle&#8217;s <code>apply</code> to give access to certain tasks. (The<code>java</code> plugin is built in to Gradle which is why we did not need to declare it in the build&#8217;s dependencies.)</p>
<p>The <code>java</code> plugin will give you common tasks such as <code>clean</code> , <code>compileJava</code> , <code>test</code> , etc. The<code>shadow</code> plugin will give you the <code>shadowJar</code> task which builds a fat jar. To see a complete list of the available tasks, you can run <code>gradle -q tasks</code> .</p>
<h4>Dependency Management</h4>
<p>We&#8217;ve already discussed how a build script can rely on a plugin dependency, likewise the build script can define the dependencies for your project. Here&#8217;s the complete build file:</p>
<div>
<div id="highlighter_560705" class="syntaxhighlighter html">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
<div class="line number27 index26 alt2">27</div>
<div class="line number28 index27 alt1">28</div>
<div class="line number29 index28 alt2">29</div>
<div class="line number30 index29 alt1">30</div>
<div class="line number31 index30 alt2">31</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="html plain">buildscript {</code></div>
<div class="line number2 index1 alt1"><code class="html spaces">    </code><code class="html plain">repositories {</code></div>
<div class="line number3 index2 alt2"><code class="html spaces">        </code><code class="html plain">jcenter()</code></div>
<div class="line number4 index3 alt1"><code class="html spaces">    </code><code class="html plain">}</code></div>
<div class="line number5 index4 alt2"><code class="html spaces">    </code><code class="html plain">dependencies {</code></div>
<div class="line number6 index5 alt1"><code class="html spaces">        </code><code class="html plain">classpath 'com.github.jengelman.gradle.plugins:shadow:1.2.4'</code></div>
<div class="line number7 index6 alt2"><code class="html spaces">    </code><code class="html plain">}</code></div>
<div class="line number8 index7 alt1"><code class="html plain">}</code></div>
<div class="line number9 index8 alt2"></div>
<div class="line number10 index9 alt1"><code class="html plain">apply plugin: 'java'</code></div>
<div class="line number11 index10 alt2"><code class="html plain">apply plugin: 'com.github.johnrengelman.shadow'</code></div>
<div class="line number12 index11 alt1"></div>
<div class="line number13 index12 alt2"><code class="html plain">group = 'com.example'</code></div>
<div class="line number14 index13 alt1"><code class="html plain">version = '0.0.1-SNAPSHOT'</code></div>
<div class="line number15 index14 alt2"><code class="html plain">sourceCompatibility = 1.8</code></div>
<div class="line number16 index15 alt1"><code class="html plain">targetCompatibility = 1.8</code></div>
<div class="line number17 index16 alt2"></div>
<div class="line number18 index17 alt1"><code class="html plain">repositories {</code></div>
<div class="line number19 index18 alt2"><code class="html spaces">    </code><code class="html plain">mavenCentral()</code></div>
<div class="line number20 index19 alt1"><code class="html plain">}</code></div>
<div class="line number21 index20 alt2"></div>
<div class="line number22 index21 alt1"><code class="html plain">dependencies {</code></div>
<div class="line number23 index22 alt2"><code class="html spaces">    </code><code class="html plain">compile group: 'com.google.guava', name: 'guava', version: '21.0'</code></div>
<div class="line number24 index23 alt1"><code class="html plain">}</code></div>
<div class="line number25 index24 alt2"></div>
<div class="line number26 index25 alt1"><code class="html plain">shadowJar {</code></div>
<div class="line number27 index26 alt2"><code class="html spaces">    </code><code class="html plain">baseName = 'iscream'</code></div>
<div class="line number28 index27 alt1"><code class="html spaces">    </code><code class="html plain">manifest {</code></div>
<div class="line number29 index28 alt2"><code class="html spaces">        </code><code class="html plain">attributes 'Main-Class': 'com.example.iscream.Application'</code></div>
<div class="line number30 index29 alt1"><code class="html spaces">    </code><code class="html plain">}</code></div>
<div class="line number31 index30 alt2"><code class="html plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>Now that the build knows how to find the project&#8217;s dependencies, we can run <code>gradle shawdowJar</code> to create a fat jar that includes the Guava dependency. After it completes, you should see <code>/build/lib/iscream-0.0.1-SNAPSHOT-all.jar</code> , which can be ran in the usual way (<code>java -jar ...</code> ).</p>
<h4>Summary</h4>
<p>Gradle brings a lot of flexibility and power to the Java build ecosystem. Of course, there is always some danger with highly customizable tools&#8211;suddenly you have to be aware of code quality in your build file. This is not necessarily bad, but worth considering when evaluating how your team will use the tool. Furthermore, much of Gradle&#8217;s power comes from third-party plugins. And since it is relatively new, it still sometimes feels like you are using a bunch of plugins developed by SomeRandomPerson. You may find yourself comparing three plugins that ostensibly do the same thing, each have a few dozen GitHub stars, and little documentation to boot. Despite these downsides, Gradle is gaining popularity and is particularly appealing to developers who like to have more control over their builds.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bestdevops.com/java-build-tools-ant-vs-maven-vs-gradle/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
