Uber JAR with Maven

By default maven is generating a small JAR file, which just contains your compiled classes and other project files. If you want to have a single JAR file which also includes all dependent JAR files, you have to create a uber JAR. You can do that with the maven shade plugin. Just put this lines of xml into your pom.xml.

</pre>
<build>
<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
	<version>1.4</version>
	<executions>
	  <execution>
	    <phase>package</phase>
	    <goals>
	      <goal>shade</goal>
	    </goals>
	    <configuration>
	      <shadedArtifactAttached>true</shadedArtifactAttached>
	      <shadedClassifierName>all</shadedClassifierName>
	    </configuration>
	  </execution>
	</executions>
      </plugin>
   </plugins>
 </build>
<pre>

In Maven you can solve every problem. You just need enough XML code for that. If you still have problems, than probably your pom.xml is to short. 🙂

Archetype: RichFaces 4.0.0.M1 + Spring 3.0.5.RELEASE + Hibernate 3.3.0

This maven2 archetype contains a little sample web application with this Frameworks:

  • Spring 3.0.5.RELEASE Framework
  • Servlet-API 2.5
  • JSF 2.0 (mojarra 2.1.2)
  • RichFaces 4.0.0.M1
  • ploinFaces 1.6
  • ploinMailFactory 1.3.1
  • Hibernate 3.3.0
  • TestNG 5.8
  • Log4J 1.2.15
  • HSQLDB 1.8.0.7

The configuration is annotation-driven. It is deployed on the PLOIN Repository-Serve

http://www.ploin-m2.de/nexus/content/groups/public/

you can create a project from the archetype with the following command:

mvn archetype:generate -DarchetypeGroupId=org.ploin.archetype -DarchetypeArtifactId=tempSpringRichHibernate -DarchetypeVersion=1.7.2 -DarchetypeRepository=http://www.ploin-m2.de/nexus/content/groups/public/ -DgroupId=org.ploin -DartifactId=demoSpringRichHibernate

The created project is a very simple web-application with a login mask and 2 xhtml-sites. I have tested the app on a tomcat 6.0.20 and Java 1.6 on Mac OS X Snow Leopard.

rich-faces-login
rich-faces-login

You can login with the username “admin” and the password “admin”.

After the creation the app is running with the HypersoniceSQL DBMS. But it is very easy to switch to MySQL or Oracle. I put the drivers for MySQL and Oracle as a comment in the pom.xml. So you just need to comment in the right lines in the pom.xml.

JavaDoc und Sources mit Maven downloaden

Maven2 sieht vor produktiven Code, SourceCode und JavaDoc in getrennten JAR-Archiven zu hinterlegen. Idealerweise liegen zu einem Software-Artefakt also drei JAR-Files vor. Hier ein Beispiel:

ploinFaces-1.4.5.jar
ploinFaces-1.4.5-javadoc.jar
ploinFaces-1.4.5-sources.jar

Bei einem Aufruf wie “mvn compile” wird standardmäßig immer nur der produktive Code herunter geladen. Wenn auch die JAR-Files mit den classifiern “javadoc” und “sources” von Maven herunter geladen werden sollen, dann muss das explizit mit angegeben werden. Der folgende Aufruf lädt von allen Abhängigkeiten eines Projektes die Sourcen und das JavaDoc herunter und bindet auch alles richtig in Eclipse ein

mvn -DdownloadJavadocs -DdownloadSources eclipse:eclipse

und entsprechend fĂĽr IDEA:

mvn -DdownloadJavadocs -DdownloadSources idea:idea

Leider halten sich nicht alle OpenSource-Projekte an die Vorgaben von Maven und so gibt es bedauerlicherweise viele Projekte deren SourceCode und JavaDoc nicht in M2-Repositorys hinterlegt sind.

RichFaces mit Maven2

Um RichFaces als aktuelle Maven2 Abhängigkeit zu verwenden, ist es erforderlich die JBoss M2 Repositories in der setting.xml (~/.m2/setting.xml) von Maven2 zu registrieren. Bei mir sieht die Datei wie folgt aus:

<?xml version="1.0" ?>
 <settings>
   <mirrors>

     <mirror>
        <id>ibiblio.org</id>
        <name>ibiblio Mirror of http://repo1.maven.org/maven2/</name>
        <url>http://mirrors.ibiblio.org/pub/mirrors/maven2</url>
        <mirrorOf>central</mirrorOf>
     </mirror>

   </mirrors>

   <activeProfiles>
      <activeProfile>RichFaces</activeProfile>
   </activeProfiles>

 <profiles>
   <profile>
     <id>RichFaces</id>
     <repositories>
       <repository>
         <releases>
           <enabled>true</enabled>
         </releases>
         <snapshots>
           <enabled>false</enabled>
           <updatePolicy>never</updatePolicy>
         </snapshots>
         <id>repository.jboss.com</id>
         <name>Jboss Repository for Maven</name>
         <url>http://repository.jboss.com/maven2/</url>
         <layout>default</layout>
       </repository>
       <repository>
         <releases>
           <enabled>false</enabled>
         </releases>
         <snapshots>
           <enabled>true</enabled>
           <updatePolicy>always</updatePolicy>
         </snapshots>
         <id>maven2-snapshots.jboss.com</id>
         <name>Jboss Repository for Maven Snapshots</name>
         <url>http://snapshots.jboss.org/maven2</url>
         <layout>default</layout>
       </repository>
    </repositories>

  <pluginRepositories>
     <pluginRepository>
       <id>maven2-snapshots.jboss.com</id>
       <name>Jboss Repository for Maven Snapshots</name>
       <url>http://snapshots.jboss.org/maven2</url>
       <releases>
         <enabled>false</enabled>
       </releases>
       <snapshots>
         <enabled>true</enabled>
         <updatePolicy>always</updatePolicy>
       </snapshots>
     </pluginRepository>
     <pluginRepository>
       <releases>
          <enabled>true</enabled>
       </releases>
       <snapshots>
         <enabled>false</enabled>
         <updatePolicy>never</updatePolicy>
       </snapshots>
       <id>repository.jboss.com</id>
       <name>Jboss Repository for Maven</name>
       <url>http://repository.jboss.com/maven2/</url>
       <layout>default</layout>
     </pluginRepository>
   </pluginRepositories>
 </profile>
</profiles>

</settings>

Wenn das erledigt ist, muss nur noch die entsprechende pom.xml um die folgende Abhängigkeit erweitert werden:

<dependency>
   <groupId>org.richfaces.ui</groupId>
   <artifactId>richfaces-ui</artifactId>
   <version>3.3.1.GA</version>
</dependency>

Wenn man noch Facelets statt den olen JSPs verwenden will, dann sollte zusätzlich noch folgender Eintrag in der pom.xml stehen:

 <dependency>
     <groupId>com.sun.facelets</groupId>
     <artifactId>jsf-facelets</artifactId>
     <version>1.1.14</version>
 </dependency>

Nach dem folgenden Aufruf:

mvn -DdownloadSources eclipse:eclipse

Maven2 quickinstall for Mac OS X

Maven2 kann von http://maven.apache.org/ als zip-Datei heruntergeladen werden. Nach dem enpacken muss die Umgebungsvariable PATH angepasst werden und drei weitere Umgebungsvariablen mĂĽssen erstellt werden damit Maven2 aus der Kommandozeile aufgerufen werden kann. Gehen wir davon aus das Maven2 in den folgenden Ordner entpackt wurde:

/Users/jan/apache-maven-2.0.9/

Um die benötigten Umgebungsvariablen nicht jedesmal aus der Kommandozeile exportieren zu müssen, macht es Sinn die /etc/profile zu erweitern. Ausgehend vom oberen Verzeichniss sollten folgende Einträge in der /etc/profile vorhanden sein.

export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home
export M2_HOME=/Users/jan/apache-maven-2.0.9
export M2=$M2_HOME/bin
export MAVEN_OPTS="-Xms256m -Xmx1024m -XX:MaxPermSize=1024m"
export PATH=$PATH:$M2

Jetzt noch eine neue Shell/Bash starten oder einfach den Befehl “bash” absetzen um die neuen Einstellungen aus der /etc/profile zu laden. Und das war es auch schon. Maven2 ist fertig installiert auf dem Mac. Der folgende Befehl sollte die Java- und Maven2 Version ausgeben:

mvn --version

Dynamic Version Ranges in Maven2

In Maven2 ist es möglich die Versionen von Softwareartefakten dynamisch an zu geben. Die folgende Versionsangabe bezieht sich immer auf die aktuellste Version einer Abhängigkeit, aber der Version 1.0.

<version>[1,0,)</version>

Um eine bestimmtet Version zu blocken, z.B. die 1.1, ist folgender Eintrage nötig.

<version>(,1.0],[1.2,)</version>

Wenn ein Softwareartefakt in einem bestimmten Versionsbereich akzeptiert werden soll ist folgendes Beispiel hilfreich.

<version>[1.0,2.0]</version>

Im obrigen Beispiel sind nur Versionen zwischen 1.0 und 2.0 zulässig.

Maven2 quickinstall

maven2 kann von http://maven.apache.org/ als zip-Datei heruntergeladen werden. Nach dem enpacken muss die Umgebungsvariable PATH angepasst werden und drei weitere Umgebungsvariablen muessen erstellt werden damit maven2 aus der Kommandozeile aufgerufen werden kann. Die PATH sollte erweitert werden um den Pfad zum maven2 Verzeichnis(das ist das entpackte Verzeichnis) + “/bin”.

export PATH=$PATH:pathToMaven2/bin

Als naechstes sollte die M2_HOME gesetzt werden.

export M2_HOME=pathToMaven2

Anschliesend die M2.

export M2=pathToMaven2/bin

und die JAVA_HOME muss natuerlich gesetzt sein.

export JAVA_HOME=pathToYourJavaHome

Wenn mit eclipse gearbeitet wird, muss in eclipse die Classpath Variable M2_REPO eingerichtet werden. Siehe hierzu folgendes Bild.