Although theoretically any external library available as a JAR and uploaded to a Maven repository can be added to any project as simple dependency, this approach is not advisable if one wants to use both Maven and eclipse at the same time (many hurtful expierences have shown). The best approach is to make a clear separation between eclipse projects linked to an external dependency and eclipse projects, which introduce new code. Thus, 'empty' projects in eclipse must be created, which contain no 'new' classes but soley a specification of external dependencies.
How to use this template:
mvn eclipse:clean clean package eclipse:eclipse -Declipse.pde -Declipse.useProjectReferences=false install
Features of this template:
Constraints of this template:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Template: https://sites.google.com/site/eclipsemaven/external-library -->
<project>
<groupId>[XXX]</groupId>
<artifactId>[XXX]</artifactId>
<version>[XXX]</version>
<name>${project.artifactId}</name>
<properties>
<module.importedPackages>
*
</module.importedPackages>
<module.exportedContents>
</module.exportedContents>
<module.exportedPackages>
*
</module.exportedPackages>
<module.embeddedDependencies>*
</module.embeddedDependencies>
<module.embedTransitive>true</module.embedTransitive>
<module.serviceDefinitions>
</module.serviceDefinitions>
</properties>
<!-- DEPENDENCIES -->
<dependencies>
<dependency>
<groupId>[XXX]</groupId>
<artifactId>[XXX]</artifactId>
<version>[XXX]</version>
</dependency>
<dependency>
<groupId>[XXX]</groupId>
<artifactId>[XXX]</artifactId>
<version>[XXX]</version>
</dependency>
</dependencies>
<modelVersion>4.0.0</modelVersion>
<packaging>bundle</packaging>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
<version>2.3.2</version>
</plugin>
<!-- FOR BUNDLE MANAGEMENT -->
<!-- The Maven bundle plugin generates Meta-data required for OSGi -->
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>2.1.0</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
<Bundle-Version>${project.version}</Bundle-Version>
<Import-Package>${module.importedPackages}</Import-Package>
<Export-Package>${module.exportedPackages}</Export-Package>
<Service-Component>${module.serviceDefinitions}
</Service-Component>
<Embed-Dependency>${module.embeddedDependencies}
</Embed-Dependency>
<Embed-Directory>target/dependency</Embed-Directory>
<Embed-Transitive>${module.embedTransitive}</Embed-Transitive>
<_exportcontents>${module.exportedContents}</_exportcontents>
</instructions>
</configuration>
</plugin>
<!-- FOR MAVEN ECLIPSE PLUGIN -->
<!-- Dependency Plugin used to copy the dependency JARs into the root
project folder. There the Maven eclipse plugin will add them to the classpath
of PDE projects. -->
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>process-sources</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${basedir}</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
<!-- for eclipse pde -->
<execution>
<id>copy-dependencies2</id>
<phase>process-sources</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<!-- <includeArtifactIds>${module.embeddedDependencies}</includeArtifactIds> -->
<outputDirectory>${basedir}/target/dependency</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
<!-- Cleanup necessary because of PDE tweaks, clear the project directory -->
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>2.3</version>
<configuration>
<filesets>
<fileset>
<directory>${basedir}</directory>
<includes>
<include>*.jar</include>
</includes>
<followSymlinks>false</followSymlinks>
</fileset>
</filesets>
</configuration>
</plugin>
<!-- Keep the MANIFEST.MF used by eclipse in sync with the MANIFEST.MF
created by the maven bundle plugin -->
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<delete file="${basedir}/META-INF/MANIFEST.MF" />
<copy file="target/classes/META-INF/MANIFEST.MF" tofile="${basedir}/META-INF/MANIFEST.MF" />
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
<!-- RESOURCES -->
<resources>
<!-- This entry makes sure that resources, which lie in the same package
as Java classes, are copied into the target. Often external libraries require
resources, which are loaded using Class.getResource or Class.getResourceAsStream
and which are in a subpackage of the class. For instance, the NetBeans template
for the Swing Application Framework does so. -->
<resource>
<filtering>false</filtering>
<directory>src/main/java</directory>
<includes>
<include>**</include>
</includes>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</resource>
<!-- This entry makes sure component definitions for OSGi declarative
services are copied into the destination -->
<resource>
<targetPath>OSGI-INF</targetPath>
<filtering>false</filtering>
<directory>OSGI-INF</directory>
<includes>
<include>**</include>
</includes>
</resource>
<!-- I really do not know why know a manual entry for src/main/resources
is necessary? It should be included following the Maven convention. -->
<resource>
<filtering>false</filtering>
<directory>src/main/resources</directory>
<includes>
<include>**</include>
</includes>
</resource>
</resources>
</build>
<!-- ADDITIONAL REPOSITORIES -->
<!-- define non Maven central repositories here -->
<!-- <repositories>
<repository>
<id>Jenabean</id>
<url>http://jenabean.googlecode.com/svn/repo</url>
</repository>
</repositories>
<-->
</project>