- Maven with 64%
- Ant + Ivy with 16.5%
- Gradle with 11%
But let’s cut the jokes and have a look at a real-world issue:
Integrating Third-Party Commercial Artefacts
Not all third party artefacts that you would like to depend upon are available for free from Maven Central. Examples for this are commercial JDBC drivers, or the commercial jOOQ editions. There are essentially three ways to integrate such artefacts into your build:Quick-and-dirty
Often, you only need the commercial dependency for a small test project or demo. You want to be sure that it works when you run it without depending on your local repository setup, or on network connectivity. This is a good use-case for<scope>system</scope>
:
For instance: jOOQ
<dependency>
<groupId>org.jooq</groupId>
<artifactId>jooq</artifactId>
<version>${jooq.version}</version>
<scope>system</scope>
<systemPath>${basedir}/lib/jooq-${jooq.version}.jar</systemPath>
</dependency>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>sqljdbc4</artifactId>
<version>3.0</version>
<scope>system</scope>
<systemPath>${basedir}/lib/sqljdbc4.jar</systemPath>
<!-- Notice that we can still put "optional"
on commercial JDBC driver dependencies -->
<optional>true</optional>
</dependency>
Dependencies with the scope system are always available and are not looked up in repository. They are usually used to tell Maven about dependencies which are provided by the JDK or the VM. Thus, system dependencies are especially useful for resolving dependencies on artifacts which are now provided by the JDK, but where available as separate downloads earlier. Typical example are the JDBC standard extensions or the Java Authentication and Authorization Service (JAAS).
A bit more robust
An approach that might appear to be a bit more robust is to check out the dependencies from your version control system and then “manually” import them to your local repository. This will make them available to your own local build. The following shell scripts show how you can import, for instance, the jOOQ artefacts into your local repository Windows Batch
@echo off
set VERSION=3.4.4
if exist jOOQ-javadoc\jooq-%VERSION%-javadoc.jar (
set JAVADOC_JOOQ=-Djavadoc=jOOQ-javadoc\jooq-%VERSION%-javadoc.jar
set JAVADOC_JOOQ_META=-Djavadoc=jOOQ-javadoc\jooq-meta-%VERSION%-javadoc.jar
set JAVADOC_JOOQ_CODEGEN=-Djavadoc=jOOQ-javadoc\jooq-codegen-%VERSION%-javadoc.jar
set JAVADOC_JOOQ_CODEGEN_MAVEN=-Djavadoc=jOOQ-javadoc\jooq-codegen-maven-%VERSION%-javadoc.jar
set JAVADOC_JOOQ_SCALA=-Djavadoc=jOOQ-javadoc\jooq-scala-%VERSION%-javadoc.jar
)
if exist jOOQ-src\jooq-%VERSION%-sources.jar (
set SOURCES_JOOQ=-Dsources=jOOQ-src\jooq-%VERSION%-sources.jar
set SOURCES_JOOQ_META=-Dsources=jOOQ-src\jooq-meta-%VERSION%-sources.jar
set SOURCES_JOOQ_CODEGEN=-Dsources=jOOQ-src\jooq-codegen-%VERSION%-sources.jar
set SOURCES_JOOQ_CODEGEN_MAVEN=-Dsources=jOOQ-src\jooq-codegen-maven-%VERSION%-sources.jar
set SOURCES_JOOQ_SCALA=-Dsources=jOOQ-src\jooq-scala-%VERSION%-sources.jar
)
call mvn install:install-file -Dfile=jOOQ-pom\pom.xml -DgroupId=org.jooq -DartifactId=jooq-parent -Dversion=%VERSION% -Dpackaging=pom
call mvn install:install-file -Dfile=jOOQ-lib\jooq-%VERSION%.jar -DgroupId=org.jooq -DartifactId=jooq -Dversion=%VERSION% -Dpackaging=jar %JAVADOC_JOOQ% %SOURCES_JOOQ% -DpomFile=jOOQ-pom\jooq\pom.xml
call mvn install:install-file -Dfile=jOOQ-lib\jooq-meta-%VERSION%.jar -DgroupId=org.jooq -DartifactId=jooq-meta -Dversion=%VERSION% -Dpackaging=jar %JAVADOC_JOOQ_META% %SOURCES_JOOQ_META% -DpomFile=jOOQ-pom\jooq-meta\pom.xml
call mvn install:install-file -Dfile=jOOQ-lib\jooq-codegen-%VERSION%.jar -DgroupId=org.jooq -DartifactId=jooq-codegen -Dversion=%VERSION% -Dpackaging=jar %JAVADOC_JOOQ_CODEGEN% %SOURCES_JOOQ_CODEGEN% -DpomFile=jOOQ-pom\jooq-codegen\pom.xml
call mvn install:install-file -Dfile=jOOQ-lib\jooq-codegen-maven-%VERSION%.jar -DgroupId=org.jooq -DartifactId=jooq-codegen-maven -Dversion=%VERSION% -Dpackaging=jar %JAVADOC_JOOQ_CODEGEN_MAVEN% %SOURCES_JOOQ_CODEGEN_META% -DpomFile=jOOQ-pom\jooq-codegen-maven\pom.xml
call mvn install:install-file -Dfile=jOOQ-lib\jooq-scala-%VERSION%.jar -DgroupId=org.jooq -DartifactId=jooq-scala -Dversion=%VERSION% -Dpackaging=jar %JAVADOC_JOOQ_SCALA% %SOURCES_JOOQ_SCALA% -DpomFile=jOOQ-pom\jooq-scala\pom.xml
#!/bin/sh
VERSION=3.4.4
if [ -f jOOQ-javadoc/jooq-$VERSION-javadoc.jar ]; then
JAVADOC_JOOQ=-Djavadoc=jOOQ-javadoc/jooq-$VERSION-javadoc.jar
JAVADOC_JOOQ_META=-Djavadoc=jOOQ-javadoc/jooq-meta-$VERSION-javadoc.jar
JAVADOC_JOOQ_CODEGEN=-Djavadoc=jOOQ-javadoc/jooq-codegen-$VERSION-javadoc.jar
JAVADOC_JOOQ_CODEGEN_MAVEN=-Djavadoc=jOOQ-javadoc/jooq-codegen-maven-$VERSION-javadoc.jar
JAVADOC_JOOQ_SCALA=-Djavadoc=jOOQ-javadoc/jooq-scala-$VERSION-javadoc.jar
fi
if [ -f jOOQ-src/jooq-$VERSION-sources.jar ]; then
SOURCES_JOOQ=-Dsources=jOOQ-src/jooq-$VERSION-sources.jar
SOURCES_JOOQ_META=-Dsources=jOOQ-src/jooq-meta-$VERSION-sources.jar
SOURCES_JOOQ_CODEGEN=-Dsources=jOOQ-src/jooq-codegen-$VERSION-sources.jar
SOURCES_JOOQ_CODEGEN_MAVEN=-Dsources=jOOQ-src/jooq-codegen-maven-$VERSION-sources.jar
SOURCES_JOOQ_SCALA=-Dsources=jOOQ-src/jooq-scala-$VERSION-sources.jar
fi
mvn install:install-file -Dfile=jOOQ-pom/pom.xml -DgroupId=org.jooq -DartifactId=jooq-parent -Dversion=$VERSION -Dpackaging=pom
mvn install:install-file -Dfile=jOOQ-lib/jooq-$VERSION.jar -DgroupId=org.jooq -DartifactId=jooq -Dversion=$VERSION -Dpackaging=jar $JAVADOC_JOOQ $SOURCES_JOOQ -DpomFile=jOOQ-pom/jooq/pom.xml
mvn install:install-file -Dfile=jOOQ-lib/jooq-meta-$VERSION.jar -DgroupId=org.jooq -DartifactId=jooq-meta -Dversion=$VERSION -Dpackaging=jar $JAVADOC_JOOQ_META $SOURCES_JOOQ_META -DpomFile=jOOQ-pom/jooq-meta/pom.xml
mvn install:install-file -Dfile=jOOQ-lib/jooq-codegen-$VERSION.jar -DgroupId=org.jooq -DartifactId=jooq-codegen -Dversion=$VERSION -Dpackaging=jar $JAVADOC_JOOQ_CODEGEN $SOURCES_JOOQ_CODEGEN -DpomFile=jOOQ-pom/jooq-codegen/pom.xml
mvn install:install-file -Dfile=jOOQ-lib/jooq-codegen-maven-$VERSION.jar -DgroupId=org.jooq -DartifactId=jooq-codegen-maven -Dversion=$VERSION -Dpackaging=jar $JAVADOC_JOOQ_CODEGEN_MAVEN $SOURCES_JOOQ_CODEGEN_META -DpomFile=jOOQ-pom/jooq-codegen-maven/pom.xml
mvn install:install-file -Dfile=jOOQ-lib/jooq-scala-$VERSION.jar -DgroupId=org.jooq -DartifactId=jooq-scala -Dversion=$VERSION -Dpackaging=jar $JAVADOC_JOOQ_SCALA $SOURCES_JOOQ_SCALA -DpomFile=jOOQ-pom/jooq-scala/pom.xml
- The parent pom.xml
- The various artefact binaries, sources, javadocs, and pom.xml files
<dependency>
<groupId>org.jooq</groupId>
<artifactId>jooq</artifactId>
<version>${jooq.version}</version>
</dependency>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>sqljdbc4</artifactId>
<version>3.0</version>
<scope>provided</scope>
</dependency>
Deploying
If, instead of installing, you’d like to deploy the artifacts to some remote repository, use these adapted scripts instead: Windows Batch
@echo off
set VERSION=3.4.4
set REPOSITORY=[set your repository name here, as in settings.xml]
set URL=[set your server URL here]
if exist jOOQ-javadoc\jooq-%VERSION%-javadoc.jar (
set JAVADOC_JOOQ=-Djavadoc=jOOQ-javadoc\jooq-%VERSION%-javadoc.jar
set JAVADOC_JOOQ_META=-Djavadoc=jOOQ-javadoc\jooq-meta-%VERSION%-javadoc.jar
set JAVADOC_JOOQ_CODEGEN=-Djavadoc=jOOQ-javadoc\jooq-codegen-%VERSION%-javadoc.jar
set JAVADOC_JOOQ_CODEGEN_MAVEN=-Djavadoc=jOOQ-javadoc\jooq-codegen-maven-%VERSION%-javadoc.jar
set JAVADOC_JOOQ_SCALA=-Djavadoc=jOOQ-javadoc\jooq-scala-%VERSION%-javadoc.jar
)
if exist jOOQ-src\jooq-%VERSION%-sources.jar (
set SOURCES_JOOQ=-Dsources=jOOQ-src\jooq-%VERSION%-sources.jar
set SOURCES_JOOQ_META=-Dsources=jOOQ-src\jooq-meta-%VERSION%-sources.jar
set SOURCES_JOOQ_CODEGEN=-Dsources=jOOQ-src\jooq-codegen-%VERSION%-sources.jar
set SOURCES_JOOQ_CODEGEN_MAVEN=-Dsources=jOOQ-src\jooq-codegen-maven-%VERSION%-sources.jar
set SOURCES_JOOQ_SCALA=-Dsources=jOOQ-src\jooq-scala-%VERSION%-sources.jar
)
call mvn deploy:deploy-file -Dfile=jOOQ-pom\pom.xml -DgroupId=org.jooq -DartifactId=jooq-parent -DrepositoryId=%REPOSITORY% -Durl=%URL% -Dversion=%VERSION% -Dpackaging=pom
call mvn deploy:deploy-file -Dfile=jOOQ-lib\jooq-%VERSION%.jar -DgroupId=org.jooq -DartifactId=jooq -DrepositoryId=%REPOSITORY% -Durl=%URL% -Dversion=%VERSION% -Dpackaging=jar %JAVADOC_JOOQ% %SOURCES_JOOQ% -DpomFile=jOOQ-pom\jooq\pom.xml
call mvn deploy:deploy-file -Dfile=jOOQ-lib\jooq-meta-%VERSION%.jar -DgroupId=org.jooq -DartifactId=jooq-meta -DrepositoryId=%REPOSITORY% -Durl=%URL% -Dversion=%VERSION% -Dpackaging=jar %JAVADOC_JOOQ_META% %SOURCES_JOOQ_META% -DpomFile=jOOQ-pom\jooq-meta\pom.xml
call mvn deploy:deploy-file -Dfile=jOOQ-lib\jooq-codegen-%VERSION%.jar -DgroupId=org.jooq -DartifactId=jooq-codegen -DrepositoryId=%REPOSITORY% -Durl=%URL% -Dversion=%VERSION% -Dpackaging=jar %JAVADOC_JOOQ_CODEGEN% %SOURCES_JOOQ_CODEGEN% -DpomFile=jOOQ-pom\jooq-codegen\pom.xml
call mvn deploy:deploy-file -Dfile=jOOQ-lib\jooq-codegen-maven-%VERSION%.jar -DgroupId=org.jooq -DartifactId=jooq-codegen-maven -DrepositoryId=%REPOSITORY% -Durl=%URL% -Dversion=%VERSION% -Dpackaging=jar %JAVADOC_JOOQ_CODEGEN_MAVEN% %SOURCES_JOOQ_CODEGEN_META% -DpomFile=jOOQ-pom\jooq-codegen-maven\pom.xml
call mvn deploy:deploy-file -Dfile=jOOQ-lib\jooq-scala-%VERSION%.jar -DgroupId=org.jooq -DartifactId=jooq-scala -DrepositoryId=%REPOSITORY% -Durl=%URL% -Dversion=%VERSION% -Dpackaging=jar %JAVADOC_JOOQ_SCALA% %SOURCES_JOOQ_SCALA% -DpomFile=jOOQ-pom\jooq-scala\pom.xml
#!/bin/sh
VERSION=3.4.4
REPOSITORY=[set your repository name here, as in settings.xml]
URL=[set your server URL here]
if [ -f jOOQ-javadoc/jooq-$VERSION-javadoc.jar ]; then
JAVADOC_JOOQ=-Djavadoc=jOOQ-javadoc/jooq-$VERSION-javadoc.jar
JAVADOC_JOOQ_META=-Djavadoc=jOOQ-javadoc/jooq-meta-$VERSION-javadoc.jar
JAVADOC_JOOQ_CODEGEN=-Djavadoc=jOOQ-javadoc/jooq-codegen-$VERSION-javadoc.jar
JAVADOC_JOOQ_CODEGEN_MAVEN=-Djavadoc=jOOQ-javadoc/jooq-codegen-maven-$VERSION-javadoc.jar
JAVADOC_JOOQ_SCALA=-Djavadoc=jOOQ-javadoc/jooq-scala-$VERSION-javadoc.jar
fi
if [ -f jOOQ-src/jooq-$VERSION-sources.jar ]; then
SOURCES_JOOQ=-Dsources=jOOQ-src/jooq-$VERSION-sources.jar
SOURCES_JOOQ_META=-Dsources=jOOQ-src/jooq-meta-$VERSION-sources.jar
SOURCES_JOOQ_CODEGEN=-Dsources=jOOQ-src/jooq-codegen-$VERSION-sources.jar
SOURCES_JOOQ_CODEGEN_MAVEN=-Dsources=jOOQ-src/jooq-codegen-maven-$VERSION-sources.jar
SOURCES_JOOQ_SCALA=-Dsources=jOOQ-src/jooq-scala-$VERSION-sources.jar
fi
mvn deploy:deploy-file -Dfile=jOOQ-pom/pom.xml -DgroupId=org.jooq -DartifactId=jooq-parent -DrepositoryId=$REPOSITORY -Durl=$URL -Dversion=$VERSION -Dpackaging=pom
mvn deploy:deploy-file -Dfile=jOOQ-lib/jooq-$VERSION.jar -DgroupId=org.jooq -DartifactId=jooq -DrepositoryId=$REPOSITORY -Durl=$URL -Dversion=$VERSION -Dpackaging=jar $JAVADOC_JOOQ $SOURCES_JOOQ -DpomFile=jOOQ-pom/jooq/pom.xml
mvn deploy:deploy-file -Dfile=jOOQ-lib/jooq-meta-$VERSION.jar -DgroupId=org.jooq -DartifactId=jooq-meta -DrepositoryId=$REPOSITORY -Durl=$URL -Dversion=$VERSION -Dpackaging=jar $JAVADOC_JOOQ_META $SOURCES_JOOQ_META -DpomFile=jOOQ-pom/jooq-meta/pom.xml
mvn deploy:deploy-file -Dfile=jOOQ-lib/jooq-codegen-$VERSION.jar -DgroupId=org.jooq -DartifactId=jooq-codegen -DrepositoryId=$REPOSITORY -Durl=$URL -Dversion=$VERSION -Dpackaging=jar $JAVADOC_JOOQ_CODEGEN $SOURCES_JOOQ_CODEGEN -DpomFile=jOOQ-pom/jooq-codegen/pom.xml
mvn deploy:deploy-file -Dfile=jOOQ-lib/jooq-codegen-maven-$VERSION.jar -DgroupId=org.jooq -DartifactId=jooq-codegen-maven -DrepositoryId=$REPOSITORY -Durl=$URL -Dversion=$VERSION -Dpackaging=jar $JAVADOC_JOOQ_CODEGEN_MAVEN $SOURCES_JOOQ_CODEGEN_META -DpomFile=jOOQ-pom/jooq-codegen-maven/pom.xml
mvn deploy:deploy-file -Dfile=jOOQ-lib/jooq-scala-$VERSION.jar -DgroupId=org.jooq -DartifactId=jooq-scala -DrepositoryId=$REPOSITORY -Durl=$URL -Dversion=$VERSION -Dpackaging=jar $JAVADOC_JOOQ_SCALA $SOURCES_JOOQ_SCALA -DpomFile=jOOQ-pom/jooq-scala/pom.xml
https://stackoverflow.com/a/7623805/318054
Absolutely. Installing artefacts is always the cleanest solution for the build, but people don’t always need that solution. The system scope can be great for integration test modules, or for quick demos.
I posted the link to SO answer since it describes quite simple and clean solution using local in-project repository. This option was not mentioned in your post.
Thanks, I wasn’t aware of that feature (and must admit, didn’t thoroughly read that SO answer)