<?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>Maven &#8211; Best DevOps</title>
	<atom:link href="https://www.bestdevops.com/tag/maven/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>Wed, 14 Oct 2026 11:28:38 +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>Global Continuous Delivery Tools Market (2021) to Witness Huge Growth by 2026 &#124; Buddy, HUDSON, Maven, Fisheye, Bamboo</title>
		<link>https://www.bestdevops.com/global-continuous-delivery-tools-market-2021-to-witness-huge-growth-by-2026-buddy-hudson-maven-fisheye-bamboo/</link>
					<comments>https://www.bestdevops.com/global-continuous-delivery-tools-market-2021-to-witness-huge-growth-by-2026-buddy-hudson-maven-fisheye-bamboo/#respond</comments>
		
		<dc:creator><![CDATA[anil]]></dc:creator>
		<pubDate>Mon, 12 Apr 2021 05:23:39 +0000</pubDate>
				<category><![CDATA[Continuous Delivery]]></category>
		<category><![CDATA[2026]]></category>
		<category><![CDATA[Bamboo]]></category>
		<category><![CDATA[Buddy]]></category>
		<category><![CDATA[Fisheye]]></category>
		<category><![CDATA[Growth]]></category>
		<category><![CDATA[Hudson]]></category>
		<category><![CDATA[Maven]]></category>
		<guid isPermaLink="false">http://www.bestdevops.com/?p=16189</guid>

					<description><![CDATA[Source:-https://soccernurds.com/ This report provides the in-depth and analysis based approached on the global Continuous Delivery Tools market. Along with this [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Source:-https://soccernurds.com/</p>
<p>This report provides the in-depth and analysis based approached on the global Continuous Delivery Tools market. Along with this report covers other factors like growth prospects, market development potential, profitability, supply and demand, and other important subjects. The report presented the fully assured and reliable information relate to the Continuous Delivery Tools market. While doing the report researcher and analysts involved some advanced research methodology and reliable primary and secondary sources related to the market data.</p>
<p>The global Continuous Delivery Tools report clearly mention the present and future situations related to the Continuous Delivery Tools market which is based on revenue, volume, production, trends, technology, innovation, and other critical factors. Similarly, this report offers the detailed information related to the market dynamics, the competitive landscape, segments, and regions. With the help of this user get clear idea about the market fluctuations, pricing structure, uncertainties, potential risks, and growth prospects which is helpful for the planning effective strategies in Continuous Delivery Tools market.</p>
<p>For major key players in the market this report covers all important parameters related to the business development and market growth which will helpful to understand the Continuous Delivery Tools market position. These players also able to get information about the future market challenges, distribution scenarios, product pricing changes, and other related factors.</p>
<p>Global Continuous Delivery Tools Market Split by Product Type and Applications:</p>
<p>On the basis of Types: Cloud-based, On-premises<br />
On the basis of Application: Small and Medium Enterprises (SMEs), Large Enterprises</p>
<p>Report also provides various drivers which are boosting the market. Moreover, the major product type and segments are covered with their complete analysis in the report. Applications with different segment are overviewed in the report. And for detailed analysis of the industry, Continuous Delivery Tools market report provides the assorted data attributes which are based on tables, graphs, and pie-charts.</p>
<p>The global Continuous Delivery Tools report offers the segmentation by product type, end-user applications, top market key players and geographical regions. Along with that on a regional basis, the market is categorized into five regions that include North America, Europe, Asia Pacific, Latin America, and Middle &amp; East Africa.</p>
<p><strong>Chapters Define in TOC (Table of Content) of the Report:</strong></p>
<p>Chapter 1: Market Overview, Drivers, Restraints and Opportunities, Segmentation overview<br />
Chapter 2: Market competition by Manufacturers<br />
Chapter 3: Production by Regions<br />
Chapter 4: Consumption by Regions<br />
Chapter 5: Production, By Types, Revenue and Market share by Types<br />
Chapter 6: Consumption, By Applications, Market share (%) and Growth Rate by Applications<br />
Chapter 7: Complete profiling and analysis of Manufacturers<br />
Chapter 8: Manufacturing cost analysis, Raw materials analysis, Region-wise manufacturing expenses<br />
Chapter 9: Industrial Chain, Sourcing Strategy and Downstream Buyers<br />
Chapter 10: Marketing Strategy Analysis, Distributors/Traders<br />
Chapter 11: Market Effect Factors Analysis<br />
Chapter 12: Market Forecast<br />
Chapter 13: Continuous Delivery Tools Research Findings and Conclusion, Appendix, methodology and data source</p>
<p>For getting the detailed analysis of business strategies regarding the major key players which are already existing in the global Continuous Delivery Tools market along with value chain, raw material, and industry variable.<br />
To understand all the information related to Continuous Delivery Tools market according to its market, segmentations and sub-segmentation.<br />
Report gives in-depth research on distribution channels and distribution chain with retailers, wholesalers, manufacturers, dealers, suppliers, and consumers.<br />
Report covers all the factors such as CAGR, supply and demand, macroeconomic patterns, customer purchasing patterns, and several other with proper and authentic data.<br />
Also, with the help of SWOT analysis, PESTLE analysis, and opportunity assessment researchers and analysts offers the accurate and verified information through the report.</p>
<p>We at Zeal Insider aim to be global leaders in qualitative and predictive analysis as we put ourselves in the front seat for identifying worldwide industrial trends and opportunities and mapping them out for you on a silver platter. We specialize in identifying the calibers of the market’s robust activities and constantly pushing out the areas which allow our clientele base in making the most innovative, optimized, integrated and strategic business decisions in order to put them ahead of their competition by leaps and bounds.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bestdevops.com/global-continuous-delivery-tools-market-2021-to-witness-huge-growth-by-2026-buddy-hudson-maven-fisheye-bamboo/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Kovair Releases Kubernetes Plug-In for Its DevOps Platform</title>
		<link>https://www.bestdevops.com/kovair-releases-its-new-kubernetes-plug-in-for-its-devops/</link>
					<comments>https://www.bestdevops.com/kovair-releases-its-new-kubernetes-plug-in-for-its-devops/#respond</comments>
		
		<dc:creator><![CDATA[anil]]></dc:creator>
		<pubDate>Tue, 19 May 2020 05:40:04 +0000</pubDate>
				<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[Containers]]></category>
		<category><![CDATA[Continuous Delivery]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[IT tools]]></category>
		<category><![CDATA[Jenkins]]></category>
		<category><![CDATA[JFrog]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Selenium]]></category>
		<category><![CDATA[ServiceNow]]></category>
		<category><![CDATA[Slack]]></category>
		<category><![CDATA[SonarQube]]></category>
		<category><![CDATA[VMs]]></category>
		<guid isPermaLink="false">http://www.bestdevops.com/?p=12524</guid>

					<description><![CDATA[Kovair Software has released a new Kubernetes plug-in for its DevOps solution, adding container orchestration support, hybrid multi-cloud enablement, and end-to-end CI/CD pipeline automation to its existing Omnibus integration platform.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><em>Originally reported by AIThority.com. This article summarises Kovair Software&#8217;s announcement of its Kubernetes plug-in release for the Kovair DevOps platform.</em></p>



<h2 class="wp-block-heading">Kovair Adds Kubernetes Support to Its DevOps Platform</h2>



<p class="wp-block-paragraph">Kovair Software, a vendor in the software tools integration and Application Lifecycle Management (ALM) space, has announced the release of a new Kubernetes plug-in for the Kovair DevOps Solution. The plug-in extends the platform&#8217;s existing hybrid multi-cloud capabilities — delivered in conjunction with Kovair&#8217;s integration middleware, Omnibus — and is aimed at enterprise teams looking to automate container-based deployments across on-premise and cloud environments.</p>



<p class="wp-block-paragraph">The stated goal of the release is to allow development, QA, and operations teams to deploy to Kubernetes clusters without requiring deep knowledge of the underlying integration mechanics. According to Bipin Shah, Chairman and CEO of Kovair Software:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>&#8220;This release of the Kubernetes plug-in will enable Development, QA and Operations personnel to deploy to their preferred container infrastructure or cluster manager solution in Kubernetes without requiring any knowledge about the underlying integrations. The combined offering of Kovair DevOps and Omnibus will allow teams to coordinate and manage a mix of monolithic application and modern microservices-based application releases across legacy or continuous delivery pipelines, into both on-premise and cloud environments.&#8221;</p><cite>Bipin Shah, Chairman and CEO, Kovair Software</cite></blockquote>



<h2 class="wp-block-heading">What the Kubernetes Plug-In Brings to Kovair DevOps</h2>



<p class="wp-block-paragraph">Kovair DevOps is built around concurrent, task-based pipelines designed for continuous delivery. The platform provides build and deployment automation alongside real-time analytics, and is intended to support heterogeneous environments — including on-premise infrastructure, edge cloud, and hyperscale public clouds. The new Kubernetes plug-in adds native container orchestration to this pipeline model.</p>



<h3 class="wp-block-heading">Key Capabilities</h3>



<ul class="wp-block-list">
<li><strong>Drag-and-drop pipeline editor:</strong> Creation, orchestration, and management of complex Kubernetes deployment pipelines through a visual, configurable workflow editor supporting concurrent task execution.</li>
<li><strong>Email-based pipeline management:</strong> Users can start, stop, or query the live status of a pipeline directly from email — a feature positioned for distributed or remote teams.</li>
<li><strong>Automated and manual task execution:</strong> Pipelines support both automated steps and on-demand manual intervention, integrated with full Project Lifecycle Management.</li>
<li><strong>Custom command execution:</strong> Manages dependencies between custom applications, system commands, and microservices across the complete continuous delivery pipeline.</li>
<li><strong>Distributed task execution:</strong> Tasks can run on any host, removing the requirement to centralise all tooling on a single server and enabling hybrid multi-cloud deployments.</li>
<li><strong>Real-time visibility:</strong> Pre-defined reports and dashboards provide in-depth visibility into release pipeline progress across all environments and teams.</li>
<li><strong>Multi-environment deployment:</strong> Supports deployment targets including public cloud, VMs, containers, and traditional bare-metal environments across any operating system.</li>
</ul>



<h2 class="wp-block-heading">Plug-In Ecosystem at Launch</h2>



<p class="wp-block-paragraph">The initial set of plug-ins shipped with this release covers both open-source and commercial tooling commonly found in enterprise DevOps toolchains:</p>



<ul class="wp-block-list">
<li>Project and issue tracking: Jira, TFS, ServiceNow</li>
<li>Build tools: ANT, Maven, MS Build</li>
<li>CI/CD: Jenkins</li>
<li>Source control: GitHub</li>
<li>Container and orchestration: Docker, Kubernetes</li>
<li>Artifact management: JFrog</li>
<li>Code quality: SonarQube</li>
<li>Testing: Selenium</li>
<li>Monitoring: Dynatrace</li>
<li>Cloud: Azure Cloud</li>
<li>Configuration management: Ansible</li>
<li>Collaboration: Slack</li>
<li>Architecture patterns: Microservices, Custom Command</li>
</ul>



<p class="wp-block-paragraph">Amit Dasgupta, Director of Products and Solutions Management at Kovair Software, commented on the broader strategic intent:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>&#8220;Kovair DevOps with Kubernetes support will provide a form of rapid software delivery centered around the concept of continuous delivery pipelines achieved through automation of different activities involved in the delivery cycle. With this launch, Kovair will now start offering a full Enterprise DevOps workflow to its prospects and customers.&#8221;</p><cite>Amit Dasgupta, Director of Products and Solutions Management, Kovair Software</cite></blockquote>



<h2 class="wp-block-heading">Kovair Omnibus: The Integration Layer</h2>



<p class="wp-block-paragraph">Underpinning the Kovair DevOps platform is Omnibus, Kovair&#8217;s proprietary Service Oriented Architecture (SOA)-based integration middleware. Omnibus provides built-in security, resiliency, and multi-cloud enablement, and is designed to integrate with over 110 ALM and IT tools from a range of vendors and open-source projects. The platform supports one-click deployments and is positioned as an alternative to traditional Enterprise Service Bus (ESB) vendors that require specialist integration developers.</p>



<p class="wp-block-paragraph">Kovair states that Omnibus received a Gartner Cool Vendor award, though no date or report title for this award is provided in the announcement.</p>



<p class="wp-block-paragraph">Akshay Sharma, CTO of Kovair Software and a former senior analyst at Gartner Research, framed the enterprise opportunity as follows:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>&#8220;CIOs and Software Architects of Enterprises embarking on Digital Transformation projects should explore Kovair&#8217;s DevOps and Omnibus, along with their DevSecOps-based solutions as they re-vector to newer hybrid multi-cloud datacenters offering newer services — with security vulnerability assessments built-in.&#8221;</p><cite>Akshay Sharma, CTO, Kovair Software</cite></blockquote>



<h2 class="wp-block-heading">Summary</h2>



<p class="wp-block-paragraph">The Kubernetes plug-in release positions Kovair DevOps as a more complete enterprise continuous delivery platform, offering native Kubernetes pipeline support alongside its existing multi-tool integration capabilities. For organisations managing a mix of legacy applications and modern container-based microservices across hybrid cloud environments, the combination of Kovair DevOps and Omnibus is intended to reduce integration friction and accelerate delivery cycles without requiring deep expertise at each integration point.</p>



<p class="wp-block-paragraph"><em>Source: <a href="https://aithority.com" rel="noopener">AIThority.com</a></em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bestdevops.com/kovair-releases-its-new-kubernetes-plug-in-for-its-devops/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>GitLab Moves 18 DevOps Features to Open Source</title>
		<link>https://www.bestdevops.com/gitlab-moves-18-of-its-devops-features-to-open-source/</link>
					<comments>https://www.bestdevops.com/gitlab-moves-18-of-its-devops-features-to-open-source/#respond</comments>
		
		<dc:creator><![CDATA[anil]]></dc:creator>
		<pubDate>Thu, 02 Apr 2020 03:39:49 +0000</pubDate>
				<category><![CDATA[DevOps]]></category>
		<category><![CDATA[GitLab]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[network security]]></category>
		<category><![CDATA[open-source]]></category>
		<guid isPermaLink="false">http://www.bestdevops.com/?p=11517</guid>

					<description><![CDATA[GitLab announced the open-sourcing of 18 previously paid features, including related issues, service desk, design management, feature flags, and multi-cluster Kubernetes support — a significant shift in the company's community strategy.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><em>Originally reported by <a href="https://sdtimes.com" rel="noopener">SD Times</a>. Original GitLab announcement attributed to co-founder and CEO Sid Sijbrandij.</em></p>



<h2 class="wp-block-heading">GitLab Opens Up 18 Features Across the DevOps Lifecycle</h2>



<p class="wp-block-paragraph">GitLab announced that 18 features previously restricted to paid tiers are moving to its open-source Community Edition (CE). The move spans the full DevOps lifecycle — from planning and code creation through to deployment, security, and package management.</p>



<p class="wp-block-paragraph">&#8220;This marks a major milestone in our efforts to empower the community to collaborate more robustly and to take our single tool for the DevOps lifecycle to the next level,&#8221; wrote Sid Sijbrandij, co-founder and CEO of GitLab, in a company blog post at the time of the announcement.</p>



<p class="wp-block-paragraph">The migration of code to the open-source portion of the GitLab codebase was tracked through individual issues linked from the official GitLab blog post.</p>



<h2 class="wp-block-heading">The Full List of 18 Open-Sourced Features</h2>



<p class="wp-block-paragraph">The newly open-sourced features cover seven lifecycle stages: planning, creating, verifying, packaging, releasing, configuring, and defending. Here is the complete list:</p>



<h3 class="wp-block-heading">Planning &amp; Issue Management</h3>



<ul class="wp-block-list">
<li><strong>Related issues</strong> — Connect related GitLab issues together to track dependencies and cross-linked work.</li>
<li><strong>Export issues as CSV</strong> — Export issues from a GitLab project as a CSV file, delivered as an email attachment to your default notification address.</li>
<li><strong>Issue board focus mode</strong> — A distraction-free view for working within GitLab issue boards.</li>
<li><strong>Service desk</strong> — Allow external users to submit support tickets directly into GitLab issues via email, without needing a GitLab account.</li>
</ul>



<h3 class="wp-block-heading">Creating &amp; Web IDE Enhancements</h3>



<ul class="wp-block-list">
<li><strong>Web Terminal for Web IDE</strong> — Integrates a terminal directly into the GitLab Web IDE, making it faster and easier to contribute changes to projects without leaving the browser.</li>
<li><strong>File syncing to the web terminal</strong> — Enables users to sync files from the Web IDE to a preconfigured terminal environment for in-browser code testing.</li>
<li><strong>Design Management</strong> — Allows design assets to be uploaded directly to GitLab issues, keeping designs, discussions, and implementation work in one place as a single source of truth.</li>
</ul>



<h3 class="wp-block-heading">Verifying</h3>



<ul class="wp-block-list">
<li><strong>Code quality</strong> — Automated code quality analysis integrated into merge requests, surfacing regressions before code is merged.</li>
</ul>



<h3 class="wp-block-heading">Packaging</h3>



<ul class="wp-block-list">
<li><strong>Conan (C/C++) repository</strong> — A built-in package registry for C and C++ projects using the Conan package manager.</li>
<li><strong>Maven (Java) repository</strong> — A built-in Maven repository for Java projects.</li>
<li><strong>NPM (Node.js) registry</strong> — A private NPM registry hosted within GitLab for Node.js packages.</li>
<li><strong>NuGet (.NET) repository</strong> — A built-in NuGet feed for .NET projects.</li>
</ul>



<h3 class="wp-block-heading">Releasing &amp; Deploying</h3>



<ul class="wp-block-list">
<li><strong>Canary deployments</strong> — Route a subset of traffic to a new version of an application to test in production before a full rollout.</li>
<li><strong>Incremental rollout</strong> — Gradually deploy new versions of an application to a percentage of Kubernetes pods.</li>
<li><strong>Feature flags</strong> — Control the rollout of new features in production without requiring a new deployment.</li>
<li><strong>Deploy boards</strong> — Visualize the current state of a Kubernetes environment directly within GitLab CI/CD pipelines.</li>
</ul>



<h3 class="wp-block-heading">Configuring &amp; Securing</h3>



<ul class="wp-block-list">
<li><strong>Support for multiple Kubernetes clusters</strong> — Connect more than one Kubernetes cluster to a single GitLab project or group, enabling environment-specific cluster configurations.</li>
<li><strong>Network policies for container network security</strong> — Define and enforce network policies to control traffic between containers and protect running workloads.</li>
</ul>



<h2 class="wp-block-heading">Why This Matters for DevOps Teams</h2>



<p class="wp-block-paragraph">For teams running self-managed GitLab CE instances, this release significantly closes the gap between the free and paid tiers. Capabilities that previously required an Enterprise Edition licence — such as feature flags, canary deployments, multi-cluster Kubernetes support, and built-in package registries — became available to all open-source users.</p>



<p class="wp-block-paragraph">The package registry additions are particularly valuable for organisations managing internal dependencies across multiple languages. Having Conan, Maven, NPM, and NuGet registries within the same platform that hosts source code and CI/CD pipelines reduces the need for separate Artifactory or Nexus installations for smaller teams.</p>



<p class="wp-block-paragraph">Design Management addresses a common workflow gap: design assets are frequently stored in Figma, Zeplin, or shared drives, disconnected from the issues that track their implementation. Moving them into GitLab issues creates a tighter feedback loop between designers and engineers.</p>



<p class="wp-block-paragraph">&#8220;From design management to package managers, managing multiple Kubernetes clusters to connecting related issues, we&#8217;re making it easier than ever for an individual contributor to have everything they need to plan, build, deploy, and secure their application with GitLab,&#8221; Sijbrandij wrote.</p>



<h2 class="wp-block-heading">Context: GitLab&#8217;s Open Core Model</h2>



<p class="wp-block-paragraph">GitLab operates on an open-core model, maintaining a Community Edition (CE) under an MIT licence and an Enterprise Edition (EE) with additional paid features. Periodically, the company moves features from EE down to CE as those features mature or as community demand grows. This announcement represented one of the larger single batches of such migrations.</p>



<p class="wp-block-paragraph">Teams evaluating GitLab CE versus GitHub, Gitea, or other self-hosted options should review the current GitLab CE feature list directly on the GitLab website, as the feature set continues to evolve with each release.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bestdevops.com/gitlab-moves-18-of-its-devops-features-to-open-source/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Forrester: Google Cloud Partners Have Seen Strong Growth Since 2016</title>
		<link>https://www.bestdevops.com/forrester-google-cloud-partners-see-big-success-since-2016/</link>
					<comments>https://www.bestdevops.com/forrester-google-cloud-partners-see-big-success-since-2016/#respond</comments>
		
		<dc:creator><![CDATA[anil]]></dc:creator>
		<pubDate>Tue, 11 Feb 2020 04:57:18 +0000</pubDate>
				<category><![CDATA[Google Cloud]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Google cloud]]></category>
		<category><![CDATA[IT technology]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Software-Development]]></category>
		<guid isPermaLink="false">http://www.bestdevops.com/?p=10497</guid>

					<description><![CDATA[A Forrester Total Economic Impact study commissioned by Google Cloud found that channel partners have seen significant revenue growth, deal size expansion, and margin improvement since 2016 — driven largely by professional services, AI/ML, and custom IP development.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><em>Source: <a href="https://www.channelfutures.com" rel="noopener">channelfutures.com</a> | Original report date: February 2020</em></p>



<h2 class="wp-block-heading">Forrester Study Highlights Google Cloud Partner Opportunity</h2>



<p class="wp-block-paragraph">Forrester Research released the results of a Total Economic Impact (TEI) study commissioned by Google Cloud to assess the business opportunity for its channel partners. The study builds on an earlier Forrester analysis of the Google Cloud Platform (GCP) partner ecosystem first conducted in 2016, providing a multi-year view of how the channel opportunity has evolved.</p>



<p class="wp-block-paragraph">The findings are significant for DevOps and cloud engineering teams whose organisations work with, or are considering becoming, Google Cloud partners.</p>



<h2 class="wp-block-heading">Deal Sizes Have Grown Substantially</h2>



<p class="wp-block-paragraph">According to Forrester, partners reported notable increases in average deal size compared to the baseline figures captured in 2016:</p>



<ul class="wp-block-list">
  <li><strong>GCP migration engagements:</strong> Average deal size has grown three to six times since 2016.</li>
  <li><strong>Cloud modernisation and application development:</strong> Deal sizes have grown three to five times over the same period.</li>
</ul>



<p class="wp-block-paragraph">These figures suggest that as enterprises mature in their cloud adoption journeys, the scope and complexity — and therefore value — of partner engagements has increased substantially.</p>



<h2 class="wp-block-heading">Where Partner Revenue Actually Comes From</h2>



<p class="wp-block-paragraph">One of the more important findings for anyone building a Google Cloud practice is the revenue mix: approximately <strong>70% of Google Cloud partner revenue comes from professional and managed services</strong>, not product resale. This underlines a broader shift in cloud channel economics away from pure resale and toward services-led business models.</p>



<p class="wp-block-paragraph">Forrester&#8217;s analysts broke down professional service margins across 19 partner interviews:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>&#8220;Professional-service project gross margins ranged from a low of 25% to a high of 60% across the 19 interviewees, with higher margins associated with higher value analytics, AI/ML, cloud modernisation and cloud-native application development projects. Lastly, partners that built their own custom intellectual property on or for Google Cloud solutions were able to sell these offerings to customers, often attaching them to larger cloud engagements and earning margins in excess of 60%.&#8221;</p><cite>— Forrester Research, Total Economic Impact Study (commissioned by Google Cloud, 2020)</cite></blockquote>



<h2 class="wp-block-heading">The Four Big Partner Opportunities Forrester Identified</h2>



<p class="wp-block-paragraph">Forrester outlined four primary revenue streams and opportunity areas for Google Cloud partners:</p>



<h3 class="wp-block-heading">1. Professional and Managed Services</h3>



<p class="wp-block-paragraph">This is the highest-value category and includes strategy and business consulting, cloud migration, cloud modernisation, cloud-native application development, and data, analytics, and insight services. Margins can reach up to 60%, depending on specialisation level and the degree of automation and repeatability embedded in service delivery.</p>



<h3 class="wp-block-heading">2. Product Resale</h3>



<p class="wp-block-paragraph">Resale of Google products — including GCP, Google Workspace (formerly G Suite), Chrome Enterprise, and Google Maps Platform — carries margins in the 10–30% range. While lower than services, resale provides a predictable revenue base and often underpins broader services engagements.</p>



<h3 class="wp-block-heading">3. Proprietary Software and Custom IP</h3>



<p class="wp-block-paragraph">Partners who build their own software or solutions that extend or complement Google Cloud technologies — or that address specific vertical business problems — can command margins in excess of 60%. This is the highest-margin opportunity in the ecosystem and often gets attached to larger cloud engagements.</p>



<h3 class="wp-block-heading">4. Google Cloud Certifications</h3>



<p class="wp-block-paragraph">Continued investment in official Google Cloud certifications allows partners to justify higher service fees, differentiate from competitors, and unlock higher-tier partner status. Forrester flagged certification attainment as a direct enabler of partner margin expansion.</p>



<h2 class="wp-block-heading">The Strategic Shift: From Resale to Custom Solutions</h2>



<p class="wp-block-paragraph">A recurring theme in the Forrester findings is the advantage of moving beyond resale toward custom solution development. Partners that make this transition access a larger total addressable market and command significantly higher margins. Forrester explicitly noted that building custom IP on GCP results in &#8220;a larger total addressable market and higher margins.&#8221;</p>



<p class="wp-block-paragraph">Carolee Gearhart, who was serving as channel chief at Google Cloud at the time of the report, echoed this in a February 6, 2020 blog post:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>&#8220;We know that it&#8217;s still early days for cloud migration across industries, but a few key product areas stood out as opportunities for partners — particularly, data analytics, artificial intelligence, machine learning, and building custom intellectual property. Customer engagements in these areas are leading to repeat business and larger contract values for partners, Forrester found, so building expertise can help further bolster partners&#8217; value proposition and differentiation in the marketplace.&#8221;</p><cite>— Carolee Gearhart, Channel Chief, Google Cloud (February 2020)</cite></blockquote>



<h2 class="wp-block-heading">What This Means for DevOps and Cloud Engineering Teams</h2>



<p class="wp-block-paragraph">For organisations evaluating their cloud strategy or partnership model, the Forrester findings point to several practical takeaways:</p>



<ul class="wp-block-list">
  <li><strong>Services beats resale for margin:</strong> If your team is building a cloud practice, leading with services — particularly in AI/ML, data analytics, and cloud-native development — will generate higher returns than resale alone.</li>
  <li><strong>Custom IP compounds value:</strong> Packaging repeatable solutions as proprietary offerings dramatically improves both margins and scalability.</li>
  <li><strong>Certifications matter commercially:</strong> Google Cloud certifications are not just technical validation — they directly influence the fees a partner can charge.</li>
  <li><strong>AI and analytics are the growth edge:</strong> Both Forrester and Google Cloud leadership identified data, analytics, AI, and ML as the highest-growth engagement areas in the partner ecosystem.</li>
</ul>



<h2 class="wp-block-heading">Other Channel News from February 2020</h2>



<p class="wp-block-paragraph">Alongside the Forrester Google Cloud findings, the original report also noted two additional channel developments from the same period:</p>



<ul class="wp-block-list">
  <li><strong>Nutanix</strong> appointed a new executive to lead its channel sales organisation.</li>
  <li><strong>Atos and Maven Wave</strong> finalised their partnership or acquisition arrangement, with the combined operation described as up and running.</li>
</ul>



<p class="wp-block-paragraph">Details on both items were not provided in the original source teaser and have not been independently elaborated here.</p>



<p class="wp-block-paragraph"><em>This article is based on reporting by <a href="https://www.channelfutures.com" rel="noopener">Channel Futures</a> and a Forrester Total Economic Impact study commissioned by Google Cloud, published in early 2020.</em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bestdevops.com/forrester-google-cloud-partners-see-big-success-since-2016/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Maven Wave Named 12th Fastest Growing Consulting Firm by Consulting Magazine</title>
		<link>https://www.bestdevops.com/maven-wave-identified-as-the-12th-fastest-growing-consulting-company/</link>
					<comments>https://www.bestdevops.com/maven-wave-identified-as-the-12th-fastest-growing-consulting-company/#respond</comments>
		
		<dc:creator><![CDATA[anil]]></dc:creator>
		<pubDate>Wed, 30 Oct 2019 06:04:41 +0000</pubDate>
				<category><![CDATA[Maven]]></category>
		<category><![CDATA[Companies]]></category>
		<category><![CDATA[Consulting]]></category>
		<category><![CDATA[Digital Transformation]]></category>
		<category><![CDATA[Google cloud]]></category>
		<guid isPermaLink="false">http://www.bestdevops.com/?p=8970</guid>

					<description><![CDATA[Maven Wave has been ranked 12th on ALM's Consulting magazine's annual Fastest Growing Firms list for the fifth consecutive year, with revenue growth of 287% driven by Google Cloud partnerships and enterprise digital transformation work.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><em>Source: PRNewswire. Original announcement published October 2019.</em></p>



<h2 class="wp-block-heading">Maven Wave Earns a Top-25% Spot on Consulting&#8217;s Fastest Growing Firms List</h2>



<p class="wp-block-paragraph">Maven Wave has been named 12th on ALM&#8217;s <em>Consulting</em> magazine&#8217;s annual ranking of the industry&#8217;s Fastest Growing Firms. Of the 52 firms listed based on revenue growth, Maven Wave landed in the top 25% of the ranking. The company&#8217;s placement marks the fifth consecutive year it has been included on this list, underscoring consistent, sustained growth in the competitive enterprise consulting market.</p>



<p class="wp-block-paragraph">Maven Wave was set to be featured in the November issue of <em>Consulting</em> magazine, available from November 8, 2019.</p>



<h2 class="wp-block-heading">Revenue Growth of 287% Outpaces Industry Average</h2>



<p class="wp-block-paragraph">Maven Wave&#8217;s revenue grew 287% during the evaluation period assessed by <em>Consulting</em> magazine. All recognized firms on the list averaged a 233% growth rate over the same period, meaning Maven Wave&#8217;s growth rate exceeded the peer group average by more than 50 percentage points.</p>



<p class="wp-block-paragraph">The company attributed its growth to three primary drivers:</p>



<ul class="wp-block-list">
<li><strong>Enterprise digital transformation demand:</strong> Major digital transformation and IT modernization initiatives launched by large corporations created significant consulting opportunities.</li>
<li><strong>Google Cloud partnership strength:</strong> Maven Wave&#8217;s close alignment with Google Cloud, including recognition as Google North American Services Partner of the Year for the second consecutive year, expanded its ability to win and deliver large-scale cloud engagements.</li>
<li><strong>Cloud-based analytics and machine learning:</strong> Strategic application of predictive analytics and machine learning in the cloud helped clients drive operational efficiencies and differentiate their offerings.</li>
</ul>



<h2 class="wp-block-heading">Leadership Perspective on the Recognition</h2>



<p class="wp-block-paragraph">Phil Jennings, Partner, Management Consulting at Maven Wave, commented on the ranking:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>&#8220;We are honored to be ranked amongst the top 25% of the fastest growing consulting companies by <em>Consulting</em> magazine. We are proud that our success is predicated on helping enterprise companies embrace emerging technologies in the cloud, such as machine learning and predictive analytics.&#8221;</p><cite>— Phil Jennings, Partner, Management Consulting, Maven Wave</cite></blockquote>



<h2 class="wp-block-heading">Additional Recognition: Best Medium Places to Work 2019</h2>



<p class="wp-block-paragraph">Alongside its revenue growth recognition, Maven Wave was also named one of the 2019 Best Medium Places to Work by Great Place to Work® and FORTUNE magazine. Jennings noted that the company&#8217;s culture centers on identifying employees with an &#8220;X-factor&#8221; and fostering creativity and diversity as deliberate talent strategies — qualities he tied directly to the firm&#8217;s ability to deliver for clients.</p>



<h2 class="wp-block-heading">About Maven Wave</h2>



<p class="wp-block-paragraph">Maven Wave is a consulting and technology firm that helps enterprises accelerate digital transformation. Combining the discipline of top-tier management consulting with the agility of a technology-native firm, Maven Wave delivers digital solutions built on Google Cloud. As a Google Cloud Premier Partner, its work spans cloud migration, analytics, machine learning, and mobile — focused on creating measurable, lasting competitive advantages for clients.</p>



<h2 class="wp-block-heading">About Consulting Magazine</h2>



<p class="wp-block-paragraph"><em>Consulting</em>® magazine is ALM&#8217;s flagship publication for the consulting profession. It covers consulting careers, thought leadership, and corporate strategy, and hosts the Achievement Awards series — including recognition for Women Leaders in Consulting, the Top 25 Consultants, Rising Stars of the Profession, Best Firms to Work For, and Global Leaders in Consulting.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bestdevops.com/maven-wave-identified-as-the-12th-fastest-growing-consulting-company/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Build Automation Software in 2025 and Beyond: Jenkins, TeamCity, CircleCI, Bamboo, Ansible and the Competitive Landscape</title>
		<link>https://www.bestdevops.com/build-automation-software-market-innovative-strategy-by-2025-jenkins-teamcity-circleci-bamboo-ansible/</link>
					<comments>https://www.bestdevops.com/build-automation-software-market-innovative-strategy-by-2025-jenkins-teamcity-circleci-bamboo-ansible/#respond</comments>
		
		<dc:creator><![CDATA[anil]]></dc:creator>
		<pubDate>Fri, 20 Sep 2019 06:43:07 +0000</pubDate>
				<category><![CDATA[Ansible]]></category>
		<category><![CDATA[Bamboo]]></category>
		<category><![CDATA[Jenkins]]></category>
		<category><![CDATA[Teamcity]]></category>
		<category><![CDATA[Chef]]></category>
		<category><![CDATA[CircleCI]]></category>
		<category><![CDATA[Gradle]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[TeamCity]]></category>
		<guid isPermaLink="false">http://www.bestdevops.com/?p=7915</guid>

					<description><![CDATA[A practical guide to the build automation software market — covering key tools, deployment models, enterprise use cases, and the competitive dynamics shaping CI/CD pipelines today.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><em>This article provides an independent technical overview of the build automation software landscape. The original post summarised a third-party market research report from scoopjunction.com / Stats and Reports; that report is a paid commercial product and specific figures from it have not been independently verified.</em></p>



<h2 class="wp-block-heading">What Is Build Automation Software?</h2>



<p class="wp-block-paragraph">Build automation software handles the process of compiling source code, running tests, packaging artefacts and triggering deployments — automatically and repeatably. Rather than relying on a developer to execute a sequence of manual steps, a build automation tool encodes that sequence as a pipeline or script that runs on every code change. This is the foundation of modern Continuous Integration and Continuous Delivery (CI/CD) practice.</p>



<p class="wp-block-paragraph">Build automation tools vary widely in scope. Some focus purely on compiling and testing (Maven, Gradle), while others orchestrate entire delivery pipelines across multiple environments (Jenkins, TeamCity, CircleCI). Configuration management tools such as Ansible and Chef are often included in market surveys because they automate the environment provisioning that surrounds a build.</p>



<h2 class="wp-block-heading">Key Tools in the Market</h2>



<p class="wp-block-paragraph">The following tools are widely referenced in enterprise CI/CD discussions. Each occupies a slightly different position in the build and delivery pipeline.</p>



<h3 class="wp-block-heading">Jenkins</h3>



<p class="wp-block-paragraph">Jenkins is the most widely deployed open-source CI/CD server. Its plugin ecosystem (1,800+ plugins) allows it to integrate with almost any tool in the software delivery chain. Jenkins supports both declarative and scripted pipelines via Jenkinsfile, and it can be hosted on-premises or in a cloud VM. The trade-off is operational overhead: maintaining a Jenkins instance, its plugins and its agents requires dedicated effort.</p>



<h3 class="wp-block-heading">TeamCity</h3>



<p class="wp-block-paragraph">JetBrains TeamCity is a commercial CI server with a generous free tier. It offers strong .NET and JVM ecosystem support, first-class build chain visualisation and deep integration with JetBrains IDEs. TeamCity is popular in organisations already using IntelliJ IDEA or the JetBrains toolchain.</p>



<h3 class="wp-block-heading">CircleCI</h3>



<p class="wp-block-paragraph">CircleCI is a cloud-native CI/CD platform configured via a YAML file (<code>.circleci/config.yml</code>). It emphasises fast pipeline execution through parallelism, Docker layer caching and resource class selection. CircleCI also offers a self-hosted runner option for organisations with data-residency requirements.</p>



<h3 class="wp-block-heading">Bamboo</h3>



<p class="wp-block-paragraph">Atlassian Bamboo is a CI/CD server that integrates natively with Jira and Bitbucket. It suits teams already invested in the Atlassian ecosystem. Bamboo supports both on-premises deployment and, more recently, cloud-based options through Atlassian&#8217;s hosted offerings.</p>



<h3 class="wp-block-heading">Ansible</h3>



<p class="wp-block-paragraph">Ansible (Red Hat) is primarily an agentless configuration management and application deployment tool. It uses YAML playbooks to define infrastructure state and application deployment steps. While not a CI server itself, Ansible is commonly invoked as a deployment step within Jenkins, CircleCI or Azure Pipelines pipelines.</p>



<h3 class="wp-block-heading">Azure Pipelines (formerly Team Foundation Server)</h3>



<p class="wp-block-paragraph">Microsoft&#8217;s Azure DevOps suite includes Azure Pipelines, which supports YAML-based pipelines, multi-stage deployments and integration with GitHub. Microsoft Team Foundation Server (TFS) was the on-premises predecessor; many enterprises are migrating TFS pipelines to Azure DevOps or GitHub Actions.</p>



<h3 class="wp-block-heading">Apache Maven and Gradle</h3>



<p class="wp-block-paragraph">Maven and Gradle are build tools rather than CI servers. Maven uses an XML-based <code>pom.xml</code> to declare project structure and dependencies; Gradle uses a Groovy or Kotlin DSL for a more flexible, incremental build model. Both are typically invoked <em>by</em> a CI server (Jenkins, CircleCI, GitHub Actions) rather than replacing it.</p>



<h3 class="wp-block-heading">Travis CI and Codeship</h3>



<p class="wp-block-paragraph">Travis CI was one of the first cloud CI services to achieve wide adoption for open-source projects via GitHub integration. Codeship (now part of CloudBees) offers both a simple hosted CI product and a more configurable pro tier. Both remain in active use, though competitive pressure from GitHub Actions and CircleCI has reshaped their market position.</p>



<h3 class="wp-block-heading">Chef</h3>



<p class="wp-block-paragraph">Chef Infra is a Ruby-based configuration management platform that enforces desired infrastructure state using cookbooks and recipes. Like Ansible, it appears in build automation market surveys because it automates environment setup that underpins repeatable builds and deployments.</p>



<h2 class="wp-block-heading">Deployment Models: Cloud-Based vs. Self-Hosted</h2>



<p class="wp-block-paragraph">Build automation tools are available in two broad deployment models, and most vendors now support both:</p>



<ul class="wp-block-list">
<li><strong>Cloud-based (SaaS):</strong> The vendor manages the infrastructure. Build agents are provisioned on demand. Examples include CircleCI Cloud, Travis CI, Codeship and GitHub Actions. The main advantages are zero infrastructure management, elastic capacity and fast onboarding. The trade-offs are data egress costs, compliance constraints and less control over the build environment.</li>
<li><strong>Self-hosted / on-premises:</strong> The organisation runs the CI server on its own infrastructure or a private cloud tenant. Examples include Jenkins, TeamCity (on-premises licence), Bamboo Server and GitLab Runner on self-managed GitLab. This model suits regulated industries (financial services, healthcare, government) where source code and artefacts must not leave a private network.</li>
</ul>



<h2 class="wp-block-heading">Enterprise vs. SME Adoption Patterns</h2>



<p class="wp-block-paragraph">Build automation tooling is used across organisations of all sizes, but adoption patterns differ:</p>



<ul class="wp-block-list">
<li><strong>Large enterprises</strong> typically favour tools with strong access control, audit logging, LDAP/SSO integration and support contracts. Jenkins (with the CloudBees distribution), TeamCity and Azure Pipelines are common choices. Enterprises also tend to run hybrid models — a self-hosted CI server triggering deployments to both on-premises and cloud environments.</li>
<li><strong>SMEs and startups</strong> generally prefer low-operational-overhead SaaS products. GitHub Actions, CircleCI and Travis CI are popular because they require no server maintenance and offer generous free tiers for public repositories. Cost predictability is a key concern as pipeline minutes scale with team size.</li>
</ul>



<h2 class="wp-block-heading">Competitive and Strategic Dynamics</h2>



<p class="wp-block-paragraph">Several macro-level forces are reshaping the build automation market:</p>



<h3 class="wp-block-heading">Platform consolidation</h3>



<p class="wp-block-paragraph">GitHub Actions (launched 2018, GA 2019) dramatically changed competitive dynamics by embedding CI/CD directly into the world&#8217;s largest source code host. Teams that previously used a separate CI service can now define pipelines in the same repository without an additional account or integration. GitLab CI/CD performs the same consolidation within the GitLab platform.</p>



<h3 class="wp-block-heading">Containerisation and ephemeral build environments</h3>



<p class="wp-block-paragraph">Docker and Kubernetes have become de facto infrastructure for build agents. Running each build job in a fresh container eliminates environment drift and improves reproducibility. All major CI platforms now support Docker-based build environments, and Kubernetes-native CI tools (Tekton, Argo Workflows) are gaining traction in cloud-native organisations.</p>



<h3 class="wp-block-heading">Security and supply-chain concerns</h3>



<p class="wp-block-paragraph">High-profile software supply chain attacks have raised scrutiny of CI/CD pipelines as an attack surface. Features such as secret scanning, signed artefacts, SBOM generation and pipeline-as-code (so changes are code-reviewed) are increasingly table-stakes requirements rather than differentiators.</p>



<h3 class="wp-block-heading">Developer experience</h3>



<p class="wp-block-paragraph">Teams are evaluating CI tools partly on the quality of the local development experience — how easy it is to run a pipeline locally before pushing to the remote server. Tools with good local runners (Act for GitHub Actions, the CircleCI CLI) reduce the feedback loop and developer frustration.</p>



<h2 class="wp-block-heading">Choosing a Build Automation Tool: Key Evaluation Criteria</h2>



<p class="wp-block-paragraph">When evaluating build automation tools for your organisation, consider the following dimensions:</p>



<ol class="wp-block-list">
<li><strong>Pipeline-as-code support:</strong> Can pipeline definitions live in version control alongside application code?</li>
<li><strong>Integration ecosystem:</strong> Does the tool integrate natively with your source control host, artefact registry, deployment targets and ticketing system?</li>
<li><strong>Scalability model:</strong> How does the tool scale build agent capacity — static agents, cloud auto-scaling, or Kubernetes pods?</li>
<li><strong>Security controls:</strong> Does it support role-based access, secrets management, audit logging and signed artefacts?</li>
<li><strong>Operational overhead:</strong> Who is responsible for patching, upgrading and monitoring the CI infrastructure?</li>
<li><strong>Cost model:</strong> Is pricing based on concurrent pipelines, build minutes, seats or a flat licence fee? How does cost scale with your projected usage?</li>
<li><strong>Compliance requirements:</strong> Do data residency or regulatory constraints rule out SaaS options?</li>
</ol>



<h2 class="wp-block-heading">Summary</h2>



<p class="wp-block-paragraph">The build automation software market encompasses a broad set of tools — from build systems like Maven and Gradle, through CI servers like Jenkins, TeamCity and Bamboo, to cloud-native platforms like CircleCI and GitHub Actions, and infrastructure automation tools like Ansible and Chef. No single tool is universally correct. The right choice depends on your team&#8217;s size, existing toolchain, compliance posture and appetite for infrastructure management.</p>



<p class="wp-block-paragraph">The clearest trend across the market is the shift toward pipeline-as-code, ephemeral container-based build environments and tighter integration between source control and CI/CD — driven by both developer productivity goals and software supply chain security requirements.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bestdevops.com/build-automation-software-market-innovative-strategy-by-2025-jenkins-teamcity-circleci-bamboo-ansible/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>How to Use the SonarQube Maven Plugin for Continuous Inspection</title>
		<link>https://www.bestdevops.com/how-to-use-the-sonarqube-maven-plugin-for-continuous-inspection/</link>
					<comments>https://www.bestdevops.com/how-to-use-the-sonarqube-maven-plugin-for-continuous-inspection/#respond</comments>
		
		<dc:creator><![CDATA[anil]]></dc:creator>
		<pubDate>Sat, 25 Aug 2018 05:30:34 +0000</pubDate>
				<category><![CDATA[DevOps]]></category>
		<category><![CDATA[DevOps Tools]]></category>
		<category><![CDATA[continuous inspection tool]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[SonarQube]]></category>
		<category><![CDATA[SonarQube Maven Plugin]]></category>
		<guid isPermaLink="false">http://www.bestdevops.com/?p=4283</guid>

					<description><![CDATA[Learn how to integrate the SonarQube Maven Plugin into your Java build pipeline, run a code quality analysis, and interpret the results — complete with commands and screenshots.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">This tutorial walks through how to use the SonarQube Maven Plugin to perform continuous code quality inspection on a Maven-based Java project. It builds on the foundational step of having SonarQube installed and running locally. If you have not yet installed SonarQube, complete that setup before proceeding.</p>



<p><em>Original tutorial credit: <a href="https://www.theserverside.com" rel="noopener">TheServerSide.com</a>. Screenshots and example project by Cameron McKenzie.</em></p>



<h2 class="wp-block-heading">Prerequisites</h2>



<ul class="wp-block-list">
  <li>SonarQube server installed and running (default: <code>http://localhost:9000</code>)</li>
  <li>Apache Maven installed and available on your system <code>PATH</code></li>
  <li>A Maven-based Java project with a <code>pom.xml</code> file at its root</li>
  <li>Git installed (if cloning the example project)</li>
</ul>



<h2 class="wp-block-heading">The SonarQube Maven Plugin Command</h2>



<p class="wp-block-paragraph">When you first configure SonarQube, the setup wizard asks which build tool you use — Gradle or Maven. If you select Maven, SonarQube provides a ready-made command for triggering analysis during your build. For a default local SonarQube installation, the invocation command is:</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">mvn sonar:sonar -Dsonar.host.url=http:<span class="hljs-comment">//localhost:9000</span></code></span></pre>


<p class="wp-block-paragraph">This command must be entered as a single line with no line breaks. Run it from the root directory of your Maven project — the directory that contains <code>pom.xml</code>.</p>



<h2 class="wp-block-heading">Setting Up a Sample Maven Project</h2>



<p class="wp-block-paragraph">If you do not have an existing Maven project to hand, you can clone the following open-source rock-paper-scissors Java project to follow along with this example:</p>


<pre class="wp-block-code"><span><code class="hljs language-php">git <span class="hljs-keyword">clone</span> https:<span class="hljs-comment">//github.com/cameronmcnz/rock-paper-scissors.git</span>
cd rock-paper-scissors
dir pom.*</code></span></pre>


<p class="wp-block-paragraph">These commands do the following:</p>



<ol class="wp-block-list">
  <li>Clone the remote GitHub repository to your local machine.</li>
  <li>Change the working directory into the project root.</li>
  <li>List files matching <code>pom.*</code> to confirm that a <code>pom.xml</code> file exists.</li>
</ol>



<p class="wp-block-paragraph">The output of the <code>dir pom.*</code> command should show a single <code>pom.xml</code> file — the Maven project descriptor that the SonarQube plugin requires to run.</p>



<h2 class="wp-block-heading">Invoking the SonarQube Maven Plugin</h2>



<p class="wp-block-paragraph">From the project root (where <code>pom.xml</code> resides), run the SonarQube Maven Plugin:</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">mvn sonar:sonar -Dsonar.host.url=http:<span class="hljs-comment">//localhost:9000</span></code></span></pre>


<p class="wp-block-paragraph">Maven will resolve the <code>sonar</code> plugin, compile and analyse the source code, and submit the results to your local SonarQube server. The process typically takes a few minutes depending on project size.</p>



<figure class="wp-block-image">
  <img decoding="async" src="https://cdn.ttgtmedia.com/rms/editorial/082318_sonarqube_maven_fig1_mobile.png"
       srcset="https://cdn.ttgtmedia.com/rms/editorial/082318_sonarqube_maven_fig1_mobile.png 960w, https://cdn.ttgtmedia.com/rms/editorial/082318_sonarqube_maven_fig1_desktop.png 1280w"
       alt="SonarQube Maven Plugin build output in a Bash shell" />
  <figcaption>The SonarQube Maven Plugin generating code quality metrics from a shell. Image: TheServerSide.com</figcaption>
</figure>



<p class="wp-block-paragraph">When the scan completes successfully, Maven prints a <strong>BUILD SUCCESS</strong> message. You can then open the SonarQube dashboard in your browser at <code>http://localhost:9000</code> to review the results.</p>



<h2 class="wp-block-heading">Interpreting SonarQube Metrics</h2>



<p class="wp-block-paragraph">After the scan, the SonarQube dashboard displays a quality gate result and a breakdown of issues found. In the rock-paper-scissors example project, SonarQube awarded a passing grade overall, but flagged <strong>14 code smells</strong>.</p>



<figure class="wp-block-image">
  <img decoding="async" src="https://cdn.ttgtmedia.com/rms/editorial/082318_sonarqube_maven_fig2_half_column_mobile.png"
       srcset="https://cdn.ttgtmedia.com/rms/editorial/082318_sonarqube_maven_fig2_half_column_mobile.png 960w, https://cdn.ttgtmedia.com/rms/editorial/082318_sonarqube_maven_fig2_half_column_desktop.png 1280w"
       alt="SonarQube dashboard grading a Maven Java project" />
  <figcaption>SonarQube grades the Maven-based Java project. Image: TheServerSide.com</figcaption>
</figure>



<p class="wp-block-paragraph">Drilling down into the issues view reveals the severity breakdown of those 14 code smells:</p>



<ul class="wp-block-list">
  <li><strong>Blocker:</strong> 0</li>
  <li><strong>Critical:</strong> 3</li>
  <li><strong>Major:</strong> 5</li>
  <li><strong>Minor / Info:</strong> remaining issues</li>
</ul>



<figure class="wp-block-image">
  <img decoding="async" src="https://cdn.ttgtmedia.com/rms/editorial/082318_sonarqube_maven_fig3_half_column_mobile.png"
       srcset="https://cdn.ttgtmedia.com/rms/editorial/082318_sonarqube_maven_fig3_half_column_mobile.png 960w, https://cdn.ttgtmedia.com/rms/editorial/082318_sonarqube_maven_fig3_half_column_desktop.png 1280w"
       alt="SonarQube code smell severity breakdown" />
  <figcaption>Severity breakdown of the code smells identified by the SonarQube Maven Plugin. Image: TheServerSide.com</figcaption>
</figure>



<p class="wp-block-paragraph">SonarQube evaluates code against multiple quality axes — including reliability, security, maintainability, coverage, duplications, and complexity. Each issue is linked to a specific rule so developers can understand what the problem is and how to fix it.</p>



<h2 class="wp-block-heading">Key Takeaways</h2>



<ul class="wp-block-list">
  <li>The SonarQube Maven Plugin requires only a single <code>mvn sonar:sonar</code> command to trigger a full code quality scan.</li>
  <li>The command must be run from the directory containing <code>pom.xml</code>.</li>
  <li>Results are immediately available in the SonarQube web dashboard after a successful build.</li>
  <li>Issue severity levels — Blocker, Critical, Major, Minor, Info — help teams prioritise remediation effort.</li>
  <li>Integrating this command into your CI pipeline (Jenkins, GitLab CI, GitHub Actions, etc.) enables automatic quality checks on every commit or pull request.</li>
</ul>



<h2 class="wp-block-heading">Next Steps</h2>



<p class="wp-block-paragraph">Once you are comfortable running on-demand scans, consider the following improvements:</p>



<ol class="wp-block-list">
  <li><strong>Add authentication:</strong> Secure your SonarQube instance and pass a token using <code>-Dsonar.login=&lt;token&gt;</code>.</li>
  <li><strong>Configure Quality Gates:</strong> Define pass/fail thresholds in the SonarQube UI so that a CI build fails automatically when quality drops below your standards.</li>
  <li><strong>Embed in CI:</strong> Add the <code>mvn sonar:sonar</code> step to your pipeline definition file so every push is analysed without manual intervention.</li>
  <li><strong>Tune rules:</strong> Customise the active Quality Profile in SonarQube to match your team&#8217;s coding standards.</li>
</ol>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bestdevops.com/how-to-use-the-sonarqube-maven-plugin-for-continuous-inspection/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<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>
