package Ġcom . c rite o . gradle . find j ars Ċ Ċ import Ġorg . gradle . api . Default Task Ċ import Ġorg . gradle . api . tasks . Input Ċ import Ġorg . gradle . api . tasks . Optional Ċ import Ġorg . gradle . api . tasks . Task Action Ċ import Ġorg . gradle . api . tasks . options . Option Ċ Ċ open Ġclass ĠFind J ars Task Ġ: ĠDefault Task () Ġ{ ĊĊĠĠĠ Ġ@ Input ĊĠĠĠ Ġ@ Optional ĊĠĠĠ Ġ@ Option ( option Ġ= Ġ" contains ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" Regular Ġexpression Ġmatched Ġagainst Ġthe Ġpath Ġof Ġa Ġfile Ġinside Ġa Ġjar Ġ( default = Ġ' .* class '). ") ĊĠĠĠ Ġvar Ġjar Filter Ġ= Ġ" .* class " ĊĊĠĠĠ Ġ@ Input ĊĠĠĠ Ġ@ Optional ĊĠĠĠ Ġ@ Option ( option Ġ= Ġ" configuration ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" Configuration Ġto Ġlook Ġfor Ġj ars Ġ( default = compile ). ") ĊĠĠĠ Ġvar Ġconfiguration Ġ= Ġ" compile " ĊĊĠĠĠ Ġ@ Input ĊĠĠĠ Ġ@ Optional ĊĠĠĠ Ġ@ Option ( option Ġ= Ġ" find - conflict s ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" Find Ġj ars Ġthat Ġcontain Ġfiles Ġwith Ġthe Ġsame Ġpath Ġ( com / c rite o / my . class ) Ġwith Ġdifferent Ġcontent Ġ( default = false ). ") ĊĠĠĠ Ġvar Ġfind Conflict s Ġ= Ġfalse ĊĊĠĠĠ Ġ@ Task Action ĊĠĠĠ Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjar File And Entry Ġ= ĠJar File And Entry . scan ( project , Ġconfiguration , Ġlogger , Ġjar Filter ) ĊĠĠĠĠĠĠĠ Ġif Ġ( find Conflict s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreport Conflict s ( jar File And Entry ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreport Found J ars ( jar File And Entry ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreport Found J ars ( jar File And Entry : ĠCollection < Jar File And Entry >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( jar File And Entry . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . lifecycle (" Did Ġnot Ġfind Ġany Ġjar ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjar File And Entry . map Ġ{ Ġit . jar Ġ}. distinct (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . lifecycle ("- Ġ${ it . jar Path }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreport Conflict s ( jar File And Entry : ĠCollection < Jar File And Entry >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġentries Ġ= ĠEnt ries In Multiple J ars ( jar File And Entry ) ĊĠĠĠĠĠĠĠ Ġif Ġ( entries . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . lifecycle (" No Ġconflicts Ġfound .") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfactor ized Conflict s : ĠMap < Conflict ing J ars , ĠList < String >> Ġ= Ġentries . factor ize () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfactor ized Conflict s . forEach Ġ{ Ġkey , Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . lifecycle (" J ars :") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey . j ars . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . lifecycle ("- Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . lifecycle (" conflict Ġon :") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreport Conflict ing Classes ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreport Conflict ing Classes ( conflict ing Classes : ĠCollection < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġconflicting Classes . size ĊĠĠĠĠĠĠĠ Ġval Ġmax Classes Ġ= Ġ 5 ĊĠĠĠĠĠĠĠ Ġval Ġadd Three Dot s Ġ= Ġlength Ġ> Ġmax Classes ĊĠĠĠĠĠĠĠ Ġconflicting Classes . take ( max Classes ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . lifecycle (" Ġ- Ġ$ it ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( add Three Dot s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . lifecycle (" Ġ- Ġ... Ġ(${ length Ġ- Ġmax Classes } Ġmore )") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ