3rdstage's Wiki
Tag: sourceedit
(58 intermediate revisions by the same user not shown)
Line 41: Line 41:
   
 
==Maven Repositories==
 
==Maven Repositories==
  +
  +
* [https://mvnrepository.com/repos Maven repository list]
  +
* [https://support.sonatype.com/hc/en-us/articles/217611787-codehaus-org-Repositories-Should-Be-Removed-From-Your-Nexus-Instance <code>codehaus.org</code> Repositories Should Be Removed From Your Nexus Instance] (September 27, 2016)
  +
 
* '''Central Repository''' : http://search.maven.org/#browse
 
* '''Central Repository''' : http://search.maven.org/#browse
 
* '''Main Repositories''' : http://mvnrepository.com/
 
* '''Main Repositories''' : http://mvnrepository.com/
Line 72: Line 76:
   
 
==Maven Plug-ins==
 
==Maven Plug-ins==
  +
  +
* [http://maven.apache.org/plugins/ Maven Plugin List]
   
 
===Utilities===
 
===Utilities===
Line 79: Line 85:
   
 
* '''Build Helper Plugin'''
 
* '''Build Helper Plugin'''
** http://mojo.codehaus.org/build-helper-maven-plugin/
+
** https://www.mojohaus.org/build-helper-maven-plugin/
   
 
* '''Build Number Plugin'''
 
* '''Build Number Plugin'''
Line 94: Line 100:
   
 
* '''Properties Plugin'''
 
* '''Properties Plugin'''
** http://mojo.codehaus.org/properties-maven-plugin/
+
** https://www.mojohaus.org/properties-maven-plugin/
 
** Provides goals to read and write properties from and to files.
 
** Provides goals to read and write properties from and to files.
   
Line 120: Line 126:
   
 
* '''FindBugs Plugin'''
 
* '''FindBugs Plugin'''
** http://mojo.codehaus.org/findbugs-maven-plugin/
+
** http://gleclaire.github.io/findbugs-maven-plugin/
  +
** [http://gleclaire.github.io/findbugs-maven-plugin/examples/multi-module-config.html Multimodule Configuration]
  +
** [http://gleclaire.github.io/findbugs-maven-plugin/faq.html#Aggregate_Reporting Is there an easy way to generate the aggregate report ?] : ''Unfortunately ...''
   
 
* '''PMD Plugin'''
 
* '''PMD Plugin'''
Line 150: Line 158:
 
** http://creadur.apache.org/rat/apache-rat-plugin/
 
** http://creadur.apache.org/rat/apache-rat-plugin/
 
** verifies, whether your source code matches standards like the ASF Source Header and Copyright Notice Policy
 
** verifies, whether your source code matches standards like the ASF Source Header and Copyright Notice Policy
  +
  +
* '''m2e-code-quality'''
  +
** http://m2e-code-quality.github.io/m2e-code-quality/
  +
** Desc. : A collection of Eclipse plugins for M2Eclipse that carry configuration from the Checkstyle, FindBugs and PMD Maven plugins to their corresponding Eclipse plugins.
  +
** License: Apache-2.0
  +
** Sources : https://github.com/m2e-code-quality/m2e-code-quality/
   
 
===Continuous integration tools support===
 
===Continuous integration tools support===
Line 199: Line 213:
 
** http://scala-tools.org/mvnsites/maven-scala-plugin/
 
** http://scala-tools.org/mvnsites/maven-scala-plugin/
 
** Desc. : used for compiling/testing/running/documenting scala code in maven.
 
** Desc. : used for compiling/testing/running/documenting scala code in maven.
  +
  +
* '''mvn-golang'''
  +
** https://github.com/raydac/mvn-golang
  +
** Desc.: A Maven plugin allows to build Go applications with maven
  +
** Readings
  +
*** [https://github.com/raydac/mvn-golang/wiki/PluginConfigParameters Configuration parameters of the mvn-golang-wrapper plugin]
   
 
* '''Frontend Maven Plugin'''
 
* '''Frontend Maven Plugin'''
Line 208: Line 228:
   
 
===Application frameworks support===
 
===Application frameworks support===
  +
  +
* '''Spring Boot Maven Plugin'''
  +
** https://docs.spring.io/spring-boot/docs/current/maven-plugin/
  +
** provides Spring Boot support in Maven, allowing you to package executable jar or war archives and run an application “in-place”
   
 
* '''AspectJ Plugin'''
 
* '''AspectJ Plugin'''
Line 291: Line 315:
 
===Sonatype books===
 
===Sonatype books===
   
*[http://books.sonatype.com/mvnref-book/reference/ Maven: The Complete Reference]
+
* [https://books.sonatype.com/mvnref-book/reference/index.html Maven: The Complete Reference]
*[http://books.sonatype.com/mvnex-book/reference/index.html Maven by Example]
+
* [https://books.sonatype.com/mvnex-book/reference/index.html Maven by Example]
*[http://books.sonatype.com/nexus-book/ Repository Management with Nexus]
+
* [http://books.sonatype.com/nexus-book/ Repository Management with Nexus]
   
*[http://www.sonatype.com/books/mcookbook/reference/ Maven Cookbook]
+
* [https://books.sonatype.com/mcookbook/pdf/mcookbook-pdf.pdf Maven Cookbook]
*[http://www.sonatype.com/books/m2eclipse-book/reference/ Developing with Eclipse and Maven]
+
* [http://www.sonatype.com/books/m2eclipse-book/reference/ Developing with Eclipse and Maven]
   
 
===Multi module project===
 
===Multi module project===
Line 319: Line 343:
 
* [http://maven.apache.org/plugins/maven-javadoc-plugin/examples/aggregate.html Aggregating Javadocs For Multi-Projects]
 
* [http://maven.apache.org/plugins/maven-javadoc-plugin/examples/aggregate.html Aggregating Javadocs For Multi-Projects]
 
* [http://mojo.codehaus.org/findbugs-maven-plugin/examples/multi-module-config.html Maven FindBugs Plugin/Multimodule Configuration]
 
* [http://mojo.codehaus.org/findbugs-maven-plugin/examples/multi-module-config.html Maven FindBugs Plugin/Multimodule Configuration]
  +
* [https://issues.apache.org/jira/browse/MSITE-443 add a reportingManagement section]
  +
** reporting plugin and <code><pluginManagement></code>
  +
* [https://stackoverflow.com/questions/33866209/linking-to-javadoc-io-using-javadoc-link-option Linking to javadoc.io using Javadoc -link option](Nov 23 '15)
   
 
===Maven assemblies===
 
===Maven assemblies===
Line 341: Line 368:
   
 
===Site process===
 
===Site process===
  +
*[http://maven.apache.org/guides/mini/guide-site.html Creating a site]
 
*[http://maven.apache.org/doxia/doxia-sitetools/doxia-decoration-model/decoration.html XML Schema Reference for the site descriptor]
+
* [http://maven.apache.org/guides/mini/guide-site.html Creating a site]
*[http://maven.apache.org/plugins/maven-site-plugin/examples/sitedescriptor.html Configuring the site descriptor]
+
* [http://maven.apache.org/doxia/doxia-sitetools/doxia-decoration-model/decoration.html XML Schema Reference for the site descriptor]
*[http://maven.apache.org/plugins/maven-project-info-reports-plugin/ Maven Project Info Reports Plugin]
+
* [http://maven.apache.org/plugins/maven-site-plugin/examples/sitedescriptor.html Configuring the site descriptor]
  +
* [http://maven.apache.org/plugins/maven-project-info-reports-plugin/ Maven Project Info Reports Plugin]
*[http://www.sonatype.com/books/mvnref-book/reference/site-generation-sect-site-appearance.html Customizing Site Appearance]
 
  +
* [http://www.sonatype.com/books/mvnref-book/reference/site-generation-sect-site-appearance.html Customizing Site Appearance]
*[http://maven.apache.org/doxia/modules/ Doxia Modules Guide]
 
*[http://code.google.com/p/doxia-module-markdown/ doxia-module-markdown]
+
* [http://maven.apache.org/doxia/modules/ Doxia Modules Guide]
  +
* [http://code.google.com/p/doxia-module-markdown/ doxia-module-markdown]
*[http://maven.40175.n5.nabble.com/How-to-use-confluence-format-td326724.html How to use confluence format? (in Maven site generation)]
 
  +
* [http://maven.40175.n5.nabble.com/How-to-use-confluence-format-td326724.html How to use confluence format? (in Maven site generation)]
  +
* [https://maven.apache.org/plugins/maven-site-plugin/examples/multimodule.html Building multi-module sites]
  +
* [https://maven.apache.org/plugins/maven-site-plugin/faq.html#Use_of_url '''How does the Site Plugin use the <url> element in the POM?''']
  +
** ''In a multi module build it is important for the parent and child modules to have different URLs. ...''
   
 
===Release process===
 
===Release process===
  +
*[http://www.sonatype.com/people/2011/01/using-the-maven-release-plugin-things-to-know/ Using the Maven Release plugin: Things to know]
 
  +
* [http://www.sonatype.com/people/2011/01/using-the-maven-release-plugin-things-to-know/ Using the Maven Release plugin: Things to know]
*[https://cwiki.apache.org/confluence/display/ARCHIVA/Archiva+Release+Process Archiva Release Process (Real-world sample of Maven release plugin)]
 
  +
* [https://cwiki.apache.org/confluence/display/ARCHIVA/Archiva+Release+Process Archiva Release Process (Real-world sample of Maven release plugin)]
*[http://maven.40175.n5.nabble.com/Deploying-same-version-overwrites-existing-release-td94691.html Deploying same version overwrites existing release]
 
  +
* [http://maven.40175.n5.nabble.com/Deploying-same-version-overwrites-existing-release-td94691.html Deploying same version overwrites existing release]
  +
* [https://devcenter.heroku.com/articles/using-a-custom-maven-settings-xml Using a Custom Maven Settings File] (08 December 2014)
   
 
===Property and Interpolation===
 
===Property and Interpolation===
Line 375: Line 408:
 
project.build.testOutputDirectory // target/test-classes
 
project.build.testOutputDirectory // target/test-classes
 
project.build.directory // target
 
project.build.directory // target
  +
project.reporting.outputDirectory
  +
project.parent.basedir
  +
currentYear
  +
 
env.PATH
 
env.PATH
 
env.HOME
 
env.HOME
Line 405: Line 442:
 
* [https://maven.apache.org/enforcer/enforcer-rules/requireJavaVersion.html How to enforces certain Java JDK versions]
 
* [https://maven.apache.org/enforcer/enforcer-rules/requireJavaVersion.html How to enforces certain Java JDK versions]
   
  +
* [https://blog.progs.be/517/publishing-javadoc-to-github-using-maven '''Publishing javadoc to github using maven'''] (September 9, 2013)
==HOWTOs==
 
  +
  +
==Tips and Tricks==
   
 
===Simple POM===
 
===Simple POM===
   
<syntaxhighlight lang="xml" line enclose='div'>
+
<syntaxhighlight lang="xml" line enclose='div' style="margin-left:40px">
 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 
<modelVersion>4.0.0</modelVersion>
 
<modelVersion>4.0.0</modelVersion>
Line 419: Line 458:
 
<maven>3.0</maven>
 
<maven>3.0</maven>
 
</prerequisites>
 
</prerequisites>
  +
  +
<name>Project Name</name>
  +
<description>...</description>
  +
  +
<developers>
  +
<developer>
  +
<id>3rdstage</id>
  +
<name>Sangmoon Oh</name>
  +
<email>halfface@chollian.net</email>
  +
</developer>
  +
</developers>
   
 
<properties>
 
<properties>
 
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
 
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  +
<!-- control build behavior -->
 
<skipTests>false</skipTests>
 
<skipTests>false</skipTests>
 
<maven.deploy.skip>true</maven.deploy.skip>
 
<maven.deploy.skip>true</maven.deploy.skip>
  +
<maven.site.skip>false</maven.site.skip> <!-- consumed by maven-site-plugin -->
  +
<maven.site.deploy.skip>true</maven.site.deploy.skip> <!-- consumed by maven-site-plugin -->
  +
<generateProjectInfo>false</generateProjectInfo> <!-- consumed by maven-site-plugin -->
  +
<generateReports>true</generateReports> <!-- consumed by maven-site-plugin -->
 
<maven.javadoc.skip>false</maven.javadoc.skip>
 
<maven.javadoc.skip>false</maven.javadoc.skip>
<maven.site.deploy.skip>true</maven.site.deploy.skip>
 
 
<findbugs.skip>true</findbugs.skip>
 
<findbugs.skip>true</findbugs.skip>
 
<checkstyle.skip>true</checkstyle.skip>
 
<checkstyle.skip>true</checkstyle.skip>
  +
<dependencies.release.updatePolicy>never</dependencies.release.updatePolicy>
<java.version>1.7</java.version>
 
  +
<!-- versions for Java SDK and dependencies -->
<jsr305.version>3.0.1</jsr305.version>
 
<slf4j.version>1.7.21</slf4j.version>
+
<java.version>1.8</java.version>
<logback.version>1.1.7</logback.version>
+
<jsr305.version>3.0.2</jsr305.version> <!-- https://mvnrepository.com/artifact/com.google.code.findbugs/jsr305 -->
  +
<validation-api.version>2.0.1.Final</validation-api.version> <!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
<junit.version>4.8.2</junit.version>
 
  +
<hibernate-validator.version>6.1.2.Final</hibernate-validator.version> <!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
  +
<slf4j.version>1.7.30</slf4j.version> <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
  +
<logback.version>1.2.3</logback.version> <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
  +
<janino.version>3.1.0</janino.version> <!-- https://mvnrepository.com/artifact/org.codehaus.janino/janino -->
  +
<junit5.version>5.6.1</junit5.version> <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine -->
 
<testng.version>6.9.10</testng.version>
 
<testng.version>6.9.10</testng.version>
<mockito.version>2.6.9</mockito.version>
+
<mockito.version>3.3.3</mockito.version> <!-- https://mvnrepository.com/artifact/org.mockito -->
<commons.lang3.version>3.4</commons.lang3.version>
+
<commons-lang3.version>3.9</commons-lang3.version> <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
  +
<commons-validator.version>1.6</commons-validator.version> <!-- https://mvnrepository.com/artifact/commons-validator/commons-validator -->
<spring.version>4.0.9.RELEASE</spring.version>
 
  +
<commons-collections4.version>4.4</commons-collections4.version> <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 -->
<mybatis.version>3.4.0</mybatis.version>
 
<jackson.version>2.7.4</jackson.version>
+
<typesafe-config.version>1.3.1</typesafe-config.version>
  +
<swagger.version>2.0.8</swagger.version> <!-- https://mvnrepository.com/artifact/io.swagger.core.v3 -->
  +
<springfox-swagger2.version>2.9.2</springfox-swagger2.version> <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
  +
<mybatis.version>3.5.1</mybatis.version> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
  +
<jjwt.version>0.10.7</jjwt.version> <!-- https://mvnrepository.com/artifact/io.jsonwebtoken -->
  +
<web3j.version>4.5.17</web3j.version> <!-- https://mvnrepository.com/artifact/org.web3j -->
  +
<okhttp.version>4.3.1</okhttp.version>
  +
<!-- version for Maven plugins -->
  +
<maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version> <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-compiler-plugin -->
  +
<maven-site-plugin.version>3.9.0</maven-site-plugin.version> <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-site-plugin -->
  +
<maven-jar-plugin.version>3.2.0</maven-jar-plugin.version> <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-jar-plugin -->
  +
<maven-javadoc-plugin.version>3.2.0</maven-javadoc-plugin.version> <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-javadoc-plugin -->
  +
<findbugs-maven-plugin.version>3.0.5</findbugs-maven-plugin.version> <!-- https://mvnrepository.com/artifact/org.codehaus.mojo/findbugs-maven-plugin -->
  +
<maven-checkstyle-plugin.version>3.1.1</maven-checkstyle-plugin.version> <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-checkstyle-plugin -->
  +
<duplicate-finder-maven-plugin.version>1.4.0</duplicate-finder-maven-plugin.version> <!-- https://mvnrepository.com/artifact/org.basepom.maven/duplicate-finder-maven-plugin -->
  +
<maven-eclipse-plugin.version>2.10</maven-eclipse-plugin.version> <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-eclipse-plugin -->
  +
<web3j-maven-plugin.version>4.5.11</web3j-maven-plugin.version> <!-- https://mvnrepository.com/artifact/org.web3j/web3j-maven-plugin -->
  +
<exec-maven-plugin>1.6.0</exec-maven-plugin>
  +
<swagger-maven-plugin.version>3.1.8</swagger-maven-plugin.version> <!-- https://github.com/kongchen/swagger-maven-plugin -->
  +
<swagger-codegen-maven-plugin.version>3.0.0-rc1</swagger-codegen-maven-plugin.version> <!-- https://mvnrepository.com/artifact/io.swagger/swagger-codegen-maven-plugin -->
  +
<swagger-codegen-maven-plugin.v3.version>3.0.10</swagger-codegen-maven-plugin.v3.version> <!-- https://mvnrepository.com/artifact/io.swagger.codegen.v3/swagger-codegen-maven-plugin -->
  +
<maven.compiler.source>${java.version}</maven.compiler.source>
  +
<maven.compiler.target>${java.version}</maven.compiler.target>
 
</properties>
 
</properties>
   
 
<repositories>
 
<repositories>
  +
<!-- For more repositories, refer https://mvnrepository.com/repos -->
 
<repository>
 
<repository>
  +
<id>central1</id>
  +
<url>http://repo1.maven.org/maven2/</url>
  +
<releases>
  +
<updatePolicy>${dependencies.release.updatePolicy}</updatePolicy>
  +
</releases>
 
<snapshots>
 
<snapshots>
 
<enabled>false</enabled>
 
<enabled>false</enabled>
 
</snapshots>
 
</snapshots>
  +
</repository>
  +
<repository>
 
<id>central2</id>
 
<id>central2</id>
 
<url>http://repo2.maven.org/maven2/</url>
 
<url>http://repo2.maven.org/maven2/</url>
  +
<releases>
  +
<updatePolicy>${dependencies.release.updatePolicy}</updatePolicy>
  +
</releases>
  +
<snapshots>
  +
<enabled>false</enabled>
  +
</snapshots>
 
</repository>
 
</repository>
 
<repository>
 
<repository>
  +
<id>java.net.public</id>
  +
<url>https://maven.java.net/content/groups/public/</url>
  +
<releases>
  +
<updatePolicy>${dependencies.release.updatePolicy}</updatePolicy>
  +
</releases>
 
<snapshots>
 
<snapshots>
 
<enabled>true</enabled>
 
<enabled>true</enabled>
 
</snapshots>
 
</snapshots>
<id>java.net.public</id>
 
<url>https://maven.java.net/content/groups/public/</url>
 
 
</repository>
 
</repository>
 
</repositories>
 
</repositories>
Line 461: Line 559:
 
<pluginRepositories>
 
<pluginRepositories>
 
<pluginRepository>
 
<pluginRepository>
  +
<id>central1</id>
  +
<url>http://repo1.maven.org/maven2/</url>
  +
<releases>
  +
<updatePolicy>${dependencies.release.updatePolicy}</updatePolicy>
  +
</releases>
 
<snapshots>
 
<snapshots>
 
<enabled>false</enabled>
 
<enabled>false</enabled>
 
</snapshots>
 
</snapshots>
<id>central2</id>
 
<url>http://repo2.maven.org/maven2/</url>
 
</pluginRepository>
 
<pluginRepository>
 
<snapshots>
 
<enabled>false</enabled>
 
</snapshots>
 
<id>mojo-release</id>
 
<url>http://repository.codehaus.org/</url>
 
 
</pluginRepository>
 
</pluginRepository>
 
<pluginRepository>
 
<pluginRepository>
  +
<id>central2</id>
  +
<url>http://repo2.maven.org/maven2/</url>
 
<releases>
 
<releases>
  +
<updatePolicy>${dependencies.release.updatePolicy}</updatePolicy>
<enabled>false</enabled>
 
 
</releases>
 
</releases>
 
<snapshots>
 
<snapshots>
<enabled>true</enabled>
+
<enabled>false</enabled>
 
</snapshots>
 
</snapshots>
<id>mojo-snapshot</id>
 
<url>http://snapshots.repository.codehaus.org/</url>
 
 
</pluginRepository>
 
</pluginRepository>
  +
<!-- codehaus.org has been effectively shut down as an artifact repository. -->
  +
<!-- <pluginRepository> -->
  +
<!-- <id>mojo-release</id> -->
  +
<!-- <url>http://repository.codehaus.org/</url> -->
  +
<!-- <releases> -->
  +
<!-- <updatePolicy>${dependencies.release.updatePolicy}</updatePolicy> -->
  +
<!-- </releases> -->
  +
<!-- <snapshots> -->
  +
<!-- <enabled>false</enabled> -->
  +
<!-- </snapshots> -->
  +
<!-- </pluginRepository> -->
  +
<!-- <pluginRepository> -->
  +
<!-- <id>mojo-snapshot</id> -->
  +
<!-- <url>http://snapshots.repository.codehaus.org/</url> -->
  +
<!-- <releases> -->
  +
<!-- <enabled>false</enabled> -->
  +
<!-- </releases> -->
  +
<!-- <snapshots> -->
  +
<!-- <enabled>true</enabled> -->
  +
<!-- </snapshots> -->
  +
<!-- </pluginRepository> -->
 
</pluginRepositories>
 
</pluginRepositories>
   
 
<reporting>
 
<reporting>
 
<plugins>
 
<plugins>
  +
<plugin>
  +
<groupId>org.apache.maven.plugins</groupId>
  +
<artifactId>maven-project-info-reports-plugin</artifactId>
  +
<reportSets>
  +
<reportSet>
  +
<reports>
  +
<report>index</report>
  +
<!-- <report>dependencies</report> -->
  +
<!-- <report>project-team</report> -->
  +
<!-- <report>mailing-list</report> -->
  +
<!-- <report>cim</report> -->
  +
<!-- <report>issue-tracking</report> -->
  +
<!-- <report>license</report> -->
  +
<!-- <report>scm</report> -->
  +
</reports>
  +
</reportSet>
  +
</reportSets>
  +
</plugin>
  +
<plugin>
  +
<groupId>org.apache.maven.plugins</groupId>
  +
<artifactId>maven-jxr-plugin</artifactId>
  +
<reportSets>
  +
<reportSet>
  +
<id>aggregate</id>
  +
<reports>
  +
<report>aggregate</report>
  +
<report>test-aggregate</report>
  +
</reports>
  +
</reportSet>
  +
</reportSets>
  +
</plugin>
  +
<plugin>
  +
<groupId>org.apache.maven.plugins</groupId>
  +
<artifactId>maven-javadoc-plugin</artifactId>
  +
<reportSets>
  +
<reportSet>
  +
<id>aggregate</id>
  +
<reports>
  +
<report>aggregate</report>
  +
</reports>
  +
</reportSet>
  +
</reportSets>
  +
</plugin>
  +
<plugin>
  +
<groupId>org.apache.maven.plugins</groupId>
  +
<artifactId>maven-pmd-plugin</artifactId>
  +
<configuration>
  +
<!-- For more, refer https://maven.apache.org/plugins/maven-pmd-plugin/pmd-mojo.html -->
  +
<aggregate>true</aggregate>
  +
<linkXRef>true</linkXRef>
  +
<includeXmlInSite>true</includeXmlInSite>
  +
<skipEmptyReport>true</skipEmptyReport>
  +
<skipPmdError>true</skipPmdError>
  +
</configuration>
  +
</plugin>
  +
<plugin>
  +
<groupId>org.codehaus.mojo</groupId>
  +
<artifactId>findbugs-maven-plugin</artifactId>
  +
</plugin>
 
</plugins>
 
</plugins>
 
</reporting>
 
</reporting>
Line 529: Line 703:
 
<groupId>org.apache.maven.plugins</groupId>
 
<groupId>org.apache.maven.plugins</groupId>
 
<artifactId>maven-compiler-plugin</artifactId>
 
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
+
<version>${maven-compiler-plugin.version}</version>
 
<inherited>true</inherited>
 
<inherited>true</inherited>
 
<configuration>
 
<configuration>
Line 539: Line 713:
 
<groupId>org.apache.maven.plugins</groupId>
 
<groupId>org.apache.maven.plugins</groupId>
 
<artifactId>maven-site-plugin</artifactId>
 
<artifactId>maven-site-plugin</artifactId>
<version>3.0</version>
+
<version>${maven-site-plugin.version}</version>
 
<dependencies>
 
<dependencies>
 
<dependency>
 
<dependency>
 
<groupId>org.apache.maven.wagon</groupId>
 
<groupId>org.apache.maven.wagon</groupId>
 
<artifactId>wagon-ssh</artifactId>
 
<artifactId>wagon-ssh</artifactId>
<version>2.0</version>
+
<version>2.12</version>
 
</dependency>
 
</dependency>
 
</dependencies>
 
</dependencies>
  +
</plugin>
  +
<!-- sources -->
  +
<plugin>
  +
<!-- For more, refer https://github.com/kongchen/swagger-maven-plugin -->
  +
<groupId>com.github.kongchen</groupId>
  +
<artifactId>swagger-maven-plugin</artifactId>
  +
<version>${swagger-maven-plugin.version}</version>
  +
<executions>
  +
<execution>
  +
<id>generate-swagger-api</id>
  +
<phase>process-classes</phase>
  +
<goals>
  +
<goal>generate</goal>
  +
</goals>
  +
</execution>
  +
</executions>
  +
</plugin>
  +
<plugin>
  +
<!-- For more, refer followings
  +
https://github.com/swagger-api/swagger-codegen
  +
https://github.com/swagger-api/swagger-codegen/tree/master/modules/swagger-codegen-maven-plugin
  +
-->
  +
<groupId>io.swagger</groupId>
  +
<artifactId>swagger-codegen-maven-plugin</artifactId>
  +
<version>${swagger-codegen-maven-plugin.version}</version>
  +
<executions>
  +
<execution>
  +
<id>generate-rest-api-doc</id>
  +
<phase>process-classes</phase>
  +
<goals>
  +
<goal>generate</goal>
  +
</goals>
  +
<configuration>
  +
<inputSpec>${project.build.directory}/swagger.json</inputSpec>
  +
<language>html2</language>
  +
<output>${project.build.directory}/generated-sources/swagger/html2</output>
  +
</configuration>
  +
</execution>
  +
</executions>
 
</plugin>
 
</plugin>
 
<!-- packaging -->
 
<!-- packaging -->
Line 552: Line 765:
 
<groupId>org.apache.maven.plugins</groupId>
 
<groupId>org.apache.maven.plugins</groupId>
 
<artifactId>maven-jar-plugin</artifactId>
 
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.2</version>
+
<version>${maven-jar-plugin.version}</version>
 
<configuration>
 
<configuration>
 
<!-- For more on Maven archiver, refer http://maven.apache.org/shared/maven-archiver/index.html -->
 
<!-- For more on Maven archiver, refer http://maven.apache.org/shared/maven-archiver/index.html -->
Line 576: Line 789:
 
<groupId>org.apache.maven.plugins</groupId>
 
<groupId>org.apache.maven.plugins</groupId>
 
<artifactId>maven-javadoc-plugin</artifactId>
 
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.8</version>
+
<version>${maven-javadoc-plugin.version}</version>
 
<configuration>
 
<configuration>
  +
<javadocExecutable>${java.home}/bin/javadoc</javadocExecutable>
<additionalJOptions>
 
<additionalJOption>-Xms128m</additionalJOption>
+
<!-- <javadocVersion>${java.version}</javadocVersion> -->
</additionalJOptions>
+
<source>${java.version}</source>
  +
<maxmemory>256m</maxmemory>
  +
<!-- causes error with JDK 8 <additionalJOption>-Xms128m</additionalJOption> -->
  +
<additionalJOptions>--frames</additionalJOptions>
  +
<failOnError>false</failOnError>
 
<docencoding>${project.reporting.outputEncoding}</docencoding>
 
<docencoding>${project.reporting.outputEncoding}</docencoding>
 
<encoding>${project.build.sourceEncoding}</encoding>
 
<encoding>${project.build.sourceEncoding}</encoding>
Line 586: Line 803:
 
<windowtitle>${project.name} ${project.version} API</windowtitle>
 
<windowtitle>${project.name} ${project.version} API</windowtitle>
 
<links>
 
<links>
<link>http://docs.oracle.com/javase/7/docs/api/</link>
+
<link>https://docs.oracle.com/javase/8/docs/api/</link>
<link>http://docs.oracle.com/javaee/6/api/</link>
+
<link>https://docs.oracle.com/javaee/7/api/</link>
<link>http://jsr-305.googlecode.com/svn/trunk/javadoc/</link>
+
<link>http://www.javadoc.io/doc/com.google.code.findbugs/jsr305/${jsr305.version}</link>
<link>http://docs.jboss.org/hibernate/beanvalidation/spec/1.1/api/</link>
+
<link>http://docs.jboss.org/hibernate/beanvalidation/spec/2.0/api/</link>
<link>http://docs.jboss.org/hibernate/validator/5.2/api/</link>
+
<link>http://docs.jboss.org/hibernate/validator/6.1/api/</link>
<link>http://commons.apache.org/proper/commons-lang/javadocs/api-3.3.2/</link>
+
<link>http://www.javadoc.io/doc/org.slf4j/slf4j-api/${slf4j.version}/</link>
<link>http://commons.apache.org/proper/commons-collections/javadocs/api-release/</link>
+
<link>https://junit.org/junit5/docs/${junit5.version}/api/</link>
<link>http://docs.spring.io/spring/docs/4.0.x/javadoc-api/</link>
+
<link>http://commons.apache.org/proper/commons-lang/javadocs/api-${commons-lang3.version}/</link>
  +
<link>http://commons.apache.org/proper/commons-collections/javadocs/api-${commons-collections4.version}/</link>
  +
<link>http://docs.swagger.io/swagger-core/v1.5.0/apidocs/</link>
  +
<link>https://javadoc.io/doc/org.web3j/core/${web3j.version}</link>
  +
<link>https://javadoc.io/doc/org.web3j/abi/${web3j.version}</link>
  +
<link>https://javadoc.io/doc/org.web3j/crypto/${web3j.version}</link>
  +
<link>https://javadoc.io/doc/org.web3j/utils/${web3j.version}</link>
 
</links>
 
</links>
<show>projected</show>
+
<show>protected</show>
 
<splitindex>true</splitindex>
 
<splitindex>true</splitindex>
  +
<stylesheet>java</stylesheet> <!-- 'java' (default) or 'maven' -->
  +
</configuration>
  +
</plugin>
  +
<plugin>
  +
<!-- For more, refer http://gleclaire.github.io/findbugs-maven-plugin/ -->
  +
<groupId>org.codehaus.mojo</groupId>
  +
<artifactId>findbugs-maven-plugin</artifactId>
  +
<version>${findbugs-maven-plugin.version}</version>
  +
<configuration>
  +
<effort>Max</effort>
  +
<threshold>Low</threshold>
  +
<!-- findbugs-maven-plugin doesn't provide aggregate goal or mode -->
  +
<includeFilterFile>src/config/findbugs/findbugs-exclude.xml</includeFilterFile>
  +
<plugins>
  +
<plugin>
  +
<groupId>com.mebigfatguy.fb-contrib</groupId>
  +
<artifactId>fb-contrib</artifactId>
  +
<version>6.8.3</version>
  +
</plugin>
  +
</plugins>
 
</configuration>
 
</configuration>
 
</plugin>
 
</plugin>
Line 602: Line 845:
 
<groupId>org.apache.maven.plugins</groupId>
 
<groupId>org.apache.maven.plugins</groupId>
 
<artifactId>maven-checkstyle-plugin</artifactId>
 
<artifactId>maven-checkstyle-plugin</artifactId>
<version>2.7</version>
+
<version>${maven-checkstyle-plugin.version}</version>
 
</plugin>
 
</plugin>
 
<plugin>
 
<plugin>
 
<groupId>org.basepom.maven</groupId>
 
<groupId>org.basepom.maven</groupId>
 
<artifactId>duplicate-finder-maven-plugin</artifactId>
 
<artifactId>duplicate-finder-maven-plugin</artifactId>
<version>1.2.1</version>
+
<version>${duplicate-finder-maven-plugin.version}</version>
 
</plugin>
 
</plugin>
 
<!-- tools supporting -->
 
<!-- tools supporting -->
Line 614: Line 857:
 
<groupId>org.apache.maven.plugins</groupId>
 
<groupId>org.apache.maven.plugins</groupId>
 
<artifactId>maven-eclipse-plugin</artifactId>
 
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.9</version>
+
<version>${maven-eclipse-plugin.version}</version>
 
<configuration>
 
<configuration>
 
<!-- the next two item doesn't work on m2e. m2e has its own confgiruation in Eclipse preferences -->
 
<!-- the next two item doesn't work on m2e. m2e has its own confgiruation in Eclipse preferences -->
Line 722: Line 965:
 
<groupId>javax.validation</groupId>
 
<groupId>javax.validation</groupId>
 
<artifactId>validation-api</artifactId>
 
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
+
<version>${validation-api.version}</version>
 
</dependency>
 
</dependency>
 
<dependency>
 
<dependency>
Line 728: Line 971:
 
<groupId>org.hibernate</groupId>
 
<groupId>org.hibernate</groupId>
 
<artifactId>hibernate-validator</artifactId>
 
<artifactId>hibernate-validator</artifactId>
<version>5.2.4.Final</version>
+
<version>${hibernate-validator.version}</version>
 
</dependency>
 
</dependency>
 
<dependency>
 
<dependency>
Line 738: Line 981:
 
<groupId>org.slf4j</groupId>
 
<groupId>org.slf4j</groupId>
 
<artifactId>jcl-over-slf4j</artifactId>
 
<artifactId>jcl-over-slf4j</artifactId>
  +
<version>${slf4j.version}</version>
  +
<scope>runtime</scope>
  +
</dependency>
  +
<dependency>
  +
<groupId>org.slf4j</groupId>
  +
<artifactId>jul-to-slf4j</artifactId>
 
<version>${slf4j.version}</version>
 
<version>${slf4j.version}</version>
 
</dependency>
 
</dependency>
Line 765: Line 1,014:
 
<groupId>org.mockito</groupId>
 
<groupId>org.mockito</groupId>
 
<artifactId>mockito-core</artifactId>
 
<artifactId>mockito-core</artifactId>
  +
<version>${mockito.version}</version>
  +
<scope>test</scope>
  +
</dependency>
  +
<dependency>
  +
<groupId>org.mockito</groupId>
  +
<artifactId>mockito-junit-jupiter</artifactId>
 
<version>${mockito.version}</version>
 
<version>${mockito.version}</version>
 
<scope>test</scope>
 
<scope>test</scope>
Line 772: Line 1,027:
 
<artifactId>commons-lang3</artifactId>
 
<artifactId>commons-lang3</artifactId>
 
<version>${commons.lang3.version}</version>
 
<version>${commons.lang3.version}</version>
  +
</dependency>
  +
<!-- For more typesafe config, refer https://github.com/typesafehub/config -->
  +
<dependency>
  +
<groupId>com.typesafe</groupId>
  +
<artifactId>config</artifactId>
  +
<version>${typesafe-config.version}</version>
  +
</dependency>
  +
</dependencies>
  +
</project>
  +
</syntaxhighlight>
  +
  +
===Typical POM for Spring Boot Project===
  +
  +
<syntaxhighlight lang="xml" line enclose="div" style="margin-left:40px">
  +
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  +
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  +
  +
<modelVersion>4.0.0</modelVersion>
  +
<!-- POM for Spring Boot 2.1 : https://docs.spring.io/spring-boot/docs/2.1.x/reference/htmlsingle/#getting-started-maven-installation -->
  +
<parent>
  +
<groupId>org.springframework.boot</groupId>
  +
<artifactId>spring-boot-starter-parent</artifactId>
  +
<version>2.1.6.RELEASE</version>
  +
</parent>
  +
<groupId>mygroup</groupId>
  +
<artifactId>mygroup.myproject</artifactId>
  +
<version>0.0.1-SNAPSHOT</version>
  +
  +
<name>myproject</name>
  +
<description>...</description>
  +
  +
<prerequisites>
  +
<maven>3.0</maven>
  +
</prerequisites>
  +
  +
<properties>
  +
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  +
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  +
<!-- control build behavior -->
  +
<skipTests>false</skipTests>
  +
<maven.deploy.skip>true</maven.deploy.skip>
  +
<maven.site.skip>false</maven.site.skip> <!-- consumed by maven-site-plugin -->
  +
<maven.site.deploy.skip>true</maven.site.deploy.skip> <!-- consumed by maven-site-plugin -->
  +
<generateProjectInfo>false</generateProjectInfo> <!-- consumed by maven-site-plugin -->
  +
<generateReports>true</generateReports> <!-- consumed by maven-site-plugin -->
  +
<maven.javadoc.skip>false</maven.javadoc.skip>
  +
<findbugs.skip>true</findbugs.skip>
  +
<checkstyle.skip>true</checkstyle.skip>
  +
<dependencies.release.updatePolicy>never</dependencies.release.updatePolicy>
  +
<!-- versions for Java SDK and dependencies -->
  +
<java.version>1.9</java.version>
  +
<jsr305.version>3.0.2</jsr305.version> <!-- https://mvnrepository.com/artifact/com.google.code.findbugs/jsr305 -->
  +
<validation-api.version>2.0.1.Final</validation-api.version> <!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
  +
<hibernate-validator.version>6.1.2.Final</hibernate-validator.version> <!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
  +
<slf4j.version>1.7.30</slf4j.version> <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
  +
<logback.version>1.2.3</logback.version> <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
  +
<janino.version>3.1.0</janino.version> <!-- https://mvnrepository.com/artifact/org.codehaus.janino/janino -->
  +
<junit.version>4.12</junit.version>
  +
<junit5.version>5.6.1</junit5.version> <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine -->
  +
<testng.version>6.9.10</testng.version>
  +
<mockito.version>3.1.0</mockito.version> <!-- affect the dependency version of spring-starter-test module -->
  +
<commons-lang3.version>3.9</commons-lang3.version> <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
  +
<commons-validator.version>1.6</commons-validator.version> <!-- https://mvnrepository.com/artifact/commons-validator/commons-validator -->
  +
<commons-collections4.version>4.4</commons-collections4.version> <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 -->
  +
<typesafe-config.version>1.3.1</typesafe-config.version>
  +
<swagger.version>2.0.8</swagger.version> <!-- https://mvnrepository.com/artifact/io.swagger.core.v3 -->
  +
<springfox-swagger2.version>2.9.2</springfox-swagger2.version> <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
  +
<mybatis.version>3.5.1</mybatis.version> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
  +
<jjwt.version>0.10.7</jjwt.version> <!-- https://mvnrepository.com/artifact/io.jsonwebtoken -->
  +
<web3j.version>4.5.17</web3j.version> <!-- https://mvnrepository.com/artifact/org.web3j -->
  +
<!-- version for Maven plugins -->
  +
<maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version> <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-compiler-plugin -->
  +
<maven-site-plugin.version>3.9.0</maven-site-plugin.version> <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-site-plugin -->
  +
<maven-jar-plugin.version>3.2.0</maven-jar-plugin.version> <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-jar-plugin -->
  +
<maven-javadoc-plugin.version>3.2.0</maven-javadoc-plugin.version> <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-javadoc-plugin -->
  +
<findbugs-maven-plugin.version>3.0.5</findbugs-maven-plugin.version> <!-- https://mvnrepository.com/artifact/org.codehaus.mojo/findbugs-maven-plugin -->
  +
<maven-checkstyle-plugin.version>3.1.1</maven-checkstyle-plugin.version> <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-checkstyle-plugin -->
  +
<duplicate-finder-maven-plugin.version>1.4.0</duplicate-finder-maven-plugin.version> <!-- https://mvnrepository.com/artifact/org.basepom.maven/duplicate-finder-maven-plugin -->
  +
<maven-eclipse-plugin.version>2.10</maven-eclipse-plugin.version> <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-eclipse-plugin -->
  +
<swagger-maven-plugin.version>3.1.8</swagger-maven-plugin.version> <!-- https://github.com/kongchen/swagger-maven-plugin -->
  +
<swagger-codegen-maven-plugin.version>3.0.0-rc1</swagger-codegen-maven-plugin.version> <!-- https://mvnrepository.com/artifact/io.swagger/swagger-codegen-maven-plugin -->
  +
<swagger-codegen-maven-plugin.v3.version>3.0.10</swagger-codegen-maven-plugin.v3.version> <!-- https://mvnrepository.com/artifact/io.swagger.codegen.v3/swagger-codegen-maven-plugin -->
  +
<web3j-maven-plugin.version>4.5.11</web3j-maven-plugin.version> <!-- https://mvnrepository.com/artifact/org.web3j/web3j-maven-plugin -->
  +
<exec-maven-plugin>1.6.0</exec-maven-plugin>
  +
<maven.compiler.source>${java.version}</maven.compiler.source>
  +
<maven.compiler.target>${java.version}</maven.compiler.target>
  +
</properties>
  +
  +
<repositories>
  +
<!-- For more repositories, refer https://mvnrepository.com/repos -->
  +
<repository>
  +
<id>central1</id>
  +
<url>http://repo1.maven.org/maven2/</url>
  +
<releases>
  +
<updatePolicy>${dependencies.release.updatePolicy}</updatePolicy>
  +
</releases>
  +
<snapshots>
  +
<enabled>false</enabled>
  +
</snapshots>
  +
</repository>
  +
<repository>
  +
<id>central2</id>
  +
<url>http://repo2.maven.org/maven2/</url>
  +
<releases>
  +
<updatePolicy>${dependencies.release.updatePolicy}</updatePolicy>
  +
</releases>
  +
<snapshots>
  +
<enabled>false</enabled>
  +
</snapshots>
  +
</repository>
  +
<repository>
  +
<id>java.net.public</id>
  +
<url>https://maven.java.net/content/groups/public/</url>
  +
<releases>
  +
<updatePolicy>${dependencies.release.updatePolicy}</updatePolicy>
  +
</releases>
  +
<snapshots>
  +
<enabled>true</enabled>
  +
</snapshots>
  +
</repository>
  +
<repository>
  +
<id>jcenter-snapshots</id>
  +
<name>jcenter</name>
  +
<url>https://jcenter.bintray.com/</url>
  +
</repository>
  +
</repositories>
  +
  +
<pluginRepositories>
  +
<pluginRepository>
  +
<id>central1</id>
  +
<url>http://repo1.maven.org/maven2/</url>
  +
<releases>
  +
<updatePolicy>${dependencies.release.updatePolicy}</updatePolicy>
  +
</releases>
  +
<snapshots>
  +
<enabled>false</enabled>
  +
</snapshots>
  +
</pluginRepository>
  +
<pluginRepository>
  +
<id>central2</id>
  +
<url>http://repo2.maven.org/maven2/</url>
  +
<releases>
  +
<updatePolicy>${dependencies.release.updatePolicy}</updatePolicy>
  +
</releases>
  +
<snapshots>
  +
<enabled>false</enabled>
  +
</snapshots>
  +
</pluginRepository>
  +
</pluginRepositories>
  +
  +
<reporting>
  +
<plugins>
  +
<plugin>
  +
<groupId>org.apache.maven.plugins</groupId>
  +
<artifactId>maven-project-info-reports-plugin</artifactId>
  +
<reportSets>
  +
<reportSet>
  +
<reports>
  +
<report>index</report>
  +
<!-- <report>dependencies</report> -->
  +
<!-- <report>project-team</report> -->
  +
<!-- <report>mailing-list</report> -->
  +
<!-- <report>cim</report> -->
  +
<!-- <report>issue-tracking</report> -->
  +
<!-- <report>license</report> -->
  +
<!-- <report>scm</report> -->
  +
</reports>
  +
</reportSet>
  +
</reportSets>
  +
</plugin>
  +
<plugin>
  +
<groupId>org.apache.maven.plugins</groupId>
  +
<artifactId>maven-jxr-plugin</artifactId>
  +
<reportSets>
  +
<reportSet>
  +
<id>aggregate</id>
  +
<reports>
  +
<report>aggregate</report>
  +
<report>test-aggregate</report>
  +
</reports>
  +
</reportSet>
  +
</reportSets>
  +
</plugin>
  +
<plugin>
  +
<groupId>org.apache.maven.plugins</groupId>
  +
<artifactId>maven-javadoc-plugin</artifactId>
  +
<reportSets>
  +
<reportSet>
  +
<id>aggregate</id>
  +
<reports>
  +
<report>aggregate</report>
  +
</reports>
  +
</reportSet>
  +
</reportSets>
  +
</plugin>
  +
<plugin>
  +
<groupId>org.apache.maven.plugins</groupId>
  +
<artifactId>maven-pmd-plugin</artifactId>
  +
<configuration>
  +
<!-- For more, refer https://maven.apache.org/plugins/maven-pmd-plugin/pmd-mojo.html -->
  +
<aggregate>true</aggregate>
  +
<linkXRef>true</linkXRef>
  +
<includeXmlInSite>true</includeXmlInSite>
  +
<skipEmptyReport>true</skipEmptyReport>
  +
<skipPmdError>true</skipPmdError>
  +
</configuration>
  +
</plugin>
  +
<plugin>
  +
<groupId>org.codehaus.mojo</groupId>
  +
<artifactId>findbugs-maven-plugin</artifactId>
  +
</plugin>
  +
</plugins>
  +
</reporting>
  +
  +
<build>
  +
<plugins>
  +
<plugin>
  +
<groupId>org.springframework.boot</groupId>
  +
<artifactId>spring-boot-maven-plugin</artifactId>
  +
</plugin>
  +
<plugin>
  +
<groupId>org.basepom.maven</groupId>
  +
<artifactId>duplicate-finder-maven-plugin</artifactId>
  +
<version>${duplicate-finder-maven-plugin.version}</version>
  +
<executions>
  +
<execution>
  +
<id>find-duplicate-classes</id>
  +
<phase>prepare-package</phase>
  +
<goals>
  +
<goal>check</goal>
  +
</goals>
  +
</execution>
  +
</executions>
  +
<configuration>
  +
<!-- For more, refer https://github.com/basepom/duplicate-finder-maven-plugin/wiki -->
  +
<skip>false</skip>
  +
<checkCompileClasspath>false</checkCompileClasspath>
  +
<checkRuntimeClasspath>true</checkRuntimeClasspath>
  +
<checkTestClasspath>false</checkTestClasspath>
  +
<ignoredResourcePatterns>
  +
<ignoredResourcePattern>about\.html</ignoredResourcePattern>
  +
</ignoredResourcePatterns>
  +
<ignoredClassPatterns>
  +
<ignoredClassPattern>META-INF\.versions\.9\.module-info</ignoredClassPattern>
  +
</ignoredClassPatterns>
  +
<ignoredDependencies>
  +
<dependency>
  +
<groupId>org.slf4j</groupId>
  +
<artifactId>jcl-over-slf4j</artifactId>
  +
</dependency>
  +
</ignoredDependencies>
  +
</configuration>
  +
</plugin>
  +
<plugin>
  +
<groupId>com.github.kongchen</groupId>
  +
<artifactId>swagger-maven-plugin</artifactId>
  +
<version>${swagger-maven-plugin.version}</version>
  +
<executions>
  +
<execution>
  +
<phase>compile</phase>
  +
<goals>
  +
<goal>generate</goal>
  +
</goals>
  +
<configuration>
  +
<apiSources>
  +
<apiSource>
  +
<springmvc>true</springmvc>
  +
<locations>
  +
<location>myprogram.controllers</location>
  +
</locations>
  +
<schemes>
  +
<scheme>http</scheme>
  +
</schemes>
  +
<host>localhost:8080</host>
  +
<basePath>/myappl/v1</basePath>
  +
<info>
  +
<title>REST API of My Program</title>
  +
<version>v1</version>
  +
<description>
  +
...
  +
</description>
  +
</info>
  +
<swaggerDirectory>${project.build.directory}/generated/swagger</swaggerDirectory>
  +
<swaggerFileName>api</swaggerFileName>
  +
<outputFormats>json,yaml</outputFormats>
  +
<!-- <templatePath>${basedir}/src/templates/swagger/strapdown.html.hbs</templatePath> -->
  +
<!-- <outputPath>${project.build.directory}/generated/swagger/api.html</outputPath> -->
  +
<!-- <attachSwaggerArtifact>true</attachSwaggerArtifact> -->
  +
<modelConverters>io.swagger.validator.BeanValidator</modelConverters>
  +
</apiSource>
  +
</apiSources>
  +
</configuration>
  +
</execution>
  +
</executions>
  +
</plugin>
  +
<plugin>
  +
<!-- For more, refer followings
  +
https://github.com/swagger-api/swagger-codegen/tree/3.0.0
  +
https://github.com/swagger-api/swagger-codegen/tree/3.0.0/modules/swagger-codegen-maven-plugin
  +
-->
  +
<groupId>io.swagger.codegen.v3</groupId>
  +
<artifactId>swagger-codegen-maven-plugin</artifactId>
  +
<version>${swagger-codegen-maven-plugin.v3.version}</version>
  +
<executions>
  +
<execution>
  +
<id>generate-rest-api-doc-v3</id>
  +
<phase>process-classes</phase>
  +
<goals>
  +
<goal>generate</goal>
  +
</goals>
  +
<configuration>
  +
<inputSpec>${project.build.directory}/generated/swagger/api.json</inputSpec>
  +
<language>html2</language>
  +
<output>${project.build.directory}/generated/swagger/html2</output>
  +
<generateApis>true</generateApis>
  +
</configuration>
  +
</execution>
  +
</executions>
  +
</plugin>
  +
<plugin>
  +
<groupId>org.web3j</groupId>
  +
<artifactId>web3j-maven-plugin</artifactId>
  +
<version>${web3j-maven-plugin.version}</version>
  +
</plugin>
  +
</plugins>
  +
<pluginManagement>
  +
<plugins>
  +
<!-- core -->
  +
<plugin>
  +
<groupId>org.apache.maven.plugins</groupId>
  +
<artifactId>maven-compiler-plugin</artifactId>
  +
<version>${maven-compiler-plugin.version}</version>
  +
<inherited>true</inherited>
  +
<configuration>
  +
<source>${java.version}</source>
  +
<target>${java.version}</target>
  +
</configuration>
  +
</plugin>
  +
<plugin>
  +
<groupId>org.apache.maven.plugins</groupId>
  +
<artifactId>maven-site-plugin</artifactId>
  +
<version>${maven-site-plugin.version}</version>
  +
<dependencies>
  +
<dependency>
  +
<groupId>org.apache.maven.wagon</groupId>
  +
<artifactId>wagon-ssh</artifactId>
  +
<version>2.12</version>
  +
</dependency>
  +
</dependencies>
  +
</plugin>
  +
<!-- sources -->
  +
<plugin>
  +
<!-- For more, refer followings
  +
https://github.com/swagger-api/swagger-codegen
  +
https://github.com/swagger-api/swagger-codegen/tree/master/modules/swagger-codegen-maven-plugin
  +
-->
  +
<groupId>io.swagger</groupId>
  +
<artifactId>swagger-codegen-maven-plugin</artifactId>
  +
<version>${swagger-codegen-maven-plugin.version}</version>
  +
</plugin>
  +
<!-- packaging -->
  +
<plugin>
  +
<groupId>org.apache.maven.plugins</groupId>
  +
<artifactId>maven-jar-plugin</artifactId>
  +
<version>${maven-jar-plugin.version}</version>
  +
<configuration>
  +
<!-- For more on Maven archiver, refer http://maven.apache.org/shared/maven-archiver/index.html -->
  +
<archive>
  +
<addMavenDescriptor>false</addMavenDescriptor>
  +
<forced>true</forced>
  +
<index>true</index>
  +
<manifest>
  +
<addClasspath>false</addClasspath>
  +
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
  +
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
  +
<addExtensions>false</addExtensions>
  +
<classpathLayoutType>simple</classpathLayoutType>
  +
</manifest>
  +
<manifestEntries>
  +
<Source-Revision>${project.svn.revision}</Source-Revision>
  +
</manifestEntries>
  +
</archive>
  +
</configuration>
  +
</plugin>
  +
<!-- reporting -->
  +
<plugin>
  +
<groupId>org.apache.maven.plugins</groupId>
  +
<artifactId>maven-javadoc-plugin</artifactId>
  +
<version>${maven-javadoc-plugin.version}</version>
  +
<configuration>
  +
<javadocExecutable>${java.home}/bin/javadoc</javadocExecutable>
  +
<!-- <javadocVersion>${java.version}</javadocVersion> -->
  +
<source>${java.version}</source>
  +
<maxmemory>256m</maxmemory>
  +
<!-- causes error with JDK 8 <additionalJOption>-Xms128m</additionalJOption> -->
  +
<additionalJOptions>--frames</additionalJOptions>
  +
<failOnError>false</failOnError>
  +
<docencoding>${project.reporting.outputEncoding}</docencoding>
  +
<encoding>${project.build.sourceEncoding}</encoding>
  +
<doctitle>${project.name} ${project.version} API</doctitle>
  +
<windowtitle>${project.name} ${project.version} API</windowtitle>
  +
<links>
  +
<link>https://docs.oracle.com/javase/8/docs/api/</link>
  +
<link>https://docs.oracle.com/javaee/7/api/</link>
  +
<link>https://docs.spring.io/spring/docs/5.1.x/javadoc-api/</link>
  +
<link>https://docs.spring.io/spring-boot/docs/2.1.x/api/</link>
  +
<link>http://www.javadoc.io/doc/com.google.code.findbugs/jsr305/${jsr305.version}</link>
  +
<link>http://docs.jboss.org/hibernate/beanvalidation/spec/2.0/api/</link>
  +
<link>http://docs.jboss.org/hibernate/validator/6.1/api/</link>
  +
<link>http://www.javadoc.io/doc/org.slf4j/slf4j-api/${slf4j.version}/</link>
  +
<link>https://junit.org/junit5/docs/${junit5.version}/api/</link>
  +
<link>http://commons.apache.org/proper/commons-lang/javadocs/api-${commons-lang3.version}/</link>
  +
<link>http://commons.apache.org/proper/commons-collections/javadocs/api-${commons-collections4.version}/</link>
  +
<link>https://javadoc.io/doc/org.web3j/core/${web3j.version}</link>
  +
<link>https://javadoc.io/doc/org.web3j/abi/${web3j.version}</link>
  +
<link>https://javadoc.io/doc/org.web3j/crypto/${web3j.version}</link>
  +
<link>https://javadoc.io/doc/org.web3j/utils/${web3j.version}</link>
  +
</links>
  +
<show>protected</show>
  +
<splitindex>true</splitindex>
  +
<stylesheet>java</stylesheet> <!-- 'java' (default) or 'maven' -->
  +
</configuration>
  +
</plugin>
  +
<plugin>
  +
<!-- For more, refer http://gleclaire.github.io/findbugs-maven-plugin/ -->
  +
<groupId>org.codehaus.mojo</groupId>
  +
<artifactId>findbugs-maven-plugin</artifactId>
  +
<version>${findbugs-maven-plugin.version}</version>
  +
<configuration>
  +
<effort>Max</effort>
  +
<threshold>Low</threshold>
  +
<!-- findbugs-maven-plugin doesn't provide aggregate goal or mode -->
  +
<includeFilterFile>src/config/findbugs/findbugs-exclude.xml</includeFilterFile>
  +
<plugins>
  +
<plugin>
  +
<groupId>com.mebigfatguy.fb-contrib</groupId>
  +
<artifactId>fb-contrib</artifactId>
  +
<version>6.8.3</version>
  +
</plugin>
  +
</plugins>
  +
</configuration>
  +
</plugin>
  +
<plugin>
  +
<groupId>org.apache.maven.plugins</groupId>
  +
<artifactId>maven-checkstyle-plugin</artifactId>
  +
<version>${maven-checkstyle-plugin.version}</version>
  +
</plugin>
  +
<!-- tools supporting -->
  +
<plugin>
  +
<!-- http://maven.apache.org/plugins/maven-eclipse-plugin/eclipse-mojo.html -->
  +
<groupId>org.apache.maven.plugins</groupId>
  +
<artifactId>maven-eclipse-plugin</artifactId>
  +
<version>${maven-eclipse-plugin.version}</version>
  +
<configuration>
  +
<!-- the next two item doesn't work on m2e. m2e has its own confgiruation in Eclipse preferences -->
  +
<downloadJavadocs>true</downloadJavadocs>
  +
<downloadSources>true</downloadSources>
  +
<forceRecheck>false</forceRecheck>
  +
</configuration>
  +
</plugin>
  +
<plugin>
  +
<groupId>org.eclipse.m2e</groupId>
  +
<artifactId>lifecycle-mapping</artifactId>
  +
<version>1.0.0</version>
  +
<configuration>
  +
<lifecycleMappingMetadata>
  +
<pluginExecutions>
  +
<pluginExecution>
  +
<pluginExecutionFilter>
  +
<groupId>org.apache.maven.plugins</groupId>
  +
<artifactId>maven-dependency-plugin</artifactId>
  +
<versionRange>[1.0.0,)</versionRange>
  +
<goals>
  +
<goal>copy-dependencies</goal>
  +
</goals>
  +
</pluginExecutionFilter>
  +
<action>
  +
<ignore />
  +
</action>
  +
</pluginExecution>
  +
<pluginExecution>
  +
<pluginExecutionFilter>
  +
<groupId>org.apache.maven.plugins</groupId>
  +
<artifactId>maven-antrun-plugin</artifactId>
  +
<versionRange>[1.0.0,)</versionRange>
  +
<goals>
  +
<goal>run</goal>
  +
</goals>
  +
</pluginExecutionFilter>
  +
<action>
  +
<ignore />
  +
</action>
  +
</pluginExecution>
  +
<pluginExecution>
  +
<pluginExecutionFilter>
  +
<groupId>org.codehaus.mojo</groupId>
  +
<artifactId>aspectj-maven-plugin</artifactId>
  +
<versionRange>[1.0.0,)</versionRange>
  +
<goals>
  +
<goal>compile</goal>
  +
<goal>test-compile</goal>
  +
</goals>
  +
</pluginExecutionFilter>
  +
<action>
  +
<ignore />
  +
</action>
  +
</pluginExecution>
  +
<pluginExecution>
  +
<pluginExecutionFilter>
  +
<groupId>org.codehaus.mojo</groupId>
  +
<artifactId>build-helper-maven-plugin</artifactId>
  +
<versionRange>[1.0.0,)</versionRange>
  +
<goals>
  +
<goal>parse-version</goal>
  +
</goals>
  +
</pluginExecutionFilter>
  +
<action>
  +
<ignore />
  +
</action>
  +
</pluginExecution>
  +
<pluginExecution>
  +
<pluginExecutionFilter>
  +
<groupId>net.alchim31.maven</groupId>
  +
<artifactId>scala-maven-plugin</artifactId>
  +
<versionRange>[1.0.0,)</versionRange>
  +
<goals>
  +
<goal>add-source</goal>
  +
<goal>compile</goal>
  +
<goal>testCompile</goal>
  +
</goals>
  +
</pluginExecutionFilter>
  +
<action>
  +
<ignore />
  +
</action>
  +
</pluginExecution>
  +
<pluginExecution>
  +
<pluginExecutionFilter>
  +
<groupId>io.swagger.core.v3</groupId>
  +
<artifactId>swagger-maven-plugin</artifactId>
  +
<versionRange>[1.0.0,)</versionRange>
  +
<goals>
  +
<goal>resolve</goal>
  +
</goals>
  +
</pluginExecutionFilter>
  +
<action>
  +
<ignore>
  +
<message>swagger-maven-plugin (goal "resolve") is ignored by m2e.</message>
  +
</ignore>
  +
</action>
  +
</pluginExecution>
  +
<pluginExecution>
  +
<pluginExecutionFilter>
  +
<groupId>io.swagger.codegen.v3</groupId>
  +
<artifactId>swagger-codegen-maven-plugin</artifactId>
  +
<versionRange>[1.0.0,)</versionRange>
  +
<goals>
  +
<goal>generate</goal>
  +
</goals>
  +
</pluginExecutionFilter>
  +
<action>
  +
<ignore>
  +
<message>swagger-codegen-maven-plugin (goal "generate") is ignored by m2e.</message>
  +
</ignore>
  +
</action>
  +
</pluginExecution>
  +
<pluginExecution>
  +
<pluginExecutionFilter>
  +
<groupId>com.github.kongchen</groupId>
  +
<artifactId>swagger-maven-plugin</artifactId>
  +
<versionRange>[1.0.0,)</versionRange>
  +
<goals>
  +
<goal>generate</goal>
  +
</goals>
  +
</pluginExecutionFilter>
  +
<action>
  +
<ignore>
  +
<message>wagger-maven-plugin (goal "generate") is ignored by m2e.</message>
  +
</ignore>
  +
</action>
  +
</pluginExecution>
  +
</pluginExecutions>
  +
</lifecycleMappingMetadata>
  +
</configuration>
  +
</plugin>
  +
</plugins>
  +
</pluginManagement>
  +
</build>
  +
  +
<dependencies>
  +
<dependency>
  +
<!-- JSR 305: Annotations for Software Defect Detection (https://jcp.org/en/jsr/detail?id=305) -->
  +
<groupId>com.google.code.findbugs</groupId>
  +
<artifactId>jsr305</artifactId>
  +
<version>${jsr305.version}</version>
  +
</dependency>
  +
<dependency>
  +
<!-- JSR 330: Dependency Injection for Java -->
  +
<groupId>javax.inject</groupId>
  +
<artifactId>javax.inject</artifactId>
  +
<version>1</version>
  +
</dependency>
  +
<dependency>
  +
<!-- JSR 349: Bean Validation 1.1 (https://jcp.org/en/jsr/detail?id=349) -->
  +
<groupId>javax.validation</groupId>
  +
<artifactId>validation-api</artifactId>
  +
<version>${validation-api.version}</version>
  +
</dependency>
  +
<dependency>
  +
<!-- Hibernate Validator -->
  +
<groupId>org.hibernate.validator</groupId>
  +
<artifactId>hibernate-validator</artifactId>
  +
<version>${hibernate-validator.version}</version>
  +
</dependency>
  +
<dependency>
  +
<groupId>org.slf4j</groupId>
  +
<artifactId>slf4j-api</artifactId>
  +
<version>${slf4j.version}</version>
  +
</dependency>
  +
<dependency>
  +
<groupId>org.slf4j</groupId>
  +
<artifactId>jcl-over-slf4j</artifactId>
  +
<version>${slf4j.version}</version>
  +
<scope>runtime</scope>
  +
</dependency>
  +
<dependency>
  +
<groupId>org.slf4j</groupId>
  +
<artifactId>jul-to-slf4j</artifactId>
  +
<version>${slf4j.version}</version>
  +
</dependency>
  +
<dependency>
  +
<groupId>ch.qos.logback</groupId>
  +
<artifactId>logback-classic</artifactId>
  +
<version>${logback.version}</version>
  +
</dependency>
  +
<dependency>
  +
<!-- to support conditional processing of Logback config. : https://logback.qos.ch/setup.html#janino -->
  +
<groupId>org.codehaus.janino</groupId>
  +
<artifactId>janino</artifactId>
  +
<version>${janino.version}</version>
  +
</dependency>
  +
<dependency>
  +
<!-- https://junit.org/junit5/docs/current/user-guide/#running-tests-build-maven -->
  +
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine/5.5.1 -->
  +
<!-- 'junit-jupiter-engine' depends on 'junit-jupiter-api' -->
  +
<groupId>org.junit.jupiter</groupId>
  +
<artifactId>junit-jupiter-engine</artifactId>
  +
<version>${junit5.version}</version>
  +
<scope>test</scope>
  +
</dependency>
  +
<dependency>
  +
<groupId>org.testng</groupId>
  +
<artifactId>testng</artifactId>
  +
<version>${testng.version}</version>
  +
<scope>test</scope>
  +
</dependency>
  +
<dependency>
  +
<groupId>org.mockito</groupId>
  +
<artifactId>mockito-core</artifactId>
  +
<version>${mockito.version}</version>
  +
<scope>test</scope>
  +
</dependency>
  +
<dependency>
  +
<groupId>org.apache.commons</groupId>
  +
<artifactId>commons-lang3</artifactId>
  +
<version>${commons-lang3.version}</version>
  +
</dependency>
  +
<dependency>
  +
<groupId>org.apache.commons</groupId>
  +
<artifactId>commons-collections4</artifactId>
  +
<version>${commons-collections4.version}</version>
  +
</dependency>
  +
<dependency>
  +
<!-- For more typesafe config, refer https://github.com/typesafehub/config -->
  +
<groupId>com.typesafe</groupId>
  +
<artifactId>config</artifactId>
  +
<version>${typesafe-config.version}</version>
  +
</dependency>
  +
<!-- Either web or webflux -->
  +
<dependency>
  +
<groupId>org.springframework.boot</groupId>
  +
<artifactId>spring-boot-starter-web</artifactId>
  +
</dependency>
  +
<!-- <dependency> -->
  +
<!-- <groupId>org.springframework.boot</groupId> -->
  +
<!-- <artifactId>spring-boot-starter-webflux</artifactId> -->
  +
<!-- </dependency> -->
  +
<dependency>
  +
<groupId>org.springframework.boot</groupId>
  +
<artifactId>spring-boot-starter-actuator</artifactId>
  +
</dependency>
  +
<dependency>
  +
<groupId>org.springframework.boot</groupId>
  +
<artifactId>spring-boot-starter-security</artifactId>
  +
</dependency>
  +
<dependency>
  +
<groupId>org.springframework.boot</groupId>
  +
<artifactId>spring-boot-devtools</artifactId>
  +
<scope>runtime</scope>
  +
</dependency>
  +
<dependency>
  +
<!-- https://docs.spring.io/spring-boot/docs/2.1.x/reference/htmlsingle/#boot-features-testing -->
  +
<groupId>org.springframework.boot</groupId>
  +
<artifactId>spring-boot-starter-test</artifactId>
  +
<scope>test</scope>
  +
<exclusions>
  +
<exclusion>
  +
<groupId>junit</groupId>
  +
<artifactId>junit</artifactId>
  +
</exclusion>
  +
</exclusions>
  +
</dependency>
  +
<dependency>
  +
<groupId>io.swagger.core.v3</groupId>
  +
<artifactId>swagger-core</artifactId>
  +
<version>${swagger.version}</version>
  +
</dependency>
  +
<dependency>
  +
<groupId>javax.ws.rs</groupId>
  +
<artifactId>javax.ws.rs-api</artifactId>
  +
<version>2.1</version>
  +
</dependency>
  +
<dependency>
  +
<groupId>io.swagger</groupId>
  +
<artifactId>swagger-hibernate-validations</artifactId>
  +
<version>1.5.22</version>
  +
</dependency>
  +
<dependency>
  +
<groupId>io.springfox</groupId>
  +
<artifactId>springfox-swagger2</artifactId>
  +
<version>${springfox-swagger2.version}</version>
  +
</dependency>
  +
<dependency>
  +
<groupId>io.springfox</groupId>
  +
<artifactId>springfox-swagger-ui</artifactId>
  +
<version>${springfox-swagger2.version}</version>
  +
</dependency>
  +
<dependency>
  +
<!-- Springfox Support for JSR-303 : https://springfox.github.io/springfox/docs/2.9.2/#springfox-support-for-jsr-303 -->
  +
<groupId>io.springfox</groupId>
  +
<artifactId>springfox-bean-validators</artifactId>
  +
<version>${springfox-swagger2.version}</version>
  +
</dependency>
  +
<dependency>
  +
<groupId>org.web3j</groupId>
  +
<artifactId>core</artifactId>
  +
<version>${web3j.version}</version>
  +
</dependency>
  +
<dependency>
  +
<groupId>org.web3j</groupId>
  +
<artifactId>codegen</artifactId>
  +
<version>${web3j.version}</version>
  +
</dependency>
  +
<dependency>
  +
<groupId>org.web3j</groupId>
  +
<artifactId>pantheon</artifactId>
  +
<version>4.5.1</version>
 
</dependency>
 
</dependency>
 
</dependencies>
 
</dependencies>
Line 941: Line 1,952:
 
<id>central2</id>
 
<id>central2</id>
 
<url>http://repo2.maven.org/maven2/</url>
 
<url>http://repo2.maven.org/maven2/</url>
</pluginRepository>
 
<pluginRepository>
 
<snapshots>
 
<enabled>false</enabled>
 
</snapshots>
 
<id>mojo-release</id>
 
<url>http://repository.codehaus.org/</url>
 
</pluginRepository>
 
<pluginRepository>
 
<releases>
 
<enabled>false</enabled>
 
</releases>
 
<snapshots>
 
<enabled>true</enabled>
 
</snapshots>
 
<id>mojo-snapshot</id>
 
<url>http://snapshots.repository.codehaus.org/</url>
 
 
</pluginRepository>
 
</pluginRepository>
 
<pluginRepository>
 
<pluginRepository>

Revision as of 06:39, 18 May 2020

Overview

Maven Repositories

Maven Plug-ins

Utilities

Source configuration management tools support

Code analysis tools support

  • PMD Plugin
    • http://maven.apache.org/plugins/maven-pmd-plugin/
    • allows you to automatically run the PMD code analysis tool on your project's source code and generate a site report with its results.
    • also supports the separate Copy/Paste Detector tool (or CPD) distributed with PMD.

Continuous integration tools support

Collaboration tools support

Packaging tools support

Programming languages support

Application frameworks support

Application servers support

Eclipse support

misc

Maven Skins

Readings

Sonatype books

Multi module project

Testing

Reporting

Maven assemblies

Maven snapshot repositories

Deployment process and security

Site process

Release process

Property and Interpolation

  • Built-in properties
project.groupId
project.artifactId
project.version
project.name
project.description
project.baseUri
project.build.sourceDirectory     // src/main/java
project.build.scriptSourceDirectory   // src/main/script
project.build.testSourceDirectory     // src/test/java
project.build.outputDirectory         // target/classes
project.build.testOutputDirectory     // target/test-classes
project.build.directory               // target
project.reporting.outputDirectory
project.parent.basedir
currentYear

env.PATH
env.HOME
env.JAVA_HOME

m2e

misc

Tips and Tricks

Simple POM

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>thirdstage.exercise</groupId>
  <artifactId>rest</artifactId>
  <version>0.0.1-SNAPSHOT</version>

  <prerequisites>
    <maven>3.0</maven>
  </prerequisites>

  <name>Project Name</name>
  <description>...</description>

  <developers>
    <developer>
      <id>3rdstage</id>
      <name>Sangmoon Oh</name>
      <email>halfface@chollian.net</email>
    </developer>
  </developers>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <!-- control build behavior -->
    <skipTests>false</skipTests>
    <maven.deploy.skip>true</maven.deploy.skip>
    <maven.site.skip>false</maven.site.skip> <!-- consumed by maven-site-plugin -->
    <maven.site.deploy.skip>true</maven.site.deploy.skip> <!-- consumed by maven-site-plugin -->
    <generateProjectInfo>false</generateProjectInfo> <!-- consumed by maven-site-plugin -->
    <generateReports>true</generateReports> <!-- consumed by maven-site-plugin -->
    <maven.javadoc.skip>false</maven.javadoc.skip>
    <findbugs.skip>true</findbugs.skip>
    <checkstyle.skip>true</checkstyle.skip>
    <dependencies.release.updatePolicy>never</dependencies.release.updatePolicy>
    <!-- versions for Java SDK and dependencies -->
    <java.version>1.8</java.version>
    <jsr305.version>3.0.2</jsr305.version> <!-- https://mvnrepository.com/artifact/com.google.code.findbugs/jsr305 -->
    <validation-api.version>2.0.1.Final</validation-api.version> <!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
    <hibernate-validator.version>6.1.2.Final</hibernate-validator.version> <!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
    <slf4j.version>1.7.30</slf4j.version> <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
    <logback.version>1.2.3</logback.version> <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
    <janino.version>3.1.0</janino.version> <!-- https://mvnrepository.com/artifact/org.codehaus.janino/janino -->
    <junit5.version>5.6.1</junit5.version> <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine -->
    <testng.version>6.9.10</testng.version>
    <mockito.version>3.3.3</mockito.version> <!-- https://mvnrepository.com/artifact/org.mockito -->
    <commons-lang3.version>3.9</commons-lang3.version> <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
    <commons-validator.version>1.6</commons-validator.version> <!-- https://mvnrepository.com/artifact/commons-validator/commons-validator -->
    <commons-collections4.version>4.4</commons-collections4.version> <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 -->
    <typesafe-config.version>1.3.1</typesafe-config.version>
    <swagger.version>2.0.8</swagger.version> <!-- https://mvnrepository.com/artifact/io.swagger.core.v3 -->
    <springfox-swagger2.version>2.9.2</springfox-swagger2.version> <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
    <mybatis.version>3.5.1</mybatis.version> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <jjwt.version>0.10.7</jjwt.version> <!-- https://mvnrepository.com/artifact/io.jsonwebtoken -->
    <web3j.version>4.5.17</web3j.version> <!-- https://mvnrepository.com/artifact/org.web3j -->
    <okhttp.version>4.3.1</okhttp.version>
    <!-- version for Maven plugins -->
    <maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version> <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-compiler-plugin -->
    <maven-site-plugin.version>3.9.0</maven-site-plugin.version> <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-site-plugin -->
    <maven-jar-plugin.version>3.2.0</maven-jar-plugin.version> <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-jar-plugin -->
    <maven-javadoc-plugin.version>3.2.0</maven-javadoc-plugin.version> <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-javadoc-plugin -->
    <findbugs-maven-plugin.version>3.0.5</findbugs-maven-plugin.version> <!-- https://mvnrepository.com/artifact/org.codehaus.mojo/findbugs-maven-plugin -->
    <maven-checkstyle-plugin.version>3.1.1</maven-checkstyle-plugin.version> <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-checkstyle-plugin -->
    <duplicate-finder-maven-plugin.version>1.4.0</duplicate-finder-maven-plugin.version> <!-- https://mvnrepository.com/artifact/org.basepom.maven/duplicate-finder-maven-plugin -->
    <maven-eclipse-plugin.version>2.10</maven-eclipse-plugin.version> <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-eclipse-plugin -->
    <web3j-maven-plugin.version>4.5.11</web3j-maven-plugin.version> <!-- https://mvnrepository.com/artifact/org.web3j/web3j-maven-plugin -->
    <exec-maven-plugin>1.6.0</exec-maven-plugin>
    <swagger-maven-plugin.version>3.1.8</swagger-maven-plugin.version> <!-- https://github.com/kongchen/swagger-maven-plugin -->
    <swagger-codegen-maven-plugin.version>3.0.0-rc1</swagger-codegen-maven-plugin.version> <!-- https://mvnrepository.com/artifact/io.swagger/swagger-codegen-maven-plugin -->
    <swagger-codegen-maven-plugin.v3.version>3.0.10</swagger-codegen-maven-plugin.v3.version> <!-- https://mvnrepository.com/artifact/io.swagger.codegen.v3/swagger-codegen-maven-plugin -->
    <maven.compiler.source>${java.version}</maven.compiler.source>
    <maven.compiler.target>${java.version}</maven.compiler.target>
  </properties>

  <repositories>
    <!-- For more repositories, refer https://mvnrepository.com/repos -->
    <repository>
      <id>central1</id>
      <url>http://repo1.maven.org/maven2/</url>
      <releases>
        <updatePolicy>${dependencies.release.updatePolicy}</updatePolicy>
      </releases>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
    <repository>
      <id>central2</id>
      <url>http://repo2.maven.org/maven2/</url>
      <releases>
        <updatePolicy>${dependencies.release.updatePolicy}</updatePolicy>
      </releases>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
    <repository>
      <id>java.net.public</id>
      <url>https://maven.java.net/content/groups/public/</url>
      <releases>
        <updatePolicy>${dependencies.release.updatePolicy}</updatePolicy>
      </releases>
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
    </repository>
  </repositories>

  <pluginRepositories>
    <pluginRepository>
      <id>central1</id>
      <url>http://repo1.maven.org/maven2/</url>
      <releases>
        <updatePolicy>${dependencies.release.updatePolicy}</updatePolicy>
      </releases>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </pluginRepository>
    <pluginRepository>
      <id>central2</id>
      <url>http://repo2.maven.org/maven2/</url>
      <releases>
        <updatePolicy>${dependencies.release.updatePolicy}</updatePolicy>
      </releases>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </pluginRepository>
    <!-- codehaus.org has been effectively shut down as an artifact repository. -->
    <!-- <pluginRepository> -->
    <!-- <id>mojo-release</id> -->
    <!-- <url>http://repository.codehaus.org/</url> -->
    <!-- <releases> -->
    <!-- <updatePolicy>${dependencies.release.updatePolicy}</updatePolicy> -->
    <!-- </releases> -->
    <!-- <snapshots> -->
    <!-- <enabled>false</enabled> -->
    <!-- </snapshots> -->
    <!-- </pluginRepository> -->
    <!-- <pluginRepository> -->
    <!-- <id>mojo-snapshot</id> -->
    <!-- <url>http://snapshots.repository.codehaus.org/</url> -->
    <!-- <releases> -->
    <!-- <enabled>false</enabled> -->
    <!-- </releases> -->
    <!-- <snapshots> -->
    <!-- <enabled>true</enabled> -->
    <!-- </snapshots> -->
    <!-- </pluginRepository> -->
  </pluginRepositories>

  <reporting>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-project-info-reports-plugin</artifactId>
        <reportSets>
          <reportSet>
            <reports>
              <report>index</report>
<!--               <report>dependencies</report> -->
<!--               <report>project-team</report> -->
<!--               <report>mailing-list</report> -->
<!--               <report>cim</report> -->
<!--               <report>issue-tracking</report> -->
<!--               <report>license</report> -->
<!--               <report>scm</report> -->
            </reports>
          </reportSet>
        </reportSets>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jxr-plugin</artifactId>
        <reportSets>
          <reportSet>
            <id>aggregate</id>
            <reports>
              <report>aggregate</report>
              <report>test-aggregate</report>
            </reports>
          </reportSet>
        </reportSets>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <reportSets>
          <reportSet>
            <id>aggregate</id>
            <reports>
              <report>aggregate</report>
            </reports>
          </reportSet>
        </reportSets>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-pmd-plugin</artifactId>
        <configuration>
          <!-- For more, refer https://maven.apache.org/plugins/maven-pmd-plugin/pmd-mojo.html -->
          <aggregate>true</aggregate>
          <linkXRef>true</linkXRef>
          <includeXmlInSite>true</includeXmlInSite>
          <skipEmptyReport>true</skipEmptyReport>
          <skipPmdError>true</skipPmdError>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>findbugs-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </reporting>

  <build>
    <plugins>
      <plugin>
        <groupId>org.basepom.maven</groupId>
        <artifactId>duplicate-finder-maven-plugin</artifactId>
        <executions>
          <execution>
            <id>find-duplicate-classes</id>
            <phase>prepare-package</phase>
            <goals>
              <goal>check</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <!-- For more, refer https://github.com/basepom/duplicate-finder-maven-plugin/wiki -->
          <skip>false</skip>
          <checkCompileClasspath>false</checkCompileClasspath>
          <checkRuntimeClasspath>true</checkRuntimeClasspath>
          <checkTestClasspath>false</checkTestClasspath>
          <ignoredResourcePatterns>
            <ignoredResourcePattern>about.html</ignoredResourcePattern>
          </ignoredResourcePatterns>
          <ignoredDependencies>
            <dependency>
              <groupId>org.slf4j</groupId>
              <artifactId>jcl-over-slf4j</artifactId>
            </dependency>
          </ignoredDependencies>
        </configuration>
      </plugin>
    </plugins>
    <pluginManagement>
      <plugins>
        <!-- core -->
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>${maven-compiler-plugin.version}</version>
          <inherited>true</inherited>
          <configuration>
            <source>${java.version}</source>
            <target>${java.version}</target>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-site-plugin</artifactId>
          <version>${maven-site-plugin.version}</version>
          <dependencies>
            <dependency>
              <groupId>org.apache.maven.wagon</groupId>
              <artifactId>wagon-ssh</artifactId>
              <version>2.12</version>
            </dependency>
          </dependencies>
        </plugin>
        <!-- sources -->
        <plugin>
          <!-- For more, refer https://github.com/kongchen/swagger-maven-plugin -->
          <groupId>com.github.kongchen</groupId>
          <artifactId>swagger-maven-plugin</artifactId>
          <version>${swagger-maven-plugin.version}</version>
          <executions>
            <execution>
              <id>generate-swagger-api</id>
              <phase>process-classes</phase>
              <goals>
                <goal>generate</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
        <plugin>
          <!-- For more, refer followings
            https://github.com/swagger-api/swagger-codegen
            https://github.com/swagger-api/swagger-codegen/tree/master/modules/swagger-codegen-maven-plugin
          -->
          <groupId>io.swagger</groupId>
          <artifactId>swagger-codegen-maven-plugin</artifactId>
          <version>${swagger-codegen-maven-plugin.version}</version>
          <executions>
            <execution>
              <id>generate-rest-api-doc</id>
              <phase>process-classes</phase>
              <goals>
                <goal>generate</goal>
              </goals>
              <configuration>
                <inputSpec>${project.build.directory}/swagger.json</inputSpec>
                <language>html2</language>
                <output>${project.build.directory}/generated-sources/swagger/html2</output>
              </configuration>
            </execution>
          </executions>
        </plugin>
        <!-- packaging -->
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-jar-plugin</artifactId>
          <version>${maven-jar-plugin.version}</version>
          <configuration>
                  <!-- For more on Maven archiver, refer http://maven.apache.org/shared/maven-archiver/index.html -->
            <archive>
              <addMavenDescriptor>false</addMavenDescriptor>
              <forced>true</forced>
              <index>true</index>
              <manifest>
                <addClasspath>false</addClasspath>
                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
                <addExtensions>false</addExtensions>
                <classpathLayoutType>simple</classpathLayoutType>
              </manifest>
              <manifestEntries>
                <Source-Revision>${project.svn.revision}</Source-Revision>
              </manifestEntries>
            </archive>
          </configuration>
        </plugin>
        <!-- reporting -->
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-javadoc-plugin</artifactId>
          <version>${maven-javadoc-plugin.version}</version>
          <configuration>
            <javadocExecutable>${java.home}/bin/javadoc</javadocExecutable>
            <!--  <javadocVersion>${java.version}</javadocVersion> -->
            <source>${java.version}</source>
            <maxmemory>256m</maxmemory>
            <!-- causes error with JDK 8 <additionalJOption>-Xms128m</additionalJOption> -->
            <additionalJOptions>--frames</additionalJOptions>
            <failOnError>false</failOnError>
            <docencoding>${project.reporting.outputEncoding}</docencoding>
            <encoding>${project.build.sourceEncoding}</encoding>
            <doctitle>${project.name} ${project.version} API</doctitle>
            <windowtitle>${project.name} ${project.version} API</windowtitle>
            <links>
              <link>https://docs.oracle.com/javase/8/docs/api/</link>
              <link>https://docs.oracle.com/javaee/7/api/</link>
              <link>http://www.javadoc.io/doc/com.google.code.findbugs/jsr305/${jsr305.version}</link>
              <link>http://docs.jboss.org/hibernate/beanvalidation/spec/2.0/api/</link>
              <link>http://docs.jboss.org/hibernate/validator/6.1/api/</link>
              <link>http://www.javadoc.io/doc/org.slf4j/slf4j-api/${slf4j.version}/</link>
              <link>https://junit.org/junit5/docs/${junit5.version}/api/</link>
              <link>http://commons.apache.org/proper/commons-lang/javadocs/api-${commons-lang3.version}/</link>
              <link>http://commons.apache.org/proper/commons-collections/javadocs/api-${commons-collections4.version}/</link>
              <link>http://docs.swagger.io/swagger-core/v1.5.0/apidocs/</link>
              <link>https://javadoc.io/doc/org.web3j/core/${web3j.version}</link>
              <link>https://javadoc.io/doc/org.web3j/abi/${web3j.version}</link>
              <link>https://javadoc.io/doc/org.web3j/crypto/${web3j.version}</link>
              <link>https://javadoc.io/doc/org.web3j/utils/${web3j.version}</link>
            </links>
            <show>protected</show>
            <splitindex>true</splitindex>
            <stylesheet>java</stylesheet> <!-- 'java' (default) or 'maven' -->
          </configuration>
        </plugin>
        <plugin>
          <!-- For more, refer http://gleclaire.github.io/findbugs-maven-plugin/ -->
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>findbugs-maven-plugin</artifactId>
          <version>${findbugs-maven-plugin.version}</version>
          <configuration>
            <effort>Max</effort>
            <threshold>Low</threshold>
            <!-- findbugs-maven-plugin doesn't provide aggregate goal or mode -->
            <includeFilterFile>src/config/findbugs/findbugs-exclude.xml</includeFilterFile>
            <plugins>
              <plugin>
                <groupId>com.mebigfatguy.fb-contrib</groupId>
                <artifactId>fb-contrib</artifactId>
                <version>6.8.3</version>
              </plugin>
            </plugins>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-checkstyle-plugin</artifactId>
          <version>${maven-checkstyle-plugin.version}</version>
        </plugin>
        <plugin>
          <groupId>org.basepom.maven</groupId>
          <artifactId>duplicate-finder-maven-plugin</artifactId>
          <version>${duplicate-finder-maven-plugin.version}</version>
        </plugin>
        <!-- tools supporting -->
        <plugin>
          <!-- http://maven.apache.org/plugins/maven-eclipse-plugin/eclipse-mojo.html -->
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-eclipse-plugin</artifactId>
          <version>${maven-eclipse-plugin.version}</version>
          <configuration>
            <!-- the next two item doesn't work on m2e. m2e has its own confgiruation in Eclipse preferences -->
            <downloadJavadocs>true</downloadJavadocs>
            <downloadSources>true</downloadSources>
            <forceRecheck>false</forceRecheck>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.eclipse.m2e</groupId>
          <artifactId>lifecycle-mapping</artifactId>
          <version>1.0.0</version>
          <configuration>
            <lifecycleMappingMetadata>
              <pluginExecutions>
                <pluginExecution>
                  <pluginExecutionFilter>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-dependency-plugin</artifactId>
                    <versionRange>[1.0.0,)</versionRange>
                    <goals>
                      <goal>copy-dependencies</goal>
                    </goals>
                  </pluginExecutionFilter>
                  <action>
                    <ignore/>
                  </action>
                </pluginExecution>
                <pluginExecution>
                  <pluginExecutionFilter>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-antrun-plugin</artifactId>
                    <versionRange>[1.0.0,)</versionRange>
                    <goals>
                      <goal>run</goal>
                    </goals>
                  </pluginExecutionFilter>
                  <action>
                    <ignore/>
                  </action>
                </pluginExecution>
                <pluginExecution>
                  <pluginExecutionFilter>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>aspectj-maven-plugin</artifactId>
                    <versionRange>[1.0.0,)</versionRange>
                    <goals>
                      <goal>compile</goal>
                      <goal>test-compile</goal>
                    </goals>
                  </pluginExecutionFilter>
                  <action>
                    <ignore/>
                  </action>
                </pluginExecution>
                <pluginExecution>
                  <pluginExecutionFilter>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>build-helper-maven-plugin</artifactId>
                    <versionRange>[1.0.0,)</versionRange>
                    <goals>
                      <goal>parse-version</goal>
                    </goals>
                  </pluginExecutionFilter>
                  <action>
                    <ignore/>
                  </action>
                </pluginExecution>
                <pluginExecution>
                  <pluginExecutionFilter>
                    <groupId>net.alchim31.maven</groupId>
                    <artifactId>scala-maven-plugin</artifactId>
                    <versionRange>[1.0.0,)</versionRange>
                    <goals>
                      <goal>add-source</goal>
                      <goal>compile</goal>
                      <goal>testCompile</goal>
                    </goals>
                  </pluginExecutionFilter>
                  <action>
                    <ignore/>
                  </action>
                </pluginExecution>
              </pluginExecutions>
            </lifecycleMappingMetadata>
          </configuration>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>

  <dependencies>
    <dependency>
      <!-- JSR 305: Annotations for Software Defect Detection (https://jcp.org/en/jsr/detail?id=305) -->
      <groupId>com.google.code.findbugs</groupId>
      <artifactId>jsr305</artifactId>
      <version>${jsr305.version}</version>
    </dependency>
    <dependency>
      <!-- JSR 330: Dependency Injection for Java -->
      <groupId>javax.inject</groupId>
      <artifactId>javax.inject</artifactId>
      <version>1</version>
    </dependency>
    <dependency>
      <!-- JSR 349: Bean Validation 1.1 (https://jcp.org/en/jsr/detail?id=349) -->
      <groupId>javax.validation</groupId>
      <artifactId>validation-api</artifactId>
      <version>${validation-api.version}</version>
    </dependency>
    <dependency>
      <!-- Hibernate Validator -->
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>${hibernate-validator.version}</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>${slf4j.version}</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>jcl-over-slf4j</artifactId>
      <version>${slf4j.version}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>jul-to-slf4j</artifactId>
      <version>${slf4j.version}</version>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>${logback.version}</version>
    </dependency>
    <dependency>
      <groupId>org.codehaus.janino</groupId>
      <artifactId>janino</artifactId>
      <version>2.7.8</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>${junit.version}</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.testng</groupId>
      <artifactId>testng</artifactId>
      <version>${testng.version}</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.mockito</groupId>
      <artifactId>mockito-core</artifactId>
      <version>${mockito.version}</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.mockito</groupId>
      <artifactId>mockito-junit-jupiter</artifactId>
      <version>${mockito.version}</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
      <version>${commons.lang3.version}</version>
    </dependency>
    <!-- For more typesafe config, refer https://github.com/typesafehub/config -->
    <dependency>
      <groupId>com.typesafe</groupId>
      <artifactId>config</artifactId>
      <version>${typesafe-config.version}</version>
    </dependency>
  </dependencies>
</project>

Typical POM for Spring Boot Project

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>
  <!-- POM for Spring Boot 2.1 : https://docs.spring.io/spring-boot/docs/2.1.x/reference/htmlsingle/#getting-started-maven-installation -->
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.6.RELEASE</version>
  </parent>
  <groupId>mygroup</groupId>
  <artifactId>mygroup.myproject</artifactId>
  <version>0.0.1-SNAPSHOT</version>

  <name>myproject</name>
  <description>...</description>

  <prerequisites>
    <maven>3.0</maven>
  </prerequisites>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <!-- control build behavior -->
    <skipTests>false</skipTests>
    <maven.deploy.skip>true</maven.deploy.skip>
    <maven.site.skip>false</maven.site.skip> <!-- consumed by maven-site-plugin -->
    <maven.site.deploy.skip>true</maven.site.deploy.skip> <!-- consumed by maven-site-plugin -->
    <generateProjectInfo>false</generateProjectInfo> <!-- consumed by maven-site-plugin -->
    <generateReports>true</generateReports> <!-- consumed by maven-site-plugin -->
    <maven.javadoc.skip>false</maven.javadoc.skip>
    <findbugs.skip>true</findbugs.skip>
    <checkstyle.skip>true</checkstyle.skip>
    <dependencies.release.updatePolicy>never</dependencies.release.updatePolicy>
    <!-- versions for Java SDK and dependencies -->
    <java.version>1.9</java.version>
    <jsr305.version>3.0.2</jsr305.version> <!-- https://mvnrepository.com/artifact/com.google.code.findbugs/jsr305 -->
    <validation-api.version>2.0.1.Final</validation-api.version> <!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
    <hibernate-validator.version>6.1.2.Final</hibernate-validator.version> <!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
    <slf4j.version>1.7.30</slf4j.version> <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
    <logback.version>1.2.3</logback.version> <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
    <janino.version>3.1.0</janino.version> <!-- https://mvnrepository.com/artifact/org.codehaus.janino/janino -->
    <junit.version>4.12</junit.version>
    <junit5.version>5.6.1</junit5.version> <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine -->
    <testng.version>6.9.10</testng.version>
    <mockito.version>3.1.0</mockito.version> <!-- affect the dependency version of spring-starter-test module -->
    <commons-lang3.version>3.9</commons-lang3.version> <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
    <commons-validator.version>1.6</commons-validator.version> <!-- https://mvnrepository.com/artifact/commons-validator/commons-validator -->
    <commons-collections4.version>4.4</commons-collections4.version> <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 -->
    <typesafe-config.version>1.3.1</typesafe-config.version>
    <swagger.version>2.0.8</swagger.version> <!-- https://mvnrepository.com/artifact/io.swagger.core.v3 -->
    <springfox-swagger2.version>2.9.2</springfox-swagger2.version> <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
    <mybatis.version>3.5.1</mybatis.version> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <jjwt.version>0.10.7</jjwt.version> <!-- https://mvnrepository.com/artifact/io.jsonwebtoken -->
    <web3j.version>4.5.17</web3j.version> <!-- https://mvnrepository.com/artifact/org.web3j -->
    <!-- version for Maven plugins -->
    <maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version> <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-compiler-plugin -->
    <maven-site-plugin.version>3.9.0</maven-site-plugin.version> <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-site-plugin -->
    <maven-jar-plugin.version>3.2.0</maven-jar-plugin.version> <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-jar-plugin -->
    <maven-javadoc-plugin.version>3.2.0</maven-javadoc-plugin.version> <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-javadoc-plugin -->
    <findbugs-maven-plugin.version>3.0.5</findbugs-maven-plugin.version> <!-- https://mvnrepository.com/artifact/org.codehaus.mojo/findbugs-maven-plugin -->
    <maven-checkstyle-plugin.version>3.1.1</maven-checkstyle-plugin.version> <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-checkstyle-plugin -->
    <duplicate-finder-maven-plugin.version>1.4.0</duplicate-finder-maven-plugin.version> <!-- https://mvnrepository.com/artifact/org.basepom.maven/duplicate-finder-maven-plugin -->
    <maven-eclipse-plugin.version>2.10</maven-eclipse-plugin.version> <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-eclipse-plugin -->
    <swagger-maven-plugin.version>3.1.8</swagger-maven-plugin.version> <!-- https://github.com/kongchen/swagger-maven-plugin -->
    <swagger-codegen-maven-plugin.version>3.0.0-rc1</swagger-codegen-maven-plugin.version> <!-- https://mvnrepository.com/artifact/io.swagger/swagger-codegen-maven-plugin -->
    <swagger-codegen-maven-plugin.v3.version>3.0.10</swagger-codegen-maven-plugin.v3.version> <!-- https://mvnrepository.com/artifact/io.swagger.codegen.v3/swagger-codegen-maven-plugin -->
    <web3j-maven-plugin.version>4.5.11</web3j-maven-plugin.version> <!-- https://mvnrepository.com/artifact/org.web3j/web3j-maven-plugin -->
    <exec-maven-plugin>1.6.0</exec-maven-plugin>
    <maven.compiler.source>${java.version}</maven.compiler.source>
    <maven.compiler.target>${java.version}</maven.compiler.target>
  </properties>

  <repositories>
    <!-- For more repositories, refer https://mvnrepository.com/repos -->
    <repository>
      <id>central1</id>
      <url>http://repo1.maven.org/maven2/</url>
      <releases>
        <updatePolicy>${dependencies.release.updatePolicy}</updatePolicy>
      </releases>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
    <repository>
      <id>central2</id>
      <url>http://repo2.maven.org/maven2/</url>
      <releases>
        <updatePolicy>${dependencies.release.updatePolicy}</updatePolicy>
      </releases>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
    <repository>
      <id>java.net.public</id>
      <url>https://maven.java.net/content/groups/public/</url>
      <releases>
        <updatePolicy>${dependencies.release.updatePolicy}</updatePolicy>
      </releases>
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
    </repository>
    <repository>
      <id>jcenter-snapshots</id>
      <name>jcenter</name>
      <url>https://jcenter.bintray.com/</url>
    </repository>
  </repositories>

  <pluginRepositories>
    <pluginRepository>
      <id>central1</id>
      <url>http://repo1.maven.org/maven2/</url>
      <releases>
        <updatePolicy>${dependencies.release.updatePolicy}</updatePolicy>
      </releases>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </pluginRepository>
    <pluginRepository>
      <id>central2</id>
      <url>http://repo2.maven.org/maven2/</url>
      <releases>
        <updatePolicy>${dependencies.release.updatePolicy}</updatePolicy>
      </releases>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </pluginRepository>
  </pluginRepositories>

  <reporting>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-project-info-reports-plugin</artifactId>
        <reportSets>
          <reportSet>
            <reports>
              <report>index</report>
              <!-- <report>dependencies</report> -->
              <!-- <report>project-team</report> -->
              <!-- <report>mailing-list</report> -->
              <!-- <report>cim</report> -->
              <!-- <report>issue-tracking</report> -->
              <!-- <report>license</report> -->
              <!-- <report>scm</report> -->
            </reports>
          </reportSet>
        </reportSets>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jxr-plugin</artifactId>
        <reportSets>
          <reportSet>
            <id>aggregate</id>
            <reports>
              <report>aggregate</report>
              <report>test-aggregate</report>
            </reports>
          </reportSet>
        </reportSets>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <reportSets>
          <reportSet>
            <id>aggregate</id>
            <reports>
              <report>aggregate</report>
            </reports>
          </reportSet>
        </reportSets>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-pmd-plugin</artifactId>
        <configuration>
          <!-- For more, refer https://maven.apache.org/plugins/maven-pmd-plugin/pmd-mojo.html -->
          <aggregate>true</aggregate>
          <linkXRef>true</linkXRef>
          <includeXmlInSite>true</includeXmlInSite>
          <skipEmptyReport>true</skipEmptyReport>
          <skipPmdError>true</skipPmdError>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>findbugs-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </reporting>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
      <plugin>
        <groupId>org.basepom.maven</groupId>
        <artifactId>duplicate-finder-maven-plugin</artifactId>
        <version>${duplicate-finder-maven-plugin.version}</version>
        <executions>
          <execution>
            <id>find-duplicate-classes</id>
            <phase>prepare-package</phase>
            <goals>
              <goal>check</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <!-- For more, refer https://github.com/basepom/duplicate-finder-maven-plugin/wiki -->
          <skip>false</skip>
          <checkCompileClasspath>false</checkCompileClasspath>
          <checkRuntimeClasspath>true</checkRuntimeClasspath>
          <checkTestClasspath>false</checkTestClasspath>
          <ignoredResourcePatterns>
            <ignoredResourcePattern>about\.html</ignoredResourcePattern>
          </ignoredResourcePatterns>
          <ignoredClassPatterns>
            <ignoredClassPattern>META-INF\.versions\.9\.module-info</ignoredClassPattern>
          </ignoredClassPatterns>
          <ignoredDependencies>
            <dependency>
              <groupId>org.slf4j</groupId>
              <artifactId>jcl-over-slf4j</artifactId>
            </dependency>
          </ignoredDependencies>
        </configuration>
      </plugin>
      <plugin>
        <groupId>com.github.kongchen</groupId>
        <artifactId>swagger-maven-plugin</artifactId>
        <version>${swagger-maven-plugin.version}</version>
        <executions>
          <execution>
            <phase>compile</phase>
            <goals>
              <goal>generate</goal>
            </goals>
            <configuration>
              <apiSources>
                <apiSource>
                  <springmvc>true</springmvc>
                  <locations>
                    <location>myprogram.controllers</location>
                  </locations>
                  <schemes>
                    <scheme>http</scheme>
                  </schemes>
                  <host>localhost:8080</host>
                  <basePath>/myappl/v1</basePath>
                  <info>
                    <title>REST API of My Program</title>
                    <version>v1</version>
                    <description>
                    ...
                    </description>
                  </info>
                  <swaggerDirectory>${project.build.directory}/generated/swagger</swaggerDirectory>
                  <swaggerFileName>api</swaggerFileName>
                  <outputFormats>json,yaml</outputFormats>
                  <!-- <templatePath>${basedir}/src/templates/swagger/strapdown.html.hbs</templatePath> -->
                  <!-- <outputPath>${project.build.directory}/generated/swagger/api.html</outputPath> -->
                  <!-- <attachSwaggerArtifact>true</attachSwaggerArtifact> -->
                  <modelConverters>io.swagger.validator.BeanValidator</modelConverters>
                </apiSource>
              </apiSources>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <!-- For more, refer followings
            https://github.com/swagger-api/swagger-codegen/tree/3.0.0
            https://github.com/swagger-api/swagger-codegen/tree/3.0.0/modules/swagger-codegen-maven-plugin
        -->
        <groupId>io.swagger.codegen.v3</groupId>
        <artifactId>swagger-codegen-maven-plugin</artifactId>
        <version>${swagger-codegen-maven-plugin.v3.version}</version>
        <executions>
          <execution>
            <id>generate-rest-api-doc-v3</id>
            <phase>process-classes</phase>
            <goals>
              <goal>generate</goal>
            </goals>
            <configuration>
              <inputSpec>${project.build.directory}/generated/swagger/api.json</inputSpec>
              <language>html2</language>
              <output>${project.build.directory}/generated/swagger/html2</output>
              <generateApis>true</generateApis>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.web3j</groupId>
        <artifactId>web3j-maven-plugin</artifactId>
        <version>${web3j-maven-plugin.version}</version>
      </plugin>
    </plugins>
    <pluginManagement>
      <plugins>
        <!-- core -->
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>${maven-compiler-plugin.version}</version>
          <inherited>true</inherited>
          <configuration>
            <source>${java.version}</source>
            <target>${java.version}</target>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-site-plugin</artifactId>
          <version>${maven-site-plugin.version}</version>
          <dependencies>
            <dependency>
              <groupId>org.apache.maven.wagon</groupId>
              <artifactId>wagon-ssh</artifactId>
              <version>2.12</version>
            </dependency>
          </dependencies>
        </plugin>
        <!-- sources -->
        <plugin>
          <!-- For more, refer followings
            https://github.com/swagger-api/swagger-codegen
            https://github.com/swagger-api/swagger-codegen/tree/master/modules/swagger-codegen-maven-plugin
          -->
          <groupId>io.swagger</groupId>
          <artifactId>swagger-codegen-maven-plugin</artifactId>
          <version>${swagger-codegen-maven-plugin.version}</version>
        </plugin>
        <!-- packaging -->
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-jar-plugin</artifactId>
          <version>${maven-jar-plugin.version}</version>
          <configuration>
            <!-- For more on Maven archiver, refer http://maven.apache.org/shared/maven-archiver/index.html -->
            <archive>
              <addMavenDescriptor>false</addMavenDescriptor>
              <forced>true</forced>
              <index>true</index>
              <manifest>
                <addClasspath>false</addClasspath>
                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
                <addExtensions>false</addExtensions>
                <classpathLayoutType>simple</classpathLayoutType>
              </manifest>
              <manifestEntries>
                <Source-Revision>${project.svn.revision}</Source-Revision>
              </manifestEntries>
            </archive>
          </configuration>
        </plugin>
        <!-- reporting -->
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-javadoc-plugin</artifactId>
          <version>${maven-javadoc-plugin.version}</version>
          <configuration>
            <javadocExecutable>${java.home}/bin/javadoc</javadocExecutable>
            <!--  <javadocVersion>${java.version}</javadocVersion> -->
            <source>${java.version}</source>
            <maxmemory>256m</maxmemory>
            <!-- causes error with JDK 8 <additionalJOption>-Xms128m</additionalJOption> -->
            <additionalJOptions>--frames</additionalJOptions>
            <failOnError>false</failOnError>
            <docencoding>${project.reporting.outputEncoding}</docencoding>
            <encoding>${project.build.sourceEncoding}</encoding>
            <doctitle>${project.name} ${project.version} API</doctitle>
            <windowtitle>${project.name} ${project.version} API</windowtitle>
            <links>
              <link>https://docs.oracle.com/javase/8/docs/api/</link>
              <link>https://docs.oracle.com/javaee/7/api/</link>
              <link>https://docs.spring.io/spring/docs/5.1.x/javadoc-api/</link>
              <link>https://docs.spring.io/spring-boot/docs/2.1.x/api/</link>
              <link>http://www.javadoc.io/doc/com.google.code.findbugs/jsr305/${jsr305.version}</link>
              <link>http://docs.jboss.org/hibernate/beanvalidation/spec/2.0/api/</link>
              <link>http://docs.jboss.org/hibernate/validator/6.1/api/</link>
              <link>http://www.javadoc.io/doc/org.slf4j/slf4j-api/${slf4j.version}/</link>
              <link>https://junit.org/junit5/docs/${junit5.version}/api/</link>
              <link>http://commons.apache.org/proper/commons-lang/javadocs/api-${commons-lang3.version}/</link>
              <link>http://commons.apache.org/proper/commons-collections/javadocs/api-${commons-collections4.version}/</link>
              <link>https://javadoc.io/doc/org.web3j/core/${web3j.version}</link>
              <link>https://javadoc.io/doc/org.web3j/abi/${web3j.version}</link>
              <link>https://javadoc.io/doc/org.web3j/crypto/${web3j.version}</link>
              <link>https://javadoc.io/doc/org.web3j/utils/${web3j.version}</link>
            </links>
            <show>protected</show>
            <splitindex>true</splitindex>
            <stylesheet>java</stylesheet> <!-- 'java' (default) or 'maven' -->
          </configuration>
        </plugin>
        <plugin>
          <!-- For more, refer http://gleclaire.github.io/findbugs-maven-plugin/ -->
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>findbugs-maven-plugin</artifactId>
          <version>${findbugs-maven-plugin.version}</version>
          <configuration>
            <effort>Max</effort>
            <threshold>Low</threshold>
            <!-- findbugs-maven-plugin doesn't provide aggregate goal or mode -->
            <includeFilterFile>src/config/findbugs/findbugs-exclude.xml</includeFilterFile>
            <plugins>
              <plugin>
                <groupId>com.mebigfatguy.fb-contrib</groupId>
                <artifactId>fb-contrib</artifactId>
                <version>6.8.3</version>
              </plugin>
            </plugins>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-checkstyle-plugin</artifactId>
          <version>${maven-checkstyle-plugin.version}</version>
        </plugin>
        <!-- tools supporting -->
        <plugin>
          <!-- http://maven.apache.org/plugins/maven-eclipse-plugin/eclipse-mojo.html -->
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-eclipse-plugin</artifactId>
          <version>${maven-eclipse-plugin.version}</version>
          <configuration>
            <!-- the next two item doesn't work on m2e. m2e has its own confgiruation in Eclipse preferences -->
            <downloadJavadocs>true</downloadJavadocs>
            <downloadSources>true</downloadSources>
            <forceRecheck>false</forceRecheck>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.eclipse.m2e</groupId>
          <artifactId>lifecycle-mapping</artifactId>
          <version>1.0.0</version>
          <configuration>
            <lifecycleMappingMetadata>
              <pluginExecutions>
                <pluginExecution>
                  <pluginExecutionFilter>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-dependency-plugin</artifactId>
                    <versionRange>[1.0.0,)</versionRange>
                    <goals>
                      <goal>copy-dependencies</goal>
                    </goals>
                  </pluginExecutionFilter>
                  <action>
                    <ignore />
                  </action>
                </pluginExecution>
                <pluginExecution>
                  <pluginExecutionFilter>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-antrun-plugin</artifactId>
                    <versionRange>[1.0.0,)</versionRange>
                    <goals>
                      <goal>run</goal>
                    </goals>
                  </pluginExecutionFilter>
                  <action>
                    <ignore />
                  </action>
                </pluginExecution>
                <pluginExecution>
                  <pluginExecutionFilter>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>aspectj-maven-plugin</artifactId>
                    <versionRange>[1.0.0,)</versionRange>
                    <goals>
                      <goal>compile</goal>
                      <goal>test-compile</goal>
                    </goals>
                  </pluginExecutionFilter>
                  <action>
                    <ignore />
                  </action>
                </pluginExecution>
                <pluginExecution>
                  <pluginExecutionFilter>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>build-helper-maven-plugin</artifactId>
                    <versionRange>[1.0.0,)</versionRange>
                    <goals>
                      <goal>parse-version</goal>
                    </goals>
                  </pluginExecutionFilter>
                  <action>
                    <ignore />
                  </action>
                </pluginExecution>
                <pluginExecution>
                  <pluginExecutionFilter>
                    <groupId>net.alchim31.maven</groupId>
                    <artifactId>scala-maven-plugin</artifactId>
                    <versionRange>[1.0.0,)</versionRange>
                    <goals>
                      <goal>add-source</goal>
                      <goal>compile</goal>
                      <goal>testCompile</goal>
                    </goals>
                  </pluginExecutionFilter>
                  <action>
                    <ignore />
                  </action>
                </pluginExecution>
                <pluginExecution>
                  <pluginExecutionFilter>
                    <groupId>io.swagger.core.v3</groupId>
                    <artifactId>swagger-maven-plugin</artifactId>
                    <versionRange>[1.0.0,)</versionRange>
                    <goals>
                      <goal>resolve</goal>
                    </goals>
                  </pluginExecutionFilter>
                  <action>
                    <ignore>
                      <message>swagger-maven-plugin (goal "resolve") is ignored by m2e.</message>
                    </ignore>
                  </action>
                </pluginExecution>
                <pluginExecution>
                  <pluginExecutionFilter>
                    <groupId>io.swagger.codegen.v3</groupId>
                    <artifactId>swagger-codegen-maven-plugin</artifactId>
                    <versionRange>[1.0.0,)</versionRange>
                    <goals>
                      <goal>generate</goal>
                    </goals>
                  </pluginExecutionFilter>
                  <action>
                    <ignore>
                      <message>swagger-codegen-maven-plugin (goal "generate") is ignored by m2e.</message>
                    </ignore>
                  </action>
                </pluginExecution>
                <pluginExecution>
                  <pluginExecutionFilter>
                    <groupId>com.github.kongchen</groupId>
                    <artifactId>swagger-maven-plugin</artifactId>
                    <versionRange>[1.0.0,)</versionRange>
                    <goals>
                      <goal>generate</goal>
                    </goals>
                  </pluginExecutionFilter>
                  <action>
                    <ignore>
                      <message>wagger-maven-plugin (goal "generate") is ignored by m2e.</message>
                    </ignore>
                  </action>
                </pluginExecution>
              </pluginExecutions>
            </lifecycleMappingMetadata>
          </configuration>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>

  <dependencies>
    <dependency>
      <!-- JSR 305: Annotations for Software Defect Detection (https://jcp.org/en/jsr/detail?id=305) -->
      <groupId>com.google.code.findbugs</groupId>
      <artifactId>jsr305</artifactId>
      <version>${jsr305.version}</version>
    </dependency>
    <dependency>
      <!-- JSR 330: Dependency Injection for Java -->
      <groupId>javax.inject</groupId>
      <artifactId>javax.inject</artifactId>
      <version>1</version>
    </dependency>
    <dependency>
      <!-- JSR 349: Bean Validation 1.1 (https://jcp.org/en/jsr/detail?id=349) -->
      <groupId>javax.validation</groupId>
      <artifactId>validation-api</artifactId>
      <version>${validation-api.version}</version>
    </dependency>
    <dependency>
      <!-- Hibernate Validator -->
      <groupId>org.hibernate.validator</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>${hibernate-validator.version}</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>${slf4j.version}</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>jcl-over-slf4j</artifactId>
      <version>${slf4j.version}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>jul-to-slf4j</artifactId>
      <version>${slf4j.version}</version>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>${logback.version}</version>
    </dependency>
    <dependency>
      <!-- to support conditional processing of Logback config. : https://logback.qos.ch/setup.html#janino -->
      <groupId>org.codehaus.janino</groupId>
      <artifactId>janino</artifactId>
      <version>${janino.version}</version>
    </dependency>
    <dependency>
      <!-- https://junit.org/junit5/docs/current/user-guide/#running-tests-build-maven -->
      <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine/5.5.1 -->
      <!-- 'junit-jupiter-engine' depends on 'junit-jupiter-api' -->
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-engine</artifactId>
      <version>${junit5.version}</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.testng</groupId>
      <artifactId>testng</artifactId>
      <version>${testng.version}</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.mockito</groupId>
      <artifactId>mockito-core</artifactId>
      <version>${mockito.version}</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
      <version>${commons-lang3.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-collections4</artifactId>
      <version>${commons-collections4.version}</version>
    </dependency>
    <dependency>
      <!-- For more typesafe config, refer https://github.com/typesafehub/config -->
      <groupId>com.typesafe</groupId>
      <artifactId>config</artifactId>
      <version>${typesafe-config.version}</version>
    </dependency>
    <!-- Either web or webflux -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
<!--     <dependency> -->
<!--       <groupId>org.springframework.boot</groupId> -->
<!--       <artifactId>spring-boot-starter-webflux</artifactId> -->
<!--     </dependency> -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-devtools</artifactId>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <!-- https://docs.spring.io/spring-boot/docs/2.1.x/reference/htmlsingle/#boot-features-testing -->
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
      <exclusions>
        <exclusion>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>io.swagger.core.v3</groupId>
      <artifactId>swagger-core</artifactId>
      <version>${swagger.version}</version>
    </dependency>
    <dependency>
      <groupId>javax.ws.rs</groupId>
      <artifactId>javax.ws.rs-api</artifactId>
      <version>2.1</version>
    </dependency>
    <dependency>
      <groupId>io.swagger</groupId>
      <artifactId>swagger-hibernate-validations</artifactId>
      <version>1.5.22</version>
    </dependency>
    <dependency>
      <groupId>io.springfox</groupId>
      <artifactId>springfox-swagger2</artifactId>
      <version>${springfox-swagger2.version}</version>
    </dependency>
    <dependency>
      <groupId>io.springfox</groupId>
      <artifactId>springfox-swagger-ui</artifactId>
      <version>${springfox-swagger2.version}</version>
    </dependency>
    <dependency>
      <!-- Springfox Support for JSR-303 : https://springfox.github.io/springfox/docs/2.9.2/#springfox-support-for-jsr-303 -->
      <groupId>io.springfox</groupId>
      <artifactId>springfox-bean-validators</artifactId>
      <version>${springfox-swagger2.version}</version>
    </dependency>
    <dependency>
      <groupId>org.web3j</groupId>
      <artifactId>core</artifactId>
      <version>${web3j.version}</version>
    </dependency>
    <dependency>
      <groupId>org.web3j</groupId>
      <artifactId>codegen</artifactId>
      <version>${web3j.version}</version>
    </dependency>
    <dependency>
      <groupId>org.web3j</groupId>
      <artifactId>pantheon</artifactId>
      <version>4.5.1</version>
    </dependency>
  </dependencies>
</project>

Referencing Maven project properties of List type

//@todo

This syntax works within pom.xml and Ant build files using Maven Ant plugin. But this doesn't working with resource filtering of Maven. I can't find any explain or reason for this. Is it a bug?

    ...
    <artifact:pom id="this-pom" file="${basedir}/pom.xml"/>
    <xsddoc out="${this-pom.reporting.outputDirectory}/xsddocs"
       verbose="true">
       <fileset dir="${this-pom.build.resources[0].directory}" 
          includes="**/*.xsd"/>
    </xsddoc>
    ...

Build Lifecycle, Build Phase, Plugin and Goal

Maven-buildlifecycle


Guidelines for multi-moduled Maven project

  1. Separate parent project from container project.
  2. Define properties in the parent POM file as possible.
  3. Define the following properties explicitly for clearness and control.
    • Encoding related properties whose default value are dependent on platform.
      • project.build.sourceEncoding
      • project.reporting.outputEncoding
    • Properties to skip situationally unnecessary long running goals.
      • skipTests
      • maven.javadoc.skip
      • maven.deploy.skip
      • findbugs.skip
      • checkstyle.skip
    • Properties to run maven more stable way.
    • Paths for executable programs external to Maven
      • graphviz.home
  1. Define all plugins in the <pluginManagement> element of parent POM file.
    • Don't specify version to plugin definitions in child POM files.
  1. Define repositories in the parent POM file as possible.
  2. Define plugins to analyze or diagnose the sources or resources of the project as a reporting plugin as possible.
  3. Start values for path with ${project.basedir}, ${project.build.directory}, ${project.build.outputDirectory} or so on
    • When just specifying relative path such as 'target/classes', the result directory could be different if you build the project from the enclosing project in multi-module case.
    • If you specify the path with leading ${project.build.directory}, the resulting directory always would be one that is calculated with the current POM's project.
  1. Use resources in target/classes not in src/main/resources, considering resource filtering.

Sample of parent POM in action

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>
  <groupId>thridstage</groupId>
  <artifactId>thridstage-framework-parent</artifactId>
  <version>3.0.0-SNAPSHOT</version>
  <packaging>pom</packaging>

  <name>Thirdstage Framework</name>
  <url>...</url>
  <inceptionYear>2012</inceptionYear>
  <organization>
    <name>...</name>
    <url>...</url>
  </organization>

  <prerequisites>
    <maven>3.0</maven>
  </prerequisites>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <graphviz.home>${env.GRAPHVIZ_HOME}</graphviz.home>
    <skipTests>false</skipTests>
    <maven.deploy.skip>true</maven.deploy.skip>
    <maven.javadoc.skip>false</maven.javadoc.skip>
    <maven.site.deploy.skip>true</maven.site.deploy.skip>
    <findbugs.skip>true</findbugs.skip>
    <checkstyle.skip>true</checkstyle.skip>
    <dependency.locations.enabled>false</dependency.locations.enabled>
    <antrun.echos.properties>true</antrun.echos.properties>
    <scm.url.base>...</scm.url.base>
  </properties>

  <issueManagement>
    <system>Redmine</system>
    <url>.../issues</url>
  </issueManagement>
  <scm>
    <connection>scm:svn:http:...</connection>
    <url>http:...</url>
  </scm>
  <distributionManagement>
    <repository>
      <id>...</id>
      <name>...</name>
      <url>...</url>
    </repository>
    <snapshotRepository>
      <id>...</id>
      <name>...</name>
      <url>...</url>
    </snapshotRepository>
    <site>
      <id>...</id>
      <url>sftp://.../${project.version}</url>
    </site>
  </distributionManagement>

  <repositories>
    <repository>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <id>thirdstag-releases</id>
      <url>...</url>
    </repository>
    <repository>
      <releases>
        <enabled>false</enabled>
      </releases>
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
      <id>thirdstage-snapshots</id>
      <url>...</url>
    </repository>
    <repository>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <id>central2</id>
      <url>http://repo2.maven.org/maven2/</url>
    </repository>
    <repository>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <id>maven2-repository.dev.java.net</id>
      <name>Java.net Repository for Maven</name>
      <url>http://download.java.net/maven/2/</url>
    </repository>
    <repository>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <id>thirdparty</id>
      <name>3rd-party Repository</name>
      <url>http://repo.expertvill.net/nexus/content/repositories/thirdparty</url>
    </repository>
    <repository>
      <id>evolvis-3rdparty</id>
      <url>http://maven-repo.evolvis.org/3rdparty</url>
    </repository>
  </repositories>
  <pluginRepositories>
    <pluginRepository>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <id>central2</id>
      <url>http://repo2.maven.org/maven2/</url>
    </pluginRepository>
    <pluginRepository>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <id>spring-beandoc</id>
      <url>http://spring-beandoc.sourceforge.net/repo</url>
    </pluginRepository>
    <pluginRepository>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <id>tmatesoft-releases</id>
      <url>http://maven.tmatesoft.com/content/repositories/releases/</url>
    </pluginRepository>
    <pluginRepository>
      <releases>
        <enabled>false</enabled>
      </releases>
      <id>tmatesoft-snapshots</id>
      <url>http://maven.tmatesoft.com/content/repositories/snapshots/</url>
    </pluginRepository>
    <pluginRepository>
      <id>evolvis-3rdparty</id>
      <url>http://maven-repo.evolvis.org/3rdparty</url>
    </pluginRepository>
    <pluginRepository>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <id>elca-services</id>
      <url>http://el4.elca-services.ch/el4j/maven2repository</url>
    </pluginRepository>
  </pluginRepositories>

  <reporting>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-checkstyle-plugin</artifactId>
        <configuration>
          <configLocation>../thirdstage.framework.parent/src/main/config/checkstyle/checkstyle.xml</configLocation>
          <propertyExpansion>parent.basedir=../thirdstage.framework.parent</propertyExpansion>
          <failsOnError>false</failsOnError>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>findbugs-maven-plugin</artifactId>
        <version>2.3.2</version>
        <configuration>
          <effort>Max</effort>
          <threshold>Low</threshold>
          <onlyAnalyze>thirdstage.framework.*</onlyAnalyze>
          <excludeFilterFile>../thirdstage.framework.parent/src/main/config/findbugs/findbugs-exclude.xml</excludeFilterFile>
          <fork>true</fork>
          <timeout>600000</timeout>
          <maxHeap>512</maxHeap>
        </configuration>
      </plugin>
    </plugins>
  </reporting>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-antrun-plugin</artifactId>
        <executions>
          <execution>
            <id>validate-properties</id>
            <phase>validate</phase>
            <goals>
              <goal>run</goal>
            </goals>
            <configuration>
              <failOnError>true</failOnError>
              <target name="validate-properties">
                <taskdef name="if" classname="ise.antelope.tasks.IfTask" classpathref="maven.plugin.classpath" />

                <if name="antrun.echos.properties" value="true">
                  <echo>Head revision of the project "${project.artifactId}" is
                    ${project.svn.revision}.</echo>
                  <echo>project.artifactId : ${project.artifactId}</echo>
                  <echo>project.basedir : ${project.basedir}</echo>
                  <echo>project.resources.0.directory : ${project.resources.0.directory}</echo>
                  <echo>project.resources[0].directory : ${project.resources[0].directory}</echo>
                  <echo>project.parent : ${project.parent}</echo>
                  <echo>project.parent.groupId : ${project.parent.groupId}</echo>
                  <echo>project.parent.artifactId : ${project.parent.artifactId}</echo>
                  <echo>project.parent.relativePath :
                    ${project.parent.relativePath}</echo>

                  <pathconvert pathsep="${line.separator}" property="classpath.maven.plugin" refid="maven.plugin.classpath" />

                  <pathconvert pathsep="${line.separator}" property="classpath.maven.compile" refid="maven.compile.classpath" />
                  <echo />
                  <echo>Compile-time classpath for Maven :</echo>
                  <echo>${classpath.maven.compile}</echo>

                  <pathconvert pathsep="${line.separator}" property="classpath.maven.runtime" refid="maven.runtime.classpath" />
                  <echo />
                  <echo>Run-time classpath for Maven :</echo>
                  <echo>${classpath.maven.runtime}</echo>

                  <echo>Check Korean output : 한글이 정상적으로 보이나요?</echo>
                  
                  <!-- echo all properties passed to Ant and environment variables prefixed with 'env' -->
                  <echo>All properties given to Ant are : </echo>
                  <property environment="env" />
                  <echoproperties />
                </if>
              </target>
            </configuration>
          </execution>
        </executions>
        <dependencies>
          <dependency>
            <groupId>ise.antelope</groupId>
            <artifactId>ant-antelope-tasks</artifactId>
            <version>3.5.0</version>
          </dependency>
        </dependencies>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-release-plugin</artifactId>
        <configuration>
          <!-- 
          @fixme javaHome doesn't seem to work as is explained.
          You should specify JAVA_HOME env. variable explicitly in your run configuration when running from 
          Eclipse.
           -->
          <!--  <javaHome>c:\lang\jdk1.5</javaHome> -->
          
          <!--  <mavenHome>C:\tools\maven-3.0.3</mavenHome> -->
          <tagBase>${scm.url.base}/main/tags</tagBase>
          <tagNameFormat>@{project.version}</tagNameFormat>
          <username>OhSangMoon</username>
          <autoVersionSubmodules>true</autoVersionSubmodules>
          <pomFileName>pom.xml</pomFileName>
          <arguments>-f pom.xml</arguments>
          
          <!--  not supported by release plugin oer 2.2.2
          <generateReleasePoms>true</generateReleasePoms>
          -->
        </configuration>
      </plugin>

    </plugins>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>2.3.2</version>
          <inherited>true</inherited>
          <configuration>
            <source>1.5</source>
            <target>1.5</target>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.0</version>
          <dependencies>
            <dependency>
              <groupId>org.apache.maven.wagon</groupId>
              <artifactId>wagon-ssh</artifactId>
              <version>2.0</version>
            </dependency>
          </dependencies>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-jar-plugin</artifactId>
          <version>2.3.2</version>
          <configuration>
            <archive>
              <addMavenDescriptor>false</addMavenDescriptor>
              <forced>true</forced>
              <index>true</index>
              <manifest>
                <addClasspath>false</addClasspath>
                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
                <addExtensions>false</addExtensions>
                <classpathLayoutType>simple</classpathLayoutType>
              </manifest>
              <manifestEntries>
                <Source-Revision>${project.svn.revision}</Source-Revision>
              </manifestEntries>
            </archive>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-assembly-plugin</artifactId>
          <version>2.2.1</version>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-javadoc-plugin</artifactId>
          <version>2.8</version>
          <configuration>
            <docencoding>${project.reporting.outputEncoding}</docencoding>
            <encoding>${project.build.sourceEncoding}</encoding>
            <links>
              <link>http://download.oracle.com/javase/1.5.0/docs/api/</link>
              <link>http://download.oracle.com/javaee/5/api/</link>
            </links>
            <show>projected</show>
            <splitindex>true</splitindex>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-project-info-reports-plugin</artifactId>
          <version>2.4</version>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-checkstyle-plugin</artifactId>
          <version>2.7</version>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-antrun-plugin</artifactId>
          <version>1.7</version>
          <dependencies>
            <dependency>
              <groupId>org.apache.ant</groupId>
              <artifactId>ant</artifactId>
              <version>1.8.2</version>
            </dependency>
          </dependencies>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-release-plugin</artifactId>
          <version>2.2.2</version>
          <configuration>
            <providerImplementations>
              <svn>javasvn</svn>
            </providerImplementations>
          </configuration>
          <dependencies>
            <dependency>
              <groupId>com.google.code.maven-scm-provider-svnjava</groupId>
              <artifactId>maven-scm-provider-svnjava</artifactId>
              <version>1.15</version>
            </dependency>
            <dependency>
              <groupId>org.tmatesoft.svnkit</groupId>
              <artifactId>svnkit</artifactId>
              <version>1.7.0-SNAPSHOT</version>
            </dependency>
          </dependencies>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-scm-plugin</artifactId>
          <version>1.6</version>
          <configuration>
            <providerImplementations>
              <svn>javasvn</svn>
            </providerImplementations>
          </configuration>
          <dependencies>
            <dependency>
              <groupId>com.google.code.maven-scm-provider-svnjava</groupId>
              <artifactId>maven-scm-provider-svnjava</artifactId>
              <version>1.15</version>
            </dependency>
            <dependency>
              <groupId>org.tmatesoft.svnkit</groupId>
              <artifactId>svnkit</artifactId>
              <version>1.7.0-SNAPSHOT</version>
            </dependency>
          </dependencies>
        </plugin>

        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-dependency-plugin</artifactId>
          <version>2.4</version>
        </plugin>

        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-eclipse-plugin</artifactId>
          <version>2.8</version>
          <configuration>
            <!-- the next two item doesn't work on m2e. m2e has its own confgiruation in Eclipse preferences -->
            <downloadSources>true</downloadSources>
            <downloadJavaDocs>true</downloadJavaDocs>
          </configuration>
        </plugin>

        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>properties-maven-plugin</artifactId>
          <version>1.0-alpha-2</version>
        </plugin>
        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>maven-springbeandoc-plugin</artifactId>
          <version>1.0.8-SNAPSHOT</version>
        </plugin>
        <plugin>
          <groupId>com.google.code.maven-svn-revision-number-plugin</groupId>
          <artifactId>maven-svn-revision-number-plugin</artifactId>
          <version>1.7</version>
          <executions>
            <execution>
              <phase>validate</phase>
              <goals>
                <goal>revision</goal>
              </goals>
              <configuration>
                <entries>
                  <entry>
                    <path>${project.basedir}</path>
                    <prefix>project.svn</prefix>
                    <depth>infinity</depth>
                    <reportUnversioned>true</reportUnversioned>
                    <reportIgnored>false</reportIgnored>
                    <reportOutOfDate>false</reportOutOfDate>
                  </entry>
                </entries>
              </configuration>
            </execution>
          </executions>
          <dependencies>
            <dependency>
              <groupId>org.tmatesoft.svnkit</groupId>
              <artifactId>svnkit</artifactId>
              <version>1.7.0-SNAPSHOT</version>
            </dependency>
          </dependencies>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

Dependency on local library not in Maven repository and with no POM file

Sometimes your project may have dependency on a JAR file that is not registered to any of Maven repositories and so have no it's own POM file. In this case, you can use <systemPath> element to specify your module's dependency on it.

<dependencies>
  ...
  <dependency>
    <groupId>unknown</groupId>
    <artifactId>abcd</artifactId>
    <version>1.0</version>
    <type>jar</type>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/abcd.jar</systemPath>
  </dependency>
  ...
</dependencies>

Note that systemPath could be specified only with system scope. You should specify groupId, artifactId, and version 'cause they are mandatory but you can specify any value and don't need pom file.

Escaping expression interpolation

It may necessary not to interpolate Maven expression in resources. In other words, you just want to leave ${some-property} as it is. For this, you can specify the escape string with escapeString parameter of maven-resource-plugin. You can also define maven.resources.escapeString property in your POM file.

For more refer this page : http://maven.apache.org/plugins/maven-resources-plugin/resources-mojo.html#escapeString

Working with Subversion working copy in format of ver. 1.7

The default configuration of Maven release plugin(maven-release-plugin) up to ver. 2.2.2 or Maven scm plugin(maven-scm-plugin) up to ver. 1.6 can't work correctly with Subversion working copy in format of ver. 1.7.
To solve this problem, you should override the configuration of release plugin or scm plugin to use maven-scm-provider-svnjava and svnkit 1.7.

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-release-plugin</artifactId>
   <version>2.2.2</version>
   <configuration>
      <providerImplementations>
         <svn>javasvn</svn>
      </providerImplementations>
   </configuration>
   <dependencies>
      <dependency>
         <groupId>com.google.code.maven-scm-provider-svnjava</groupId>
         <artifactId>maven-scm-provider-svnjava</artifactId>
         <version>1.15</version>
      </dependency>
      <dependency>
         <groupId>org.tmatesoft.svnkit</groupId>
         <artifactId>svnkit</artifactId>
         <version>1.7.0-SNAPSHOT</version>
      </dependency>                
   </dependencies>
</plugin>
<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-scm-plugin</artifactId>
   <version>1.6</version>
   <configuration>
      <providerImplementations>
         <svn>javasvn</svn>
      </providerImplementations>
   </configuration>
   <dependencies>
      <dependency>
         <groupId>com.google.code.maven-scm-provider-svnjava</groupId>
         <artifactId>maven-scm-provider-svnjava</artifactId>
         <version>1.15</version>
      </dependency>
      <dependency>
         <groupId>org.tmatesoft.svnkit</groupId>
         <artifactId>svnkit</artifactId>
         <version>1.7.0-SNAPSHOT</version>
      </dependency>                
   </dependencies>
</plugin>

For now, svnkit 1.7 has no release and is in snapshot version.

If you let the plugins use svnkit 1.3.x which is default setting as of now, you would meet the exceptions like the following.

Caused by: org.apache.maven.shared.release.scm.ReleaseScmCommandException: Unable to commit files
Provider message:
SVN commit failed.
Command output:
svn: The path ... appears to be part of a Subversion 1.7 or greater working copy.  Please upgrade your Subversion client to use this working copy.
 at org.apache.maven.shared.release.phase.AbstractScmCommitPhase.checkin(AbstractScmCommitPhase.java:168)
 at org.apache.maven.shared.release.phase.AbstractScmCommitPhase.performCheckins(AbstractScmCommitPhase.java:148)
 at org.apache.maven.shared.release.phase.ScmCommitPreparationPhase.runLogic(ScmCommitPreparationPhase.java:75)
 at org.apache.maven.shared.release.phase.AbstractScmCommitPhase.execute(AbstractScmCommitPhase.java:79)
 at org.apache.maven.shared.release.DefaultReleaseManager.rollback(DefaultReleaseManager.java:259)
 at org.apache.maven.shared.release.DefaultReleaseManager.rollback(DefaultReleaseManager.java:238)
 at org.apache.maven.plugins.release.RollbackReleaseMojo.execute(RollbackReleaseMojo.java:56)
 ... 21 more

For more, refer the followings,

Release process

  • overall process
    • prepare-with-pom in dry mode > rollback > prepare > perform


  1. Check whether the free space in file system is enough for the relative servers.
    • server hosting source repository
    • server hosting binary repository
    • server hosting site documentation
  2. Synchronize all project in trunk.
  3. Run release:prepare-with-pom goal in dryRun mode with following options.
    • maven.deploy.skip = false
    • resume = false
    • dryRun = true
    • maven.home = ${env_var:MAVEN_HOME}
  4. Review pom.xml.tag, pom.xml.next, release-pom.xml in each project
    • pom.xml.tag ...
    • pom.xml.next ...
    • release-pom.xml ...
    • fully explicit(with no placeholder) scm information would exist only in pom.xml.tag file of aggregation project and parent project. Url of the scm should end with the name of the project.
  5. Run release:rollback goal with following options.
    • maven.deploy.skip = false
    • resume = false
    • maven.home = ${env_var:MAVEN_HOME}
  6. Check that all pom.xml.tag, pom.xml.next, pom.xml.backup files are deleted.
  7. Run release:prepare goal with following options
    • maven.deploy.skip = false
    • resume = false
    • maven.home = ${env_var:MAVEN_HOME}
  8. Check the new directory for the version and directories for projects under tag directory in source repository.
  9. Run release:perform goal with following options.
    • maven.deploy.skip = false
    • resume = false
    • maven.home = ${env_var:MAVEN_HOME}
  10. Refresh(F5) all projects in Eclipse.
  11. Login on binary repository and check the binaries for projects are uploaded.
  12. Test on the new version

references

Download a specific artifact using mvn command

You can execute dependency plugin even without a pom.xml to download a specific artifact. Note that dependency plugin needs artifact and repoUrl properties specified explicitly.

# mvn org.apache.maven.plugins:maven-dependency-plugin:2.9:get -Dartifact=org.aspectj:aspectjweaver:1.8.1 -DremoteRepositories=central2::::http://repo2.maven.org/maven2/ -Dtransitive=false -Ddest=.

references

Using Maven and Eclipse for Scala/Java mixed project

  • Required tools and plugins
    • Scala IDE
    • m2eclipse-scala
    • scalatest-eclipse-plugin
    • scala-maven-plugin
  • POM
  ...

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.7</java.version>
    <scala.version>2.11</scala.version>
  </properties>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
      </plugin>
      <plugin>
        <groupId>net.alchim31.maven</groupId>
        <artifactId>scala-maven-plugin</artifactId>
        <executions>
          <execution>
            <id>scala-compile</id>
            <phase>process-resources</phase>
            <goals>
              <goal>add-source</goal>
              <goal>compile</goal>
            </goals>
          </execution>
          <execution>
            <id>scala-test-compile</id>
            <phase>process-test-resources</phase>
            <goals>
              <goal>testCompile</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.5.1</version>
          <configuration>
            <source>${java.version}</source>
            <target>${java.version}</target>
          </configuration>
        </plugin>
        <plugin>
          <groupId>net.alchim31.maven</groupId>
          <artifactId>scala-maven-plugin</artifactId>
          <version>3.2.2</version>
          <configuration>
            <source>${java.version}</source>
            <target>${java.version}</target>
            <scalaVersion>${scala.version}</scalaVersion>
            <sourceDir>${project.build.sourceDirectory}/../scala</sourceDir>
            <testSourceDir>${project.build.testSourceDirectory}/../scala</testSourceDir>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.eclipse.m2e</groupId>
          <artifactId>lifecycle-mapping</artifactId>
          <version>1.0.0</version>
          <configuration>
            <lifecycleMappingMetadata>
              <pluginExecutions>
                <pluginExecution>
                  <pluginExecutionFilter>
                    <groupId>net.alchim31.maven</groupId>
                    <artifactId>scala-maven-plugin</artifactId>
                    <versionRange>[1.0.0,)</versionRange>
                    <goals>
                      <goal>add-source</goal>
                      <goal>compile</goal>
                      <goal>testCompile</goal>
                    </goals>
                  </pluginExecutionFilter>
                  <action>
                    <execute>
                      <runOnConfiguration>true</runOnConfiguration>
                      <runOnIncremental>true</runOnIncremental>
                    </execute>
                  </action>
                </pluginExecution>
              </pluginExecutions>
            </lifecycleMappingMetadata>
          </configuration>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>

  <dependencies>
    <dependency>
      <groupId>org.scalactic</groupId>
      <artifactId>scalactic_${scala.version}</artifactId>
      <version>2.2.6</version>
    </dependency>
    <dependency>
      <groupId>org.scalatest</groupId>
      <artifactId>scalatest_${scala.version}</artifactId>
      <version>2.2.6</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  ...

Simple tips and troubleshooting

  • The value of Maven property "project.build.directory" in normal case is ${basedir}/target. You can confirm this using the following command line : "mvn help:evaluate -Dexpression=project.build.directory".
  • Solving "[ERROR Unable to determine if resource ... exists in .." error.]
    Or just add <dependency.locations.enabled>false</dependency.locations.enabled> into the <properties> element of POM file.
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-jar-plugin:2.3.2:jar (default-jar) on project ...: Error assembling JAR
  at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:217)
  at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
  at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
  ...
Caused by: org.apache.maven.plugin.MojoExecutionException: Error assembling JAR
  at org.apache.maven.plugin.jar.AbstractJarMojo.createArchive(AbstractJarMojo.java:223)
  ...
Caused by: org.codehaus.plexus.archiver.ArchiverException: Problem creating jar: ... (Access is denied)
  at org.codehaus.plexus.archiver.AbstractArchiver.createArchive(AbstractArchiver.java:892)
 ...
Caused by: java.io.FileNotFoundException: ... (Access is denied)
  at java.io.RandomAccessFile.open(Native Method)
  at java.io.RandomAccessFile.<init>(RandomAccessFile.java:216)
  at org.codehaus.plexus.archiver.zip.ZipFile.<init>(ZipFile.java:150)