Maven License Plugin

RECU-0012 (Recurso Ficha)

Descripción

Cuando construimos aplicaciones, lo normal es que éstas estén bajo alguna licencia y lo habitual es poner en la cabecera de todos nuestros ficheros fuentes (.java, .xml, .jsp, .properties, ...), un texto indicando la propiedad y la licencia que "protege" ese código fuente.

Esto no es tarea fácil teniendo en cuenta que este texto debe ser un comentario y cada fichero fuente tiene su propio tipo de comentario y, sobre todo, teniendo en cuenta no el hecho de añadir el mensaje sino su mantenimiento, comprobación y actualización.

Existe en el Catálogo de Software de la Junta de Andalucía una aplicación que nos ayuda a añadir estas cabeceras a nuestro código, poniendo el comentario en función de la extensión del fichero y comprobando posibles incompatibilidades con la licencia. Para ver más ir al siguiente enlace.

Además de esta herramienta existen otras como el plugin maven-license-plugin (http://code.google.com/p/maven-license-plugin/). Este plugin de Maven puede comprobar y/o actualizar el texto de la licencia en todos nuestros ficheros fuente y además, podemos configurarlo dentro del ciclo de vida de Maven, normalmente en la fase "Verify", por lo que es perfecto para usarlo en tiempo de desarrollo.

Modo de uso

Configuración

El primer paso es añadir a nuestro pom.xml el repositorio de maven donde podemos encontrar este plugin y la configuración de este.

<build>
    <plugins>
        <plugin> 
        <groupId>com.google.code.maven-license-plugin</groupId> 
        <artifactId>maven-license-plugin</artifactId> 
            <configuration> 
                <header>src/main/conf/eupl.txt</header>
            </configuration> 
        </plugin>
        ...
    </plugins>
</build>

 
<pluginRepositories> 
    ... 
    <pluginRepository> 
        <id>mc-release</id> 
        <name>Local Maven repository of releases</name> 
        <url>http://mc-repo.googlecode.com/svn/maven2/releases</url> 
        <snapshots> 
            <enabled>false</enabled> 
        </snapshots> 
        <releases> 
            <enabled>true</enabled> 
        </releases> 
    </pluginRepository> 
    ... 
</pluginRepositories> 
...

Comprobación

Podemos ver el texto de la cabecera que lo tenemos en el fichero eupl.txt (src/main/conf/eupl.txt), y es el siguiente:

Empresa desarrolladora: XXXXXX

Autor: Junta de Andalucía

Derechos de explotación propiedad de la Junta de Andalucía.

Éste programa es software libre: usted tiene derecho a redistribuirlo y/o modificarlo bajo los términos de la

Licencia EUPL European Public License publicada por el organismo IDABC de la Comisión Europea, en su versión 1.0.
o posteriores.

Este programa se distribuye de buena fe, pero SIN NINGUNA GARANTÍA, incluso sin las presuntas garantías implícitas
de USABILIDAD o ADECUACIÓN A PROPÓSITO CONCRETO. Para más información consulte la EUPL European Public License.

Usted recibe una copia de la EUPL European Public License junto con este programa. Si por algún motivo no le es posible visualizarla, puede consultarla en la siguiente URL: http://ec.europa.eu/idabc/servlets/Docb4f4.pdf?id=31980

You should have received a copy of the EUPL European Public License along with this program. If not, see
http://ec.europa.eu/idabc/servlets/Docbb6d.pdf?id=31979

Vous devez avoir reçu une copie de la EUPL European Public License avec ce programme. Si non, voir
http://ec.europa.eu/idabc/servlets/Doc5a41.pdf?id=31983

Sie erhalten eine Kopie der europäischen EUPL Public License zusammen mit diesem Programm. Wenn nicht, finden Sie da
http://ec.europa.eu/idabc/servlets/Doc9dbe.pdf?id=31977

A continuación podemos saber qué ficheros tienen nuestra cabecera y cuáles no ejecutando "goal check".

mvn license:check

Nos aparecerá un mensaje por cada fichero sin cabecera:

...
[INFO] Missing header in: /home/filipo/pruebaRepositorioEUPL/catalogo_1.2.1/src/main/webapp/includes/repositoriointerno/js/tiny_mce/plugins/template/langs/en_dlg.js
[INFO] Missing header in: /home/filipo/pruebaRepositorioEUPL/catalogo_1.2.1/src/main/webapp/includes/repositoriointerno/js/tiny_mce/plugins/template/css/template.css
...

La primera vez es posible que, además de decirnos las cabeceras que faltan, salgan muchos mensajes "Unknown file extension". Esto se debe a que hay muchas extensiones que no sabe como tratar. Más adelante explicaremos cómo mapear algunos tipos de extensiones a otras o cómo excluir algunos ficheros.

Integración en la fase Verify

Si queremos que esta comprobación se haga en la fase "Verify" añadimos la siguiente configuración:

<plugins>  
    ... 
    <plugin> 
        <groupId>com.google.code.maven-license-plugin</groupId> 
        <artifactId>maven-license-plugin</artifactId> 
        <configuration> 
            <header>src/main/config/eupl.txt</header> 
        </configuration> 
        <executions> 
            <execution> 
                <goals> 
                    <goal>check</goal> 
                </goals> 
            </execution> 
        </executions> 
    </plugin> 
    ...
</plugins>

Para realizar la verificación explícitamente, ejecutaríamos el comando:

mvn verify

Actualizando la cabecera en los ficheros fuente

Para añadir la cabecera a todos nuestros fuentes ejecutamos la siguiente línea:

mvn license:format

Con esto conseguimos:

  • Si el fichero no tiene licencia, se la añade.
  • Si la plantilla de la licencia (la que creamos en el punto 3) ha cambiado, se actualiza el texto de la licencia de cada fichero fuente. Es decir, no se vuelve a añadir la licencia, sino que se modifica el texto actual del fichero fuente.
  • Si se ha modificado el texto de la licencia en algún fichero fuente, se actualiza el fichero fuente, restaurando el texto del fichero fuente para que coincida con la plantilla (la que definimos en el punto 3).

Cómo se excluyen ficheros

En nuestro código fuente encontraremos varios ficheros o rutas donde no queremos que se compruebe si existen las cabeceras de la licencia EUPL. Para esto podemos añadir una lista de exclusiones. Por ejemplo, podemos añadir las siguientes:

<plugin>  
        <groupId>com.google.code.maven-license-plugin</groupId> 
    <artifactId>maven-license-plugin</artifactId> 
    <configuration> 
        <header>src/main/conf/eupl.txt</header>
        <excludes>
            <exclude>**/*README.txt</exclude>
            <exclude>**/*.odt</exclude>
            <exclude>**/*.zip</exclude>
            <exclude>**/site/**</exclude>
                        <exclude>**/.properties</exlude>
                </excludes>
        </configuration>
    </plugin>

Ya existe un número de exclusiones por defecto que podemos ver en http://code.google.com/p/maven-license-plugin/wiki/Configuration. Es recomendable excluir ficheros de configuración como los .properties.

Cómo se asocian ficheros no reconocidos por el plugin

Como ya comentamos antes, la primera vez que probemos el plugin nos saldrán varios mensajes del tipo "Unknown file extension". Esto se debe a que el plugin reconoce una lista de extensiones (ver lista completa en "Supported file extensions" en http://code.google.com/p/maven-license-plugin/), pero no soporta todas las extensiones posibles. Añadir nuevas extensiones es muy sencillo. Por ejemplo, podemos hacer que reconozca la extensión .paq como un sql o la extensión .jsf como un tipo xml:

<plugin>  
    <groupId>com.google.code.maven-license-plugin</groupId> 
    <artifactId>maven-license-plugin</artifactId> 
    <configuration> 
        <header>src/main/conf/eupl.txt</header>
        <mapping>
        <paq>DOUBLEDASHES_STYLE</paq>
        <jsf>XML_STYLE</jsf>
        </mapping>
        </configuration>
    ...
    </plugin>

Resumen

Aquí podemos ver la configuración completa que se usó en este ejemplo:

<build>
    <plugins>
      <plugin> 
    <groupId>com.google.code.maven-license-plugin</groupId> 
    <artifactId>maven-license-plugin</artifactId> 
            <configuration> 
            <header>src/main/conf/eupl.txt</header>
            <mapping>
                <paq>DOUBLEDASHES_STYLE</paq>
                <jsf>XML_STYLE</jsf>
            </mapping>
            <excludes>
                <exclude>**/*README.txt</exclude>
                <exclude>**/*.odt</exclude>
                <exclude>**/*.zip</exclude>
                <exclude>**/*.db</exclude>
                <exclude>**/*.jar</exclude>
                <exclude>**/*.rar</exclude>
                <exclude>**/*.zip</exclude>
                <exclude>**/*.wsdl</exclude>
                <exclude>**/*.wsdd</exclude>   
                <exclude>**/*LEEME</exclude>
                <exclude>**/*.jks</exclude>
                <exclude>**/*.jnlp</exclude>
                <exclude>**/*common-terms.utf8</exclude>
                <exclude>**/*.pdf</exclude>
                <exclude>**/*.tld</exclude>
                <exclude>**/*.jaas</exclude>
                <exclude>**/*.policy</exclude>
                <exclude>**/*.swf</exclude>
                <exclude>**/*.scrt</exclude>
                <exclude>**/*.conf</exclude>
                <exclude>**/*.motd</exclude>
                <exclude>**/*command</exclude>
                <exclude>**/site/**</exclude>
            </excludes>
        </configuration> 
        <executions> 
            <execution> 
                <goals> 
                            <goal>check</goal> 
                        </goals> 
                    </execution> 
            </executions> 
      </plugin>
...
</build>
<pluginRepositories>
    <pluginRepository> 
        <id>mc-release</id> 
        <name>Local Maven repository of releases</name> 
            <url>http://mc-repo.googlecode.com/svn/maven2/releases</url> 
    </pluginRepository>
        <pluginRepository>
            <id>CatalogoInterno</id>
            <url>http://srvrepositorio.junta-andalucia.es/repository/</url>
        </pluginRepository>
</pluginRepositories>

Con este plugin podemos ligar el uso de la licencia EUPL al desarrollo de forma que no se convierta en una tarea pesada a realizar cuando se quiere liberar el código. Además, al integrarse con el ciclo de vida de maven, podemos usarlo dentro de la configuración de nuestra herramienta de integración continua como un paso más de la entrega de una nueva versión.

Versiones

Versiones

  • Java Sun 1.6.0_07
  • Maven 2.0.9
  • maven-license-plugin 1.3.2

Contenidos relacionados

Pautas
Área: Desarrollo » Licenciamiento
Código Título Tipo Carácter
PAUT-0035 Licenciamiento del Software Pauta Directriz Obligatoria
Recursos
Área: Desarrollo » Licenciamiento
Código Título Tipo Carácter
RECU-0106 Herramienta para añadir la Licencia EUPL Herramienta Recomendado
Área: Entorno » Área Gestión de la Entrega
Código Título Tipo Carácter
RECU-0322 Maven Manual Recomendado
RECU-0681 Características de Maven3 respecto a Maven2 Referencia Recomendado