This plugin can let your Swagger annotated project generate Swagger JSON and your customized API documents in build phase.
<project>
...
<build>
<plugins>
<plugin>
<groupId>com.github.kongchen</groupId>
<artifactId>swagger-maven-plugin</artifactId>
<version>2.3</version>
<configuration>
<apiSources>
<apiSource>
<!--Required parameters BEGIN-->
<locations>sample.api</locations>
<apiVersion>1.0</apiVersion>
<basePath>http://example.com</basePath>
<!--Required parameters END-->
<!--Optional parameters BEGIN-->
<!---General parameters BEGIN-->
<apiInfo>
<title>Swagger Maven Plugin Sample</title>
<description>Hellow world!</description>
<termsOfServiceUrl>http://www.github.com/kongchen/swagger-maven-plugin</termsOfServiceUrl>
<contact>kongchen#gmail$com</contact>
<license>Apache 2.0</license>
<licenseUrl>http://www.apache.org/licenses/LICENSE-2.0.html</licenseUrl>
</apiInfo>
<overridingModels>/swagger-overriding-models.json</overridingModels>
<swaggerInternalFilter>com.wordnik.swagger.config.DefaultSpecFilter</swaggerInternalFilter>
<!---General parameters END-->
<!---Document generation parameters BEGIN-->
<outputTemplate>
https://raw.github.com/kongchen/api-doc-template/master/v2.0/strapdown.html.mustache
</outputTemplate>
<mustacheFileRoot>${basedir}/src/main/resources/</mustacheFileRoot>
<outputPath>${basedir}/generated/document.html</outputPath>
<!---Document generation parameters END-->
<!---Swagger JSON parameters BEGIN-->
<swaggerDirectory>generated/swagger-ui</swaggerDirectory>
<swaggerUIDocBasePath>http://www.example.com/restapi/doc</swaggerUIDocBasePath>
<useOutputFlatStructure>false</useOutputFlatStructure>
<!---Swagger JSON parameters END-->
<!--Optional parameters END-->
</apiSource>
</apiSources>
</configuration>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
</plugin>
...
</plugins>
</build>
</project>
One apiSource
can be considered as a set of APIs for one apiVersion
in API's basePath
, here's the parameter list of apiSource
:
name | description |
---|---|
locations |
Java classes containing Swagger's annotation @Api , or Java packages containing those classes can be configured here, using ; as the delimiter. |
apiVersion |
The version of the api source. |
basePath |
The base path of this api source. |
name | description |
---|---|
apiInfo |
Some information of the API document. |
overridingModels |
The name of overridingModels file, see more details in sections below. |
swaggerInternalFilter |
If not null, the value should be full name of class implementing com.wordnik.swagger.core.filter.SpecFilter . This allows you to filter both methods and parameters from generated api. |
The parameters of apiInfo
:
name | description |
---|---|
title |
The title of your API document. |
description |
The brief introduction of your API document. |
termsOfServiceUrl |
The URL of your API's terms of service. |
contact |
should be an email here. |
license |
Your API's license. |
licenseUrl |
The license's URL. |
name | description |
---|---|
outputTemplate |
The path of a mustache template file, see more details in sections below. |
mustacheFileRoot |
The root path of your mustache template file. |
outputPath |
The path of generate-by-template document, not existed parent directories will be created. If you don't want to generate html api just don't set it. |
name | description |
---|---|
swaggerDirectory |
The directory of generated Swagger JSON files. If null, no Swagger JSON will be generated. |
useOutputFlatStructure |
Indicates whether Swagger JSON will be created in subdirs by path defined in @com.wordnik.swagger.annotations.Api#value (false), or the filename will be the path with replaced slashes to underscores (true). Default: true |
swaggerUIDocBasePath |
Generally, the baseUrl in Swagger JSON's service.json is always as same as basePath you specified above. However, you can use this parameter to overwrite it. |
You can specify several apiSources
with different api versions and base paths.
You need to specify a mustache template file in outputTemplate
.
It supports a remote path such as https://raw.github.com/kongchen/api-doc-template/master/v2.0/markdown.mustache but local file is highly recommanded because:
- You can modify the template to match your requirement easily.
- Mustache can use
>localfile
for mustache partials, but you should put the partials inmustacheFileRoot
if any.
E.g: The template https://raw.github.com/kongchen/api-doc-template/master/v2.0/strapdown.html.mustache uses
markdown.mustache
as a partial by this way, to usestrapdown.html.mustache
you should putmarkdown.mustache
in your local path and tell the path to plugin viamustacheFileRoot
.
There's a standalone project for the template files, see more details there and welcome to send pull request.
overridingModels
is the name of overridingModels file.
It will be loaded with Class#getResourceAsStream.
Example file below. Note that you can name every mapping the way you want - it's not used for anything. className and jsonString are used as described here to create OverrideConverter and add it to the ModelConverters.
{
"DateTimeMapping" :
{
"className" : "org.joda.time.DateTime",
"jsonString" : "{\"id\": \"DateTime\",\"properties\": {\"value\": {\"required\": true, \"description\": \"Date in ISO-8601 format\", \"notes\": \"Add any notes you like here\", \"type\": \"string\", \"format\": \"date-time\"}}}"
},
"DateMidnightMapping" :
{
"className" : "org.joda.time.DateMidnight",
"jsonString" : "{\"id\": \"DateTime\",\"properties\": {\"value\": {\"required\": true, \"description\": \"Date in ISO-8601 format\", \"notes\": \"Add any notes you like here\", \"type\": \"string\", \"format\": \"date-time\"}}}"
}
}
This plugin has 2 serials of versions:
- 2.x.x : For [Swagger core version >= 1.3.0] (https://github.com/wordnik/swagger-core/wiki/Changelog#v130-aug-12-2013) swagger-spec 1.2
Latest version
2.3
is available in central repository.2.3.1-SNAPSHOT
is the latest SNAPSHOT version.
- 1.x.x : For Swagger core version 1.2.x swagger-spec 1.1
Latest version
1.1.3-SNAPSHOT
is available in sonatype repository.
To use SNAPSHOT version, you need to add plugin repository in your pom.xml first:
<pluginRepositories>
<pluginRepository>
<id>sonatype-snapshot</id>
<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
Check out this sample project to see how this happens.
If you have package depedency conflict issues, such as jackson, joda-time, or jsr311-api. Run mvn dependency:tree
to check which package introduces the one conflicts with yours and exclude it using <exclusion/>
in pom.xml.
e.g. exclude
javax.ws.rs:jsr311-api:jar:1.1.1:compile
fromswagger-jaxrs_2.10
:
<dependency>
<groupId>com.wordnik</groupId>
<artifactId>swagger-jaxrs_2.10</artifactId>
<version>1.3.2</version>
<exclusions>
<exclusion>
<groupId>javax.ws.rs</groupId>
<artifactId>jsr311-api</artifactId>
</exclusion>
</exclusions>
</dependency>