Difference between revisions of "Developing gCube Maven Components"

From Gcube Wiki
Jump to: navigation, search
(Libraries)
Line 38: Line 38:
  
 
= Libraries =
 
= Libraries =
 +
The <code>streams</code> library is a Maven component in gCube class <code>DataAccess</code>. We will use it as example of a library component in Maven.
 +
 +
=== Profile ===
 +
 +
The gCube Software profile of the library is as follows:
 +
 +
<source lang="xml" highlight="14-18">
 +
<?xml version="1.0" encoding="UTF-8"?>
 +
<Resource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 +
  <ID />
 +
  <Type>Service</Type>
 +
  <Profile>
 +
    <Description>Embedded Domain-Specific Language for Stream Transformations</Description>
 +
    <Class>DataAccess</Class>
 +
    <Name>streams</Name>
 +
    <Version>1.0.0</Version>
 +
    <Packages>
 +
      <Software>
 +
        <Name>streams</Name>
 +
        <Version>1.0.0-SNAPSHOT</Version>
 +
        <MavenCoordinates>
 +
          <groupId>org.gcube.data.access</groupId>
 +
          <artifactId>streams</artifactId>
 +
          <version>1.0.0-SNAPSHOT</version>
 +
        </MavenCoordinates>
 +
        <Files>
 +
          <File>streams-1.0.0-SNAPSHOT.jar</File>
 +
        </Files>
 +
      </Software>
 +
    </Packages>
 +
  </Profile>
 +
</Resource>
 +
</source>
 +
 +
Notice that:
 +
 +
* the profile includes a single package and this package corresponds to the main build artefact of the component;
 +
* the whole profile and the package have usual gCube coordinates;
 +
* the package name is aligned with the Maven <code>artifactId</code> of the component;
 +
* the package version is aligned with the Maven <code>version</code> of the component;
 +
* the package includes <code>MavenCoordinates</code> that can be directly copied and pasted from the POM;
 +
* the package does '''not''' specify dependencies;
 +
* the package points to the main artefact of the Maven build;
 +
 +
 +
The alignment between profile and POM can be exploited to simplify the management of the profile across different component versions.
 +
In particular, <code>streams</code> uses POM variables top define its profile:
 +
 +
<source lang="xml">
 +
<?xml version="1.0" encoding="UTF-8"?>
 +
<Resource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 +
  <ID />
 +
  <Type>Service</Type>
 +
  <Profile>
 +
    <Description>${description}</Description>
 +
    <Class>DataAccess</Class>
 +
    <Name>${artifactId}</Name>
 +
    <Version>1.0.0</Version>
 +
    <Packages>
 +
      <Software>
 +
        <Name>${artifactId}</Name>
 +
        <Version>${version}</Version>
 +
        <MavenCoordinates>
 +
            <groupId>${groupId}</groupId>
 +
            <artifactId>${artifactId}</artifactId>
 +
            <version>${version}</version>
 +
        </MavenCoordinates>
 +
<Files>
 +
            <File>${build.finalName}.jar</File>
 +
        </Files>
 +
      </Software>
 +
    </Packages>
 +
</Profile>
 +
</Resource>
 +
</source>
 +
 +
Note that the variables must be resolved (i.e. the profile is ''interpolated'') before the profile can be used within the system. In particular, the main destination of the profile is the gCube Software Archive (SA) which packages the component for registration within the system.
 +
 +
=== Service Archive ===
 +
 +
<code>streams</code> is responsible for generating its own SA as part of its Maven build. This requires dedicated logic in the POM but has the advantage that:
 +
 +
* SA validity can be verified locally;
 +
* no SA configurations are required in ETICS;
 +
* the required build logic can be easily reused across components;
 +
 +
<code>streams</code> uses the [http://maven.apache.org/plugins/maven-assembly-plugin Maven Assembly Plugin] to generate its own SA, with an approach that makes optimal use of Maven variable interpolation in static files such as <code>README</code>, <code>svnpath.txt</code>, <code>MAINTAINERS</code>, <code>changelog.xml</code>, etc. In particular, the <code>Assembly</code> plugin takes care of variable interpolation in the profile and other static files. The approach is best illustrated with a reference to the [[http://svn.d4science.research-infrastructures.eu/gcube/trunk/data-access/streams sources]] of the <code>streams</code> library.
 +
 +
 +
As we discuss [[#Creating the ETICS Configurations|below]], <code>streams</code> has the final requirement to produce an interpolated profile during ETICS builds, outside the context of the SA.
 +
<code>streams</code> meets this requirement with the [http://maven.apache.org/plugins/maven-resources-plugin/ Maven Resources Plugin]. Again, consult the [[http://svn.d4science.research-infrastructures.eu/gcube/trunk/data-access/streams sources]] of the <code>streams</code> library to reuse this approach.
 +
 
= Services =
 
= Services =
 
= Portlets =
 
= Portlets =

Revision as of 16:00, 18 July 2012

Common

Maven Coordinates

Maven components' coordinates must follow these conventions:

  • their groupId must be of the following form:
org.gcube.<class>
where class identifies a functionally correlated set of components and helps a range of users (developers, administrator) to discover components in various UIs/reports used within the system and in tools. Logically, the class corresponds to the gCube class of the component's, as specified in its gCube Software Profile. However, more specific, or else cross-class groups may be agreed upon among developers. In all cases, the group should align with official Maven guidelines. By agreement, for example, components in gCube class DataAccess declare a groupId of org.gcube.data.access and those in gCube class DataTransfer declare a groupId of org.gcube.data.transfer. On the other hand, also by agreement, components in gCube class InformationSystem declare a groupId of org.gcube.informationsystem.
  • their artifactId must follow Maven conventions (e.g. avoid capital letters or punctuation other than hyphens).

Parent

All gCube components must inherit from maven-parent. This ensure and promotes compliance with project-wide requirements, from the enforcement of minimal Java and Maven versions to generation and packaging of Javadoc documentation and component sources.

<parent>
 <artifactId>maven-parent</artifactId>
 <groupId>org.gcube.tools</groupId>
 <version>1.0.0</version>
 <relativePath />
</parent>

Service Archive (SA)

Whenever they are associated with a gCube Software Archive (SA), they must produce it as a secondary tar.gz artefact with classifier servicearchive. Note that the SA of Maven components does not need to include Javadoc documentation (as this documentation is produced and published directly as a Maven artefact);

  • for each deployable artefact they produce (primary or secondary), they must include the Maven coordinates of the arteact in the corresponding package section of the gCube Software Profile. Specifying package dependencies in the Software Profile, on the other hand, is no longer required;
  • whenever they are associated with a gCube Software Archive (SA), they must produce it as a secondary tar.gz artefact with classifier servicearchive. Note that the SA of Maven components does not need to include Javadoc documentation (as this documentation is produced and published directly as a Maven artefact);

Dependencies

gCube Maven Repositories

Third-party Repositories

Common Dependencies

Libraries

The streams library is a Maven component in gCube class DataAccess. We will use it as example of a library component in Maven.

Profile

The gCube Software profile of the library is as follows:

<?xml version="1.0" encoding="UTF-8"?>
<Resource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <ID />
  <Type>Service</Type>
  <Profile>
    <Description>Embedded Domain-Specific Language for Stream Transformations</Description>
    <Class>DataAccess</Class>
    <Name>streams</Name>
     <Version>1.0.0</Version>
     <Packages>
       <Software>
         <Name>streams</Name>
         <Version>1.0.0-SNAPSHOT</Version>
         <MavenCoordinates>           <groupId>org.gcube.data.access</groupId>           <artifactId>streams</artifactId>           <version>1.0.0-SNAPSHOT</version>         </MavenCoordinates>         <Files>
           <File>streams-1.0.0-SNAPSHOT.jar</File>
         </Files>
       </Software>
     </Packages>
  </Profile>
</Resource>

Notice that:

  • the profile includes a single package and this package corresponds to the main build artefact of the component;
  • the whole profile and the package have usual gCube coordinates;
  • the package name is aligned with the Maven artifactId of the component;
  • the package version is aligned with the Maven version of the component;
  • the package includes MavenCoordinates that can be directly copied and pasted from the POM;
  • the package does not specify dependencies;
  • the package points to the main artefact of the Maven build;


The alignment between profile and POM can be exploited to simplify the management of the profile across different component versions. In particular, streams uses POM variables top define its profile:

<?xml version="1.0" encoding="UTF-8"?>
<Resource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <ID />
  <Type>Service</Type>
  <Profile>
    <Description>${description}</Description>
     <Class>DataAccess</Class>
     <Name>${artifactId}</Name>
     <Version>1.0.0</Version>
     <Packages>
       <Software>
         <Name>${artifactId}</Name>
         <Version>${version}</Version>
         <MavenCoordinates>
            <groupId>${groupId}</groupId>
            <artifactId>${artifactId}</artifactId>
             <version>${version}</version>
         </MavenCoordinates>
	 <Files>
            <File>${build.finalName}.jar</File>
         </Files>
       </Software>
     </Packages>
</Profile>
</Resource>

Note that the variables must be resolved (i.e. the profile is interpolated) before the profile can be used within the system. In particular, the main destination of the profile is the gCube Software Archive (SA) which packages the component for registration within the system.

Service Archive

streams is responsible for generating its own SA as part of its Maven build. This requires dedicated logic in the POM but has the advantage that:

  • SA validity can be verified locally;
  • no SA configurations are required in ETICS;
  • the required build logic can be easily reused across components;

streams uses the Maven Assembly Plugin to generate its own SA, with an approach that makes optimal use of Maven variable interpolation in static files such as README, svnpath.txt, MAINTAINERS, changelog.xml, etc. In particular, the Assembly plugin takes care of variable interpolation in the profile and other static files. The approach is best illustrated with a reference to the [sources] of the streams library.


As we discuss below, streams has the final requirement to produce an interpolated profile during ETICS builds, outside the context of the SA. streams meets this requirement with the Maven Resources Plugin. Again, consult the [sources] of the streams library to reuse this approach.

Services

Portlets