[ 
https://issues.apache.org/jira/browse/FELIX-4512?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13994567#comment-13994567
 ] 

Simone Tripodi edited comment on FELIX-4512 at 5/11/14 7:00 PM:
----------------------------------------------------------------

The proposal contained in {{FELIX-4512.patch}} provides an implementation of 
{{org.apache.felix:maven-bundle-plugin:2.4.1-SNAPSHOT:baseline}} MOJO that has 
the following configuration parameters:

||Name||Type||Since||Description||
|failOnError|boolean|2.4.1|Whether to fail on errors. Default value is: true. 
User property is: failOnError.|
|failOnWarning|boolean|2.4.1|Whether to fail on warnings. Default value is: 
false. User property is: failOnWarning.|
|filters|String[]|2.4.1|A list of packages filter, if empty the whole bundle 
will be traversed. Values are specified in OSGi package instructions notation, 
e.g. {{!org.apache.felix.bundleplugin.}}|
|logResults|boolean|2.4.1|Whether to log the results to the console or not, 
true by default. Default value is: true. User property is: logResults.|
|skip|boolean|2.4.1|Flag to easily skip execution.Default value is: false.User 
property is: baseline.skip.|
|textOutputFile|File|2.4.1|A text output file to render to 
project.build.directory/baseline.txt.|
|xmlOutputFile|File|2.4.1|An XML output file to render to 
project.build.directory/baseline.xml.|

It is invoked during {{validate}} phase in order to make sure the current 
bundle is produced and contains valid OSGi metadata.

Plugging it in existing projects is quiet easy, i.e.:

{code}
<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/maven-v4_0_0.xsd";>
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.apache.felix</groupId>
        <artifactId>org.apache.felix.http.parent</artifactId>
        <version>3-SNAPSHOT</version>
        <relativePath>../parent/pom.xml</relativePath>
    </parent>

    <name>Apache Felix Http Api</name>
    <artifactId>org.apache.felix.http.api</artifactId>
    <version>2.3.0-SNAPSHOT</version>
  
    ...

     <build>
        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <version>2.4.1-SNAPSHOT</version>
                <executions>
                    <execution>
                        <id>bundle</id>
                        <goals>
                            <goal>bundle</goal>
                        </goals>
                        <configuration>
                          <instructions>
                              <Export-Package>
                                  org.osgi.dto;version=${osgi.dto.version},
                                  
org.osgi.service.http;version=${http.service.version},
                                  
org.osgi.service.http.runtime;version=${http.service.version},
                                  
org.apache.felix.http.api;version=${http.api.version}
                              </Export-Package>
                              <Import-Package>
                                  org.osgi.dto,
                                  org.osgi.service.http,
                                  org.osgi.service.http.runtime,
                                  javax.servlet.*;version="[2.3,4)",
                                  *
                              </Import-Package>
                          </instructions>
                      </configuration>
                    </execution>
                    <execution>
                        <id>baseline</id>
                        <goals>
                            <goal>baseline</goal>
                        </goals>
                        <configuration>
                            <comparisonVersion>2.2.2</comparisonVersion>
                            <failOnWarning>true</failOnWarning>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            ...
    </build>
    ...
</project>
{code}

it produces two output files by default, a txt one:

{noformat}
# Baseline Report - Generated by Apache Felix Maven Bundle Plugin at Sun May 11 
16:06:20 CEST 2014
Analising current bundle org.apache.felix.http.api-2.3.0-SNAPSHOT against 
previous released org.apache.felix.http.api-2.2.2
attrs for org.apache.felix.http.api 
version="2.0.4";uses:="javax.servlet,org.osgi.service.http,org.osgi.service.http.runtime"
attrs for org.osgi.dto version="1.0.0"
attrs for org.osgi.service.http 
version="1.3.0";uses:="javax.servlet,javax.servlet.http"
attrs for org.osgi.service.http.runtime version="1.3.0"
  PACKAGE_NAME                                       DELTA      CUR_VER    
BASE_VER   REC_VER    WARNINGS  
= ================================================== ========== ========== 
========== ========== ==========
* org.apache.felix.http.api                          MAJOR      2.0.4      
2.0.4      3.0.0      Version increase required
        >   interface  org.apache.felix.http.api.ExtHttpService
                +   method     createDefaultHttpContext()
                        +   access     abstract
                        +   return     org.osgi.service.http.HttpContext
                +   method     doSomething()
                        +   access     abstract
                +   method     
registerResources(java.lang.String,java.lang.String,org.osgi.service.http.HttpContext)
                        +   access     abstract
                +   method     
registerServlet(java.lang.String,javax.servlet.Servlet,java.util.Dictionary,org.osgi.service.http.HttpContext)
                        +   access     abstract
                +   method     unregister(java.lang.String)
                        +   access     abstract
        +   interface  org.apache.felix.http.api.ExtHttpServiceRuntime
                +   access     abstract
                +   implements org.osgi.service.http.runtime.HttpServiceRuntime
                +   method     getRuntimeDTO()
                        +   access     abstract
                        +   return     org.osgi.dto.DTO
                        +   return     
org.osgi.service.http.runtime.dto.RuntimeDTO
                +   method     
registerFilter(org.osgi.service.http.runtime.dto.FilterDTO)
                        +   access     abstract
                +   method     
registerServlet(org.osgi.service.http.runtime.dto.ServletDTO)
                        +   access     abstract
-----------------------------------------------------------------------------------------------------------
  org.osgi.dto                                       ADDED      1.0.0      
0.0.0      1.0.0      -         
        +   class      org.osgi.dto.DTO
                +   access     abstract
                +   method     <init>()
                +   method     clone()
                        +   access     protected
                +   method     equals(java.lang.Object)
                        +   return     boolean
                +   method     finalize()
                        +   access     protected
                +   method     hashCode()
                        +   return     int
                +   method     toString()
                        +   return     java.io.Serializable
                        +   return     java.lang.CharSequence
                        +   return     java.lang.Comparable
                        +   return     java.lang.String
        +   version    1.0.0
-----------------------------------------------------------------------------------------------------------
  org.osgi.service.http                              ADDED      1.3.0      
0.0.0      1.0.0      Excessive version increase
        +   class      org.osgi.service.http.NamespaceException
                +   extends    java.lang.Exception
                +   extends    java.lang.Throwable
                +   implements java.io.Serializable
                +   method     <init>(java.lang.String)
                +   method     <init>(java.lang.String,java.lang.Throwable)
                +   method     clone()
                        +   access     protected
                +   method     equals(java.lang.Object)
                        +   return     boolean
                +   method     fillInStackTrace()
                        +   return     java.io.Serializable
                        +   return     java.lang.Throwable
                +   method     finalize()
                        +   access     protected
                +   method     getCause()
                        +   return     java.io.Serializable
                        +   return     java.lang.Throwable
                +   method     getException()
                        +   return     java.io.Serializable
                        +   return     java.lang.Throwable
                +   method     getLocalizedMessage()
                        +   return     java.io.Serializable
                        +   return     java.lang.CharSequence
                        +   return     java.lang.Comparable
                        +   return     java.lang.String
                +   method     getMessage()
                        +   return     java.io.Serializable
                        +   return     java.lang.CharSequence
                        +   return     java.lang.Comparable
                        +   return     java.lang.String
                +   method     getStackTrace()
                        +   return     java.io.Serializable
                        +   return     java.lang.StackTraceElement[]
                +   method     hashCode()
                        +   return     int
                +   method     initCause(java.lang.Throwable)
                        +   return     java.io.Serializable
                        +   return     java.lang.Throwable
                +   method     printStackTrace()
                +   method     printStackTrace(java.io.PrintStream)
                +   method     printStackTrace(java.io.PrintWriter)
                +   method     setStackTrace(java.lang.StackTraceElement[])
                +   method     toString()
                        +   return     java.io.Serializable
                        +   return     java.lang.CharSequence
                        +   return     java.lang.Comparable
                        +   return     java.lang.String
        +   interface  org.osgi.service.http.HttpContext
                +   access     abstract
                +   field      java.lang.String AUTHENTICATION_TYPE
                        +   access     final
                        +   access     static
                        +   constant   org.osgi.service.http.authentication.type
                +   field      java.lang.String AUTHORIZATION
                        +   access     final
                        +   access     static
                        +   constant   org.osgi.service.useradmin.authorization
                +   field      java.lang.String REMOTE_USER
                        +   access     final
                        +   access     static
                        +   constant   
org.osgi.service.http.authentication.remote.user
                +   method     getMimeType(java.lang.String)
                        +   access     abstract
                        +   return     java.io.Serializable
                        +   return     java.lang.CharSequence
                        +   return     java.lang.Comparable
                        +   return     java.lang.String
                +   method     getResource(java.lang.String)
                        +   access     abstract
                        +   return     java.io.Serializable
                        +   return     java.net.URL
                +   method     
handleSecurity(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
                        +   access     abstract
                        +   return     boolean
                +   annotated  org.osgi.annotation.versioning.ConsumerType
        +   interface  org.osgi.service.http.HttpService
                +   access     abstract
                +   method     createDefaultHttpContext()
                        +   access     abstract
                        +   return     org.osgi.service.http.HttpContext
                +   method     
registerResources(java.lang.String,java.lang.String,org.osgi.service.http.HttpContext)
                        +   access     abstract
                +   method     
registerServlet(java.lang.String,javax.servlet.Servlet,java.util.Dictionary,org.osgi.service.http.HttpContext)
                        +   access     abstract
                +   method     unregister(java.lang.String)
                        +   access     abstract
                +   annotated  org.osgi.annotation.versioning.ProviderType
        +   version    1.3.0
-----------------------------------------------------------------------------------------------------------
  org.osgi.service.http.runtime                      ADDED      1.3.0      
0.0.0      1.0.0      Excessive version increase
        +   class      org.osgi.service.http.runtime.HttpServiceRuntimeConstants
                +   access     final
                +   field      java.lang.String HTTP_SERVICE_ENDPOINT_ATTRIBUTE
                        +   access     final
                        +   access     static
                        +   constant   osgi.http.endpoint
                +   method     clone()
                        +   access     protected
                +   method     equals(java.lang.Object)
                        +   return     boolean
                +   method     finalize()
                        +   access     protected
                +   method     hashCode()
                        +   return     int
                +   method     toString()
                        +   return     java.io.Serializable
                        +   return     java.lang.CharSequence
                        +   return     java.lang.Comparable
                        +   return     java.lang.String
        +   interface  org.osgi.service.http.runtime.HttpServiceRuntime
                +   access     abstract
                +   method     getRuntimeDTO()
                        +   access     abstract
                        +   return     org.osgi.dto.DTO
                        +   return     
org.osgi.service.http.runtime.dto.RuntimeDTO
                +   annotated  org.osgi.annotation.versioning.ProviderType
        +   version    1.3.0
-----------------------------------------------------------------------------------------------------------
Baseline analisys complete, 0 errors, 0 warnings
{noformat}

and an XML one that can be used to generate the html report page:

{code}
<baseline generatedBy="Apache Felix Maven Bundle Plugin" generatedAt="Sun May 
11 16:06:20 CEST 2014">
  <package>
    <name>org.apache.felix.http.api</name>
    <mismatch>*</mismatch>
    <packageDiff>MAJOR</packageDiff>
    <newerVersion>2.0.4</newerVersion>
    <olderVersion>2.0.4</olderVersion>
    <suggestedVersion>3.0.0</suggestedVersion>
    <warnings>Version increase required</warnings>
    
<attributes>version=&quot;2.0.4&quot;;uses:=&quot;javax.servlet,org.osgi.service.http,org.osgi.service.http.runtime&quot;</attributes>
    <interface name="org.apache.felix.http.api.ExtHttpService" delta="major">
      <method name="createDefaultHttpContext()" delta="added">
        <access name="abstract" delta="added"/>
        <return name="org.osgi.service.http.HttpContext" delta="added"/>
      </method>
      <method name="doSomething()" delta="added">
        <access name="abstract" delta="added"/>
      </method>
      <method 
name="registerResources(java.lang.String,java.lang.String,org.osgi.service.http.HttpContext)"
 delta="added">
        <access name="abstract" delta="added"/>
      </method>
      <method 
name="registerServlet(java.lang.String,javax.servlet.Servlet,java.util.Dictionary,org.osgi.service.http.HttpContext)"
 delta="added">
        <access name="abstract" delta="added"/>
      </method>
      <method name="unregister(java.lang.String)" delta="added">
        <access name="abstract" delta="added"/>
      </method>
    </interface>
    <interface name="org.apache.felix.http.api.ExtHttpServiceRuntime" 
delta="added">
      <access name="abstract" delta="added"/>
      <implements name="org.osgi.service.http.runtime.HttpServiceRuntime" 
delta="added"/>
      <method name="getRuntimeDTO()" delta="added">
        <access name="abstract" delta="added"/>
        <return name="org.osgi.dto.DTO" delta="added"/>
        <return name="org.osgi.service.http.runtime.dto.RuntimeDTO" 
delta="added"/>
      </method>
      <method 
name="registerFilter(org.osgi.service.http.runtime.dto.FilterDTO)" 
delta="added">
        <access name="abstract" delta="added"/>
      </method>
      <method 
name="registerServlet(org.osgi.service.http.runtime.dto.ServletDTO)" 
delta="added">
        <access name="abstract" delta="added"/>
      </method>
    </interface>
  </package>
  <package>
    <name>org.osgi.dto</name>
    <mismatch> </mismatch>
    <packageDiff>ADDED</packageDiff>
    <newerVersion>1.0.0</newerVersion>
    <olderVersion>0.0.0</olderVersion>
    <suggestedVersion>1.0.0</suggestedVersion>
    <warnings>-</warnings>
    <attributes>version=&quot;1.0.0&quot;</attributes>
    <class name="org.osgi.dto.DTO" delta="added">
      <access name="abstract" delta="added"/>
      <method name="&lt;init&gt;()" delta="added"/>
      <method name="clone()" delta="added">
        <access name="protected" delta="added"/>
      </method>
      <method name="equals(java.lang.Object)" delta="added">
        <return name="boolean" delta="added"/>
      </method>
      <method name="finalize()" delta="added">
        <access name="protected" delta="added"/>
      </method>
      <method name="hashCode()" delta="added">
        <return name="int" delta="added"/>
      </method>
      <method name="toString()" delta="added">
        <return name="java.io.Serializable" delta="added"/>
        <return name="java.lang.CharSequence" delta="added"/>
        <return name="java.lang.Comparable" delta="added"/>
        <return name="java.lang.String" delta="added"/>
      </method>
    </class>
    <version name="1.0.0" delta="added"/>
  </package>
  <package>
    <name>org.osgi.service.http</name>
    <mismatch> </mismatch>
    <packageDiff>ADDED</packageDiff>
    <newerVersion>1.3.0</newerVersion>
    <olderVersion>0.0.0</olderVersion>
    <suggestedVersion>1.0.0</suggestedVersion>
    <warnings>Excessive version increase</warnings>
    
<attributes>version=&quot;1.3.0&quot;;uses:=&quot;javax.servlet,javax.servlet.http&quot;</attributes>
    <class name="org.osgi.service.http.NamespaceException" delta="added">
      <extends name="java.lang.Exception" delta="added"/>
      <extends name="java.lang.Throwable" delta="added"/>
      <implements name="java.io.Serializable" delta="added"/>
      <method name="&lt;init&gt;(java.lang.String)" delta="added"/>
      <method name="&lt;init&gt;(java.lang.String,java.lang.Throwable)" 
delta="added"/>
      <method name="clone()" delta="added">
        <access name="protected" delta="added"/>
      </method>
      <method name="equals(java.lang.Object)" delta="added">
        <return name="boolean" delta="added"/>
      </method>
      <method name="fillInStackTrace()" delta="added">
        <return name="java.io.Serializable" delta="added"/>
        <return name="java.lang.Throwable" delta="added"/>
      </method>
      <method name="finalize()" delta="added">
        <access name="protected" delta="added"/>
      </method>
      <method name="getCause()" delta="added">
        <return name="java.io.Serializable" delta="added"/>
        <return name="java.lang.Throwable" delta="added"/>
      </method>
      <method name="getException()" delta="added">
        <return name="java.io.Serializable" delta="added"/>
        <return name="java.lang.Throwable" delta="added"/>
      </method>
      <method name="getLocalizedMessage()" delta="added">
        <return name="java.io.Serializable" delta="added"/>
        <return name="java.lang.CharSequence" delta="added"/>
        <return name="java.lang.Comparable" delta="added"/>
        <return name="java.lang.String" delta="added"/>
      </method>
      <method name="getMessage()" delta="added">
        <return name="java.io.Serializable" delta="added"/>
        <return name="java.lang.CharSequence" delta="added"/>
        <return name="java.lang.Comparable" delta="added"/>
        <return name="java.lang.String" delta="added"/>
      </method>
      <method name="getStackTrace()" delta="added">
        <return name="java.io.Serializable" delta="added"/>
        <return name="java.lang.StackTraceElement[]" delta="added"/>
      </method>
      <method name="hashCode()" delta="added">
        <return name="int" delta="added"/>
      </method>
      <method name="initCause(java.lang.Throwable)" delta="added">
        <return name="java.io.Serializable" delta="added"/>
        <return name="java.lang.Throwable" delta="added"/>
      </method>
      <method name="printStackTrace()" delta="added"/>
      <method name="printStackTrace(java.io.PrintStream)" delta="added"/>
      <method name="printStackTrace(java.io.PrintWriter)" delta="added"/>
      <method name="setStackTrace(java.lang.StackTraceElement[])" 
delta="added"/>
      <method name="toString()" delta="added">
        <return name="java.io.Serializable" delta="added"/>
        <return name="java.lang.CharSequence" delta="added"/>
        <return name="java.lang.Comparable" delta="added"/>
        <return name="java.lang.String" delta="added"/>
      </method>
    </class>
    <interface name="org.osgi.service.http.HttpContext" delta="added">
      <access name="abstract" delta="added"/>
      <field name="java.lang.String AUTHENTICATION_TYPE" delta="added">
        <access name="final" delta="added"/>
        <access name="static" delta="added"/>
        <constant name="org.osgi.service.http.authentication.type" 
delta="added"/>
      </field>
      <field name="java.lang.String AUTHORIZATION" delta="added">
        <access name="final" delta="added"/>
        <access name="static" delta="added"/>
        <constant name="org.osgi.service.useradmin.authorization" 
delta="added"/>
      </field>
      <field name="java.lang.String REMOTE_USER" delta="added">
        <access name="final" delta="added"/>
        <access name="static" delta="added"/>
        <constant name="org.osgi.service.http.authentication.remote.user" 
delta="added"/>
      </field>
      <method name="getMimeType(java.lang.String)" delta="added">
        <access name="abstract" delta="added"/>
        <return name="java.io.Serializable" delta="added"/>
        <return name="java.lang.CharSequence" delta="added"/>
        <return name="java.lang.Comparable" delta="added"/>
        <return name="java.lang.String" delta="added"/>
      </method>
      <method name="getResource(java.lang.String)" delta="added">
        <access name="abstract" delta="added"/>
        <return name="java.io.Serializable" delta="added"/>
        <return name="java.net.URL" delta="added"/>
      </method>
      <method 
name="handleSecurity(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)"
 delta="added">
        <access name="abstract" delta="added"/>
        <return name="boolean" delta="added"/>
      </method>
      <annotated name="org.osgi.annotation.versioning.ConsumerType" 
delta="added"/>
    </interface>
    <interface name="org.osgi.service.http.HttpService" delta="added">
      <access name="abstract" delta="added"/>
      <method name="createDefaultHttpContext()" delta="added">
        <access name="abstract" delta="added"/>
        <return name="org.osgi.service.http.HttpContext" delta="added"/>
      </method>
      <method 
name="registerResources(java.lang.String,java.lang.String,org.osgi.service.http.HttpContext)"
 delta="added">
        <access name="abstract" delta="added"/>
      </method>
      <method 
name="registerServlet(java.lang.String,javax.servlet.Servlet,java.util.Dictionary,org.osgi.service.http.HttpContext)"
 delta="added">
        <access name="abstract" delta="added"/>
      </method>
      <method name="unregister(java.lang.String)" delta="added">
        <access name="abstract" delta="added"/>
      </method>
      <annotated name="org.osgi.annotation.versioning.ProviderType" 
delta="added"/>
    </interface>
    <version name="1.3.0" delta="added"/>
  </package>
  <package>
    <name>org.osgi.service.http.runtime</name>
    <mismatch> </mismatch>
    <packageDiff>ADDED</packageDiff>
    <newerVersion>1.3.0</newerVersion>
    <olderVersion>0.0.0</olderVersion>
    <suggestedVersion>1.0.0</suggestedVersion>
    <warnings>Excessive version increase</warnings>
    <attributes>version=&quot;1.3.0&quot;</attributes>
    <class name="org.osgi.service.http.runtime.HttpServiceRuntimeConstants" 
delta="added">
      <access name="final" delta="added"/>
      <field name="java.lang.String HTTP_SERVICE_ENDPOINT_ATTRIBUTE" 
delta="added">
        <access name="final" delta="added"/>
        <access name="static" delta="added"/>
        <constant name="osgi.http.endpoint" delta="added"/>
      </field>
      <method name="clone()" delta="added">
        <access name="protected" delta="added"/>
      </method>
      <method name="equals(java.lang.Object)" delta="added">
        <return name="boolean" delta="added"/>
      </method>
      <method name="finalize()" delta="added">
        <access name="protected" delta="added"/>
      </method>
      <method name="hashCode()" delta="added">
        <return name="int" delta="added"/>
      </method>
      <method name="toString()" delta="added">
        <return name="java.io.Serializable" delta="added"/>
        <return name="java.lang.CharSequence" delta="added"/>
        <return name="java.lang.Comparable" delta="added"/>
        <return name="java.lang.String" delta="added"/>
      </method>
    </class>
    <interface name="org.osgi.service.http.runtime.HttpServiceRuntime" 
delta="added">
      <access name="abstract" delta="added"/>
      <method name="getRuntimeDTO()" delta="added">
        <access name="abstract" delta="added"/>
        <return name="org.osgi.dto.DTO" delta="added"/>
        <return name="org.osgi.service.http.runtime.dto.RuntimeDTO" 
delta="added"/>
      </method>
      <annotated name="org.osgi.annotation.versioning.ProviderType" 
delta="added"/>
    </interface>
    <version name="1.3.0" delta="added"/>
  </package>
{code}


was (Author: simone.tripodi):
The proposal contained in {{FELIX-4512.patch}} provides an implementation of 
{{org.apache.felix:maven-bundle-plugin:2.4.1-SNAPSHOT:baseline}} MOJO that has 
the following configuration parameters:

||Name||Type||Since||Description||
|failOnError|boolean|2.4.1|Whether to fail on errors. Default value is: true. 
User property is: failOnError.|
|failOnWarning|boolean|2.4.1|Whether to fail on warnings. Default value is: 
false. User property is: failOnWarning.|
|filters|String[]|2.4.1|A list of packages filter, if empty the whole bundle 
will be traversed. Values are specified in OSGi package instructions notation, 
e.g. {{!org.apache.felix.bundleplugin.}}|
|logResults|boolean|2.4.1|Whether to log the results to the console or not, 
true by default. Default value is: true. User property is: logResults.|
|skip|boolean|2.4.1|Flag to easily skip execution.Default value is: false.User 
property is: baseline.skip.|
|textOutputFile|File|2.4.1|A text output file to render to 
${project.build.directory}/baseline.txt.|
|xmlOutputFile|File|2.4.1|An XML output file to render to 
${project.build.directory}/baseline.xml.|

It is invoked during {{validate}} phase in order to make sure the current 
bundle is produced and contains valid OSGi metadata.

Plugging it in existing projects is quiet easy, i.e.:

{code}
<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/maven-v4_0_0.xsd";>
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.apache.felix</groupId>
        <artifactId>org.apache.felix.http.parent</artifactId>
        <version>3-SNAPSHOT</version>
        <relativePath>../parent/pom.xml</relativePath>
    </parent>

    <name>Apache Felix Http Api</name>
    <artifactId>org.apache.felix.http.api</artifactId>
    <version>2.3.0-SNAPSHOT</version>
  
    ...

     <build>
        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <version>2.4.1-SNAPSHOT</version>
                <executions>
                    <execution>
                        <id>bundle</id>
                        <goals>
                            <goal>bundle</goal>
                        </goals>
                        <configuration>
                          <instructions>
                              <Export-Package>
                                  org.osgi.dto;version=${osgi.dto.version},
                                  
org.osgi.service.http;version=${http.service.version},
                                  
org.osgi.service.http.runtime;version=${http.service.version},
                                  
org.apache.felix.http.api;version=${http.api.version}
                              </Export-Package>
                              <Import-Package>
                                  org.osgi.dto,
                                  org.osgi.service.http,
                                  org.osgi.service.http.runtime,
                                  javax.servlet.*;version="[2.3,4)",
                                  *
                              </Import-Package>
                          </instructions>
                      </configuration>
                    </execution>
                    <execution>
                        <id>baseline</id>
                        <goals>
                            <goal>baseline</goal>
                        </goals>
                        <configuration>
                            <comparisonVersion>2.2.2</comparisonVersion>
                            <failOnWarning>true</failOnWarning>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            ...
    </build>
    ...
</project>
{code}

it produces two output files by default, a txt one:

{noformat}
# Baseline Report - Generated by Apache Felix Maven Bundle Plugin at Sun May 11 
16:06:20 CEST 2014
Analising current bundle org.apache.felix.http.api-2.3.0-SNAPSHOT against 
previous released org.apache.felix.http.api-2.2.2
attrs for org.apache.felix.http.api 
version="2.0.4";uses:="javax.servlet,org.osgi.service.http,org.osgi.service.http.runtime"
attrs for org.osgi.dto version="1.0.0"
attrs for org.osgi.service.http 
version="1.3.0";uses:="javax.servlet,javax.servlet.http"
attrs for org.osgi.service.http.runtime version="1.3.0"
  PACKAGE_NAME                                       DELTA      CUR_VER    
BASE_VER   REC_VER    WARNINGS  
= ================================================== ========== ========== 
========== ========== ==========
* org.apache.felix.http.api                          MAJOR      2.0.4      
2.0.4      3.0.0      Version increase required
        >   interface  org.apache.felix.http.api.ExtHttpService
                +   method     createDefaultHttpContext()
                        +   access     abstract
                        +   return     org.osgi.service.http.HttpContext
                +   method     doSomething()
                        +   access     abstract
                +   method     
registerResources(java.lang.String,java.lang.String,org.osgi.service.http.HttpContext)
                        +   access     abstract
                +   method     
registerServlet(java.lang.String,javax.servlet.Servlet,java.util.Dictionary,org.osgi.service.http.HttpContext)
                        +   access     abstract
                +   method     unregister(java.lang.String)
                        +   access     abstract
        +   interface  org.apache.felix.http.api.ExtHttpServiceRuntime
                +   access     abstract
                +   implements org.osgi.service.http.runtime.HttpServiceRuntime
                +   method     getRuntimeDTO()
                        +   access     abstract
                        +   return     org.osgi.dto.DTO
                        +   return     
org.osgi.service.http.runtime.dto.RuntimeDTO
                +   method     
registerFilter(org.osgi.service.http.runtime.dto.FilterDTO)
                        +   access     abstract
                +   method     
registerServlet(org.osgi.service.http.runtime.dto.ServletDTO)
                        +   access     abstract
-----------------------------------------------------------------------------------------------------------
  org.osgi.dto                                       ADDED      1.0.0      
0.0.0      1.0.0      -         
        +   class      org.osgi.dto.DTO
                +   access     abstract
                +   method     <init>()
                +   method     clone()
                        +   access     protected
                +   method     equals(java.lang.Object)
                        +   return     boolean
                +   method     finalize()
                        +   access     protected
                +   method     hashCode()
                        +   return     int
                +   method     toString()
                        +   return     java.io.Serializable
                        +   return     java.lang.CharSequence
                        +   return     java.lang.Comparable
                        +   return     java.lang.String
        +   version    1.0.0
-----------------------------------------------------------------------------------------------------------
  org.osgi.service.http                              ADDED      1.3.0      
0.0.0      1.0.0      Excessive version increase
        +   class      org.osgi.service.http.NamespaceException
                +   extends    java.lang.Exception
                +   extends    java.lang.Throwable
                +   implements java.io.Serializable
                +   method     <init>(java.lang.String)
                +   method     <init>(java.lang.String,java.lang.Throwable)
                +   method     clone()
                        +   access     protected
                +   method     equals(java.lang.Object)
                        +   return     boolean
                +   method     fillInStackTrace()
                        +   return     java.io.Serializable
                        +   return     java.lang.Throwable
                +   method     finalize()
                        +   access     protected
                +   method     getCause()
                        +   return     java.io.Serializable
                        +   return     java.lang.Throwable
                +   method     getException()
                        +   return     java.io.Serializable
                        +   return     java.lang.Throwable
                +   method     getLocalizedMessage()
                        +   return     java.io.Serializable
                        +   return     java.lang.CharSequence
                        +   return     java.lang.Comparable
                        +   return     java.lang.String
                +   method     getMessage()
                        +   return     java.io.Serializable
                        +   return     java.lang.CharSequence
                        +   return     java.lang.Comparable
                        +   return     java.lang.String
                +   method     getStackTrace()
                        +   return     java.io.Serializable
                        +   return     java.lang.StackTraceElement[]
                +   method     hashCode()
                        +   return     int
                +   method     initCause(java.lang.Throwable)
                        +   return     java.io.Serializable
                        +   return     java.lang.Throwable
                +   method     printStackTrace()
                +   method     printStackTrace(java.io.PrintStream)
                +   method     printStackTrace(java.io.PrintWriter)
                +   method     setStackTrace(java.lang.StackTraceElement[])
                +   method     toString()
                        +   return     java.io.Serializable
                        +   return     java.lang.CharSequence
                        +   return     java.lang.Comparable
                        +   return     java.lang.String
        +   interface  org.osgi.service.http.HttpContext
                +   access     abstract
                +   field      java.lang.String AUTHENTICATION_TYPE
                        +   access     final
                        +   access     static
                        +   constant   org.osgi.service.http.authentication.type
                +   field      java.lang.String AUTHORIZATION
                        +   access     final
                        +   access     static
                        +   constant   org.osgi.service.useradmin.authorization
                +   field      java.lang.String REMOTE_USER
                        +   access     final
                        +   access     static
                        +   constant   
org.osgi.service.http.authentication.remote.user
                +   method     getMimeType(java.lang.String)
                        +   access     abstract
                        +   return     java.io.Serializable
                        +   return     java.lang.CharSequence
                        +   return     java.lang.Comparable
                        +   return     java.lang.String
                +   method     getResource(java.lang.String)
                        +   access     abstract
                        +   return     java.io.Serializable
                        +   return     java.net.URL
                +   method     
handleSecurity(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
                        +   access     abstract
                        +   return     boolean
                +   annotated  org.osgi.annotation.versioning.ConsumerType
        +   interface  org.osgi.service.http.HttpService
                +   access     abstract
                +   method     createDefaultHttpContext()
                        +   access     abstract
                        +   return     org.osgi.service.http.HttpContext
                +   method     
registerResources(java.lang.String,java.lang.String,org.osgi.service.http.HttpContext)
                        +   access     abstract
                +   method     
registerServlet(java.lang.String,javax.servlet.Servlet,java.util.Dictionary,org.osgi.service.http.HttpContext)
                        +   access     abstract
                +   method     unregister(java.lang.String)
                        +   access     abstract
                +   annotated  org.osgi.annotation.versioning.ProviderType
        +   version    1.3.0
-----------------------------------------------------------------------------------------------------------
  org.osgi.service.http.runtime                      ADDED      1.3.0      
0.0.0      1.0.0      Excessive version increase
        +   class      org.osgi.service.http.runtime.HttpServiceRuntimeConstants
                +   access     final
                +   field      java.lang.String HTTP_SERVICE_ENDPOINT_ATTRIBUTE
                        +   access     final
                        +   access     static
                        +   constant   osgi.http.endpoint
                +   method     clone()
                        +   access     protected
                +   method     equals(java.lang.Object)
                        +   return     boolean
                +   method     finalize()
                        +   access     protected
                +   method     hashCode()
                        +   return     int
                +   method     toString()
                        +   return     java.io.Serializable
                        +   return     java.lang.CharSequence
                        +   return     java.lang.Comparable
                        +   return     java.lang.String
        +   interface  org.osgi.service.http.runtime.HttpServiceRuntime
                +   access     abstract
                +   method     getRuntimeDTO()
                        +   access     abstract
                        +   return     org.osgi.dto.DTO
                        +   return     
org.osgi.service.http.runtime.dto.RuntimeDTO
                +   annotated  org.osgi.annotation.versioning.ProviderType
        +   version    1.3.0
-----------------------------------------------------------------------------------------------------------
Baseline analisys complete, 0 errors, 0 warnings
{noformat}

and an XML one that can be used to generate the html report page:

{code}
<baseline generatedBy="Apache Felix Maven Bundle Plugin" generatedAt="Sun May 
11 16:06:20 CEST 2014">
  <package>
    <name>org.apache.felix.http.api</name>
    <mismatch>*</mismatch>
    <packageDiff>MAJOR</packageDiff>
    <newerVersion>2.0.4</newerVersion>
    <olderVersion>2.0.4</olderVersion>
    <suggestedVersion>3.0.0</suggestedVersion>
    <warnings>Version increase required</warnings>
    
<attributes>version=&quot;2.0.4&quot;;uses:=&quot;javax.servlet,org.osgi.service.http,org.osgi.service.http.runtime&quot;</attributes>
    <interface name="org.apache.felix.http.api.ExtHttpService" delta="major">
      <method name="createDefaultHttpContext()" delta="added">
        <access name="abstract" delta="added"/>
        <return name="org.osgi.service.http.HttpContext" delta="added"/>
      </method>
      <method name="doSomething()" delta="added">
        <access name="abstract" delta="added"/>
      </method>
      <method 
name="registerResources(java.lang.String,java.lang.String,org.osgi.service.http.HttpContext)"
 delta="added">
        <access name="abstract" delta="added"/>
      </method>
      <method 
name="registerServlet(java.lang.String,javax.servlet.Servlet,java.util.Dictionary,org.osgi.service.http.HttpContext)"
 delta="added">
        <access name="abstract" delta="added"/>
      </method>
      <method name="unregister(java.lang.String)" delta="added">
        <access name="abstract" delta="added"/>
      </method>
    </interface>
    <interface name="org.apache.felix.http.api.ExtHttpServiceRuntime" 
delta="added">
      <access name="abstract" delta="added"/>
      <implements name="org.osgi.service.http.runtime.HttpServiceRuntime" 
delta="added"/>
      <method name="getRuntimeDTO()" delta="added">
        <access name="abstract" delta="added"/>
        <return name="org.osgi.dto.DTO" delta="added"/>
        <return name="org.osgi.service.http.runtime.dto.RuntimeDTO" 
delta="added"/>
      </method>
      <method 
name="registerFilter(org.osgi.service.http.runtime.dto.FilterDTO)" 
delta="added">
        <access name="abstract" delta="added"/>
      </method>
      <method 
name="registerServlet(org.osgi.service.http.runtime.dto.ServletDTO)" 
delta="added">
        <access name="abstract" delta="added"/>
      </method>
    </interface>
  </package>
  <package>
    <name>org.osgi.dto</name>
    <mismatch> </mismatch>
    <packageDiff>ADDED</packageDiff>
    <newerVersion>1.0.0</newerVersion>
    <olderVersion>0.0.0</olderVersion>
    <suggestedVersion>1.0.0</suggestedVersion>
    <warnings>-</warnings>
    <attributes>version=&quot;1.0.0&quot;</attributes>
    <class name="org.osgi.dto.DTO" delta="added">
      <access name="abstract" delta="added"/>
      <method name="&lt;init&gt;()" delta="added"/>
      <method name="clone()" delta="added">
        <access name="protected" delta="added"/>
      </method>
      <method name="equals(java.lang.Object)" delta="added">
        <return name="boolean" delta="added"/>
      </method>
      <method name="finalize()" delta="added">
        <access name="protected" delta="added"/>
      </method>
      <method name="hashCode()" delta="added">
        <return name="int" delta="added"/>
      </method>
      <method name="toString()" delta="added">
        <return name="java.io.Serializable" delta="added"/>
        <return name="java.lang.CharSequence" delta="added"/>
        <return name="java.lang.Comparable" delta="added"/>
        <return name="java.lang.String" delta="added"/>
      </method>
    </class>
    <version name="1.0.0" delta="added"/>
  </package>
  <package>
    <name>org.osgi.service.http</name>
    <mismatch> </mismatch>
    <packageDiff>ADDED</packageDiff>
    <newerVersion>1.3.0</newerVersion>
    <olderVersion>0.0.0</olderVersion>
    <suggestedVersion>1.0.0</suggestedVersion>
    <warnings>Excessive version increase</warnings>
    
<attributes>version=&quot;1.3.0&quot;;uses:=&quot;javax.servlet,javax.servlet.http&quot;</attributes>
    <class name="org.osgi.service.http.NamespaceException" delta="added">
      <extends name="java.lang.Exception" delta="added"/>
      <extends name="java.lang.Throwable" delta="added"/>
      <implements name="java.io.Serializable" delta="added"/>
      <method name="&lt;init&gt;(java.lang.String)" delta="added"/>
      <method name="&lt;init&gt;(java.lang.String,java.lang.Throwable)" 
delta="added"/>
      <method name="clone()" delta="added">
        <access name="protected" delta="added"/>
      </method>
      <method name="equals(java.lang.Object)" delta="added">
        <return name="boolean" delta="added"/>
      </method>
      <method name="fillInStackTrace()" delta="added">
        <return name="java.io.Serializable" delta="added"/>
        <return name="java.lang.Throwable" delta="added"/>
      </method>
      <method name="finalize()" delta="added">
        <access name="protected" delta="added"/>
      </method>
      <method name="getCause()" delta="added">
        <return name="java.io.Serializable" delta="added"/>
        <return name="java.lang.Throwable" delta="added"/>
      </method>
      <method name="getException()" delta="added">
        <return name="java.io.Serializable" delta="added"/>
        <return name="java.lang.Throwable" delta="added"/>
      </method>
      <method name="getLocalizedMessage()" delta="added">
        <return name="java.io.Serializable" delta="added"/>
        <return name="java.lang.CharSequence" delta="added"/>
        <return name="java.lang.Comparable" delta="added"/>
        <return name="java.lang.String" delta="added"/>
      </method>
      <method name="getMessage()" delta="added">
        <return name="java.io.Serializable" delta="added"/>
        <return name="java.lang.CharSequence" delta="added"/>
        <return name="java.lang.Comparable" delta="added"/>
        <return name="java.lang.String" delta="added"/>
      </method>
      <method name="getStackTrace()" delta="added">
        <return name="java.io.Serializable" delta="added"/>
        <return name="java.lang.StackTraceElement[]" delta="added"/>
      </method>
      <method name="hashCode()" delta="added">
        <return name="int" delta="added"/>
      </method>
      <method name="initCause(java.lang.Throwable)" delta="added">
        <return name="java.io.Serializable" delta="added"/>
        <return name="java.lang.Throwable" delta="added"/>
      </method>
      <method name="printStackTrace()" delta="added"/>
      <method name="printStackTrace(java.io.PrintStream)" delta="added"/>
      <method name="printStackTrace(java.io.PrintWriter)" delta="added"/>
      <method name="setStackTrace(java.lang.StackTraceElement[])" 
delta="added"/>
      <method name="toString()" delta="added">
        <return name="java.io.Serializable" delta="added"/>
        <return name="java.lang.CharSequence" delta="added"/>
        <return name="java.lang.Comparable" delta="added"/>
        <return name="java.lang.String" delta="added"/>
      </method>
    </class>
    <interface name="org.osgi.service.http.HttpContext" delta="added">
      <access name="abstract" delta="added"/>
      <field name="java.lang.String AUTHENTICATION_TYPE" delta="added">
        <access name="final" delta="added"/>
        <access name="static" delta="added"/>
        <constant name="org.osgi.service.http.authentication.type" 
delta="added"/>
      </field>
      <field name="java.lang.String AUTHORIZATION" delta="added">
        <access name="final" delta="added"/>
        <access name="static" delta="added"/>
        <constant name="org.osgi.service.useradmin.authorization" 
delta="added"/>
      </field>
      <field name="java.lang.String REMOTE_USER" delta="added">
        <access name="final" delta="added"/>
        <access name="static" delta="added"/>
        <constant name="org.osgi.service.http.authentication.remote.user" 
delta="added"/>
      </field>
      <method name="getMimeType(java.lang.String)" delta="added">
        <access name="abstract" delta="added"/>
        <return name="java.io.Serializable" delta="added"/>
        <return name="java.lang.CharSequence" delta="added"/>
        <return name="java.lang.Comparable" delta="added"/>
        <return name="java.lang.String" delta="added"/>
      </method>
      <method name="getResource(java.lang.String)" delta="added">
        <access name="abstract" delta="added"/>
        <return name="java.io.Serializable" delta="added"/>
        <return name="java.net.URL" delta="added"/>
      </method>
      <method 
name="handleSecurity(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)"
 delta="added">
        <access name="abstract" delta="added"/>
        <return name="boolean" delta="added"/>
      </method>
      <annotated name="org.osgi.annotation.versioning.ConsumerType" 
delta="added"/>
    </interface>
    <interface name="org.osgi.service.http.HttpService" delta="added">
      <access name="abstract" delta="added"/>
      <method name="createDefaultHttpContext()" delta="added">
        <access name="abstract" delta="added"/>
        <return name="org.osgi.service.http.HttpContext" delta="added"/>
      </method>
      <method 
name="registerResources(java.lang.String,java.lang.String,org.osgi.service.http.HttpContext)"
 delta="added">
        <access name="abstract" delta="added"/>
      </method>
      <method 
name="registerServlet(java.lang.String,javax.servlet.Servlet,java.util.Dictionary,org.osgi.service.http.HttpContext)"
 delta="added">
        <access name="abstract" delta="added"/>
      </method>
      <method name="unregister(java.lang.String)" delta="added">
        <access name="abstract" delta="added"/>
      </method>
      <annotated name="org.osgi.annotation.versioning.ProviderType" 
delta="added"/>
    </interface>
    <version name="1.3.0" delta="added"/>
  </package>
  <package>
    <name>org.osgi.service.http.runtime</name>
    <mismatch> </mismatch>
    <packageDiff>ADDED</packageDiff>
    <newerVersion>1.3.0</newerVersion>
    <olderVersion>0.0.0</olderVersion>
    <suggestedVersion>1.0.0</suggestedVersion>
    <warnings>Excessive version increase</warnings>
    <attributes>version=&quot;1.3.0&quot;</attributes>
    <class name="org.osgi.service.http.runtime.HttpServiceRuntimeConstants" 
delta="added">
      <access name="final" delta="added"/>
      <field name="java.lang.String HTTP_SERVICE_ENDPOINT_ATTRIBUTE" 
delta="added">
        <access name="final" delta="added"/>
        <access name="static" delta="added"/>
        <constant name="osgi.http.endpoint" delta="added"/>
      </field>
      <method name="clone()" delta="added">
        <access name="protected" delta="added"/>
      </method>
      <method name="equals(java.lang.Object)" delta="added">
        <return name="boolean" delta="added"/>
      </method>
      <method name="finalize()" delta="added">
        <access name="protected" delta="added"/>
      </method>
      <method name="hashCode()" delta="added">
        <return name="int" delta="added"/>
      </method>
      <method name="toString()" delta="added">
        <return name="java.io.Serializable" delta="added"/>
        <return name="java.lang.CharSequence" delta="added"/>
        <return name="java.lang.Comparable" delta="added"/>
        <return name="java.lang.String" delta="added"/>
      </method>
    </class>
    <interface name="org.osgi.service.http.runtime.HttpServiceRuntime" 
delta="added">
      <access name="abstract" delta="added"/>
      <method name="getRuntimeDTO()" delta="added">
        <access name="abstract" delta="added"/>
        <return name="org.osgi.dto.DTO" delta="added"/>
        <return name="org.osgi.service.http.runtime.dto.RuntimeDTO" 
delta="added"/>
      </method>
      <annotated name="org.osgi.annotation.versioning.ProviderType" 
delta="added"/>
    </interface>
    <version name="1.3.0" delta="added"/>
  </package>
{code}

> Add a new Mojo to invoke the BND Baseline tool
> ----------------------------------------------
>
>                 Key: FELIX-4512
>                 URL: https://issues.apache.org/jira/browse/FELIX-4512
>             Project: Felix
>          Issue Type: New Feature
>          Components: Maven Bundle Plugin
>    Affects Versions: maven-bundle-plugin-2.4.0
>            Reporter: Simone Tripodi
>             Fix For: maven-bundle-plugin-2.4.1
>
>         Attachments: FELIX-4512.patch
>
>
> The BND 2.2.0 library contains an extraordinary tool called 
> [Baseline|http://www.aqute.biz/Bnd/Versioning] (see Baselining paragraph) 
> that compares the public API of a bundle with the public API of another 
> bundle.
> It would be really useful to have this tool in the {{maven-bundle-plugin}} in 
> order to keep track of APIs modifications during development time.



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to