Apache Maven 102: Best Practices

A presentation at Community Over Code (ApacheCon) in October 2023 in Halifax Regional Municipality, NS, Canada by Brian Demers

Slide 1

Slide 1

source:https://communityovercode. les.wordpress.com/2023/03/halifax_harbour_sunset_skyline.jpg Maven 102 fi Best Practices Brian Demers Open Source Developer BrianDemers bdemers

Slide 2

Slide 2

Who is this guy? @BrianDemers | bdemers

Slide 3

Slide 3

source: Silicon Valley @BrianDemers | bdemers

Slide 4

Slide 4

VS @BrianDemers | bdemers

Slide 5

Slide 5

VS @BrianDemers | bdemers

Slide 6

Slide 6

Developer Productivity Engineering @BrianDemers | bdemers

Slide 7

Slide 7

https://ge.apache.org @BrianDemers | bdemers

Slide 8

Slide 8

Topics • Maven Demysti cation • Speed up your build • Things to Commit or Omit • Memes fi @BrianDemers | bdemers

Slide 9

Slide 9

@BrianDemers | bdemers

Slide 10

Slide 10

Dependency Hell Last Commit: 2010-06-28 @BrianDemers | bdemers

Slide 11

Slide 11

Dependencies are a tree $ mvn dependency:tree junit-jupiter +- junit-jupiter-api | +- opentest4j | +- junit-platform-commons | - apiguardian-api +- junit-jupiter-params - junit-jupiter-engine source: pngitem.com - Anastasiya Alferova @BrianDemers | bdemers - junit-platform-engine

Slide 12

Slide 12

Your Application Dependencies Your code @BrianDemers | bdemers

Slide 13

Slide 13

@BrianDemers | bdemers

Slide 14

Slide 14

Maven Build Lifecycle • • • • • • • • • • • • validate initialize generate-sources process-sources generate-resources process-resources compile process-classes generate-test-sources process-test-sources generate-test-resources process-test-resources @BrianDemers | bdemers • • • • • • • • • • • test-compile process-test-classes test prepare-package package pre-integration-test integration-test post-integration-test verify install deploy

Slide 15

Slide 15

Maven Build Lifecycle Phase process-resources compile process-test-resources test-compile test package install deploy @BrianDemers | bdemers Plugin Goal resources:resources compiler:compile resources:testResources compiler:testCompile surefire:test jar:jar install:install deploy:deploy

Slide 16

Slide 16

Maven Build Lifecycle Phase process-resources compile process-test-resources test-compile test package verify install deploy @BrianDemers | bdemers Plugin Goal resources:resources compiler:compile resources:testResources compiler:testCompile surefire:test jar:jar pmd:check, check style:check, jacoco:check install:install deploy:deploy

Slide 17

Slide 17

Plugin Con guration fi @BrianDemers | bdemers

Slide 18

Slide 18

Plugin Con guration fi @BrianDemers | bdemers

Slide 19

Slide 19

Plugin Con guration (example) $ mvn buildnumber:create

global config

[INFO] Storing buildNumber: 6231815 $ mvn buildnumber:create

execution config

[INFO] Storing buildNumber: 623181597908f815cb9af206a389e739d80435a5 fi @BrianDemers | bdemers

Slide 20

Slide 20

Custom Maven Plugins @Mojo(name = “roll”, defaultPhase = LifecyclePhase.VERIFY) public class DiceMojo extends org.apache.maven.plugin.AbstractMojo { @Parameter(property = “expression”, defaultValue = “1d20”) private String expression; public void execute() throws MojoExecutionException, MojoFailureException { getLog().info(“Dice eval: ” + Dice.roll(expression)); } } @BrianDemers | bdemers

Slide 21

Slide 21

Dependency Ranges source: xkcd.com/2247 @BrianDemers | bdemers

Slide 22

Slide 22

Dependency Ranges @BrianDemers | bdemers Range Meaning (,1.0] x <= 1.0 (,1.0) x < 1.0 [1.0] x == 1.0 [1.0,) x >= 1.0 (1.0,) x > 1.0 (1.0,2.0) 1.0 < x < 2.0 [1.0,2.0] 1.0 <= x <= 2.0 (,1.0],[1.2,) x <= 1.0 or x >= 1.2. Multiple sets are comma-separated (,1.1),(1.1,) x != 1.1

Slide 23

Slide 23

Pin Versions https://area-b.com/blog/2019/05/04/1210/ @BrianDemers | bdemers

Slide 24

Slide 24

Separate Unit and Integration Tests @BrianDemers | bdemers

Slide 25

Slide 25

Use Pro les headshots: xkcd.com fi @BrianDemers | bdemers

Slide 26

Slide 26

Test Jars T S E T @BrianDemers | bdemers

Slide 27

Slide 27

Uberjars Stop using the Maven Shade Plugin @BrianDemers | bdemers

Slide 28

Slide 28

Source jars S E C R U O @BrianDemers | bdemers

Slide 29

Slide 29

@BrianDemers | bdemers

Slide 30

Slide 30

@BrianDemers | bdemers

Slide 31

Slide 31

Parallel Builds @BrianDemers | bdemers

Slide 32

Slide 32

Multiple Threads Project-A Project-B api model impl service app core utility webapp @BrianDemers | bdemers

Slide 33

Slide 33

Project-B model service core webapp @BrianDemers | bdemers utility

Slide 34

Slide 34

Test w/ Multiple Threads JVM OneTest.java @BrianDemers | bdemers TwoTest.java ThreeTest.java FourTest.java

Slide 35

Slide 35

Test w/ Multiple JVMs (forkCount) @BrianDemers | bdemers JVM JVM OneTest.java ThreeTest.java TwoTest.java FourTest.java

Slide 36

Slide 36

Test w/ Multiple JVMs & Multiple Threads JVM OneTest.java @BrianDemers | bdemers JVM TwoTest.java ThreeTest.java FourTest.java

Slide 37

Slide 37

source: https://levelup.gitconnected.com/be-careful-with-java-parallel-streams-3ed0fd70c3d0 @BrianDemers | bdemers

Slide 38

Slide 38

“The future is always beginning now.” –Mark Strand @BrianDemers | bdemers

Slide 39

Slide 39

Daemon Builds are faster If you keep the JVM running @BrianDemers | bdemers

Slide 40

Slide 40

4.0.0 @BrianDemers | bdemers

Slide 41

Slide 41

Questions? Thank you! BrianDemers bdemers Learn more & get free swag