[ImageJ-devel] [fiji-devel] Re: New imglib2-algorithms-legacy

Stephan Preibisch preibisch at mpi-cbg.de
Tue Jul 10 13:28:25 CDT 2012


Hi Johannes,

this is very useful, could you put maybe onto the Fiji wiki that when searching for "Maven" this would shop up? I guess I will know if I really got it once I try to make a new src-plugins plugin ...

It definitely made into my "GIT & Maven HowTo" directory ...

Thanks a lot,
Steffi

On Jul 10, 2012, at 13:50 , Johannes Schindelin wrote:

> Hi Curtis,
> 
> On Tue, 10 Jul 2012, Curtis Rueden wrote:
> 
>> On Tue, Jul 10, 2012 at 11:21 AM, Johannes Schindelin
> <
>> Johannes.Schindelin at gmx.de> wrote:
>>> I will make a branch with a simple pom and will be on Skype later.
>>> Fair ennough?
>> 
>> I have done this for imglib2-algorithms-legacy and pushed to master.
> 
> Darn, you beat me to it! ;-)
> 
> But that gives me more time to explain what it takes to make a new Maven
> project.
> 
> All it really takes is a pom.xml file and a certain directory structure.
> Technically, you can override the default directory layout in the pom.xml,
> but why do so? It only breaks expectations and is more hassle than it is
> worth, really.
> 
> So the directory structure is: you put your .java files under
> src/main/java/ and the other files you need to be included into
> src/main/resources/. Should you want to apply the best practices called
> "regression tests" or even "test-driven development": your tests' .java
> files go to src/test/java/ and the non-.java files you might require
> unsurprisingly into src/test/resources/.
> 
> So what does a pom.xml look like? This is a very simple example:
> 
> 	<?xml version="1.0" encoding="UTF-8"?>
> 	<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>sc.fiji</groupId>
> 		<artifactId>my-uber-library</artifactId>
> 		<version>2.0.0-SNAPSHOT</version>
> 	</project>
> 
> The first 6 lines are of course just a way to say "Hi, Maven? How are you
> today? This is what I would like you to do:".
> 
> The only relevant parts are the groupId, which by convention is something
> like the inverted domain name (similar to the Java package convention),
> the name of the artifact to build (it will be put into target/, under the
> name <artifactId>-<version>.jar). And of course the version.
> 
> Now, why did I bother so much with Mavenization of Fiji? The real reason
> is that Maven is not only a build tool but first and foremost a dependency
> management tool. Maven has so-called Maven repositories where it stores
> compiled artifacts. ImageJ2's Maven repository lives here:
> http://maven.imagej.net:8081/ (most functions can be accessed via
> http://maven.imagej.net/ just as well). It is like Fiji's precompiled/
> directory, but done right.
> 
> Next, for Maven to know what you are looking for, you typically have to
> add the dependencies into the pom.xml file. For example, every ImageJ 1.x
> plugin will depend on ImageJ 1.x. So let's add that (before the final
> </project> line):
> 
> 	<dependencies>
> 		<dependency>
> 			<groupId>net.imagej</groupId>
> 			<artifactId>ij</artifactId>
> 			<version>1.45b</version>
> 		</dependency>
> 	</dependencies>
> 
> As you can see, dependencies are referenced under the same groupId,
> artifactId and version triplet (also known as GAV parameters) that you had
> to declare for the current project.
> 
> For Maven to find the dependencies, it has to know about the location of
> the repositories. As you know, we are strong proponents of collaboration
> within the scientific community, so we started the scijava effort last
> hackathon in December. To this end, Curtis began the scijava "super POM"
> which is supposed to declare repositories we use (and other metadata as
> well, such as current artifact versions we provide). To benefit from this
> in your project, add this to your pom.xml:
> 
> 	<parent>
> 		<groupId>org.scijava</groupId>
> 		<artifactId>pom-scijava</artifactId>
> 		<version>1.15</version>
> 	</parent>
> 
> 	<!-- NB: for project parent -->
> 	<repositories>
> 		<repository>
> 			<id>imagej.releases</id>
> 			<url>http://maven.imagej.net/content/repositories/releases</url>
> 		</repository>
> 		<repository>
> 			<id>imagej.snapshots</id>
> 			<url>http://maven.imagej.net/content/repositories/snapshots</url>
> 		</repository>
> 	</repositories>
> 
> You will see that there are two different repository types: releases and
> snapshots. The snapshot versions are "in-progress" versions. If you
> declare a dependency with a "-SNAPSHOT" suffix in the version, Maven will
> look once a day for new artifacts of the same versions; otherwise, Maven
> will look whether it has that version already and not bother
> re-downloading.
> 
> So what if you have multiple .jar files you want to build in the same
> project? Then these need to live in their own subdirectories and there
> needs to be a common parent POM, a so-called "aggregator" POM. For an
> example, look at Fiji's src-plugins/pom.xml. Basically, it is adding the
> <packaging>pom</packaging> entry as well as a couple of subdirectory names
> to the <modules> section.
> 
> There are many more things you can do with Maven, but chances are you will
> not need them.
> 
> The simplicity of the pom.xml you need comes from the fact that Maven
> defines implicit defaults. It calls that "convention over configuration".
> But since we are not converting projects (or at least since we are
> flexible enough to adapt), I would strongly recommend staying with the
> defaults as much as possible. It also makes your project more accessible,
> something that I think we excel at.
> 
> Now, in the context of scijava, you will most likely never write a pom.xml
> from scratch. You will rather more likely edit an existing one, possibly
> after having copied it.
> 
> Ciao,
> Dscho




More information about the ImageJ-devel mailing list