maven将第三方依赖
根据ZeroTurnaround的RebelLabs最近进行的一项调查 ,Maven仍然是领先的Java构建平台。 根据RebelLabs,当前的市场份额分布是:
- Maven的64%
- 蚂蚁+常春藤与16.5%
- Gradle与11%
但是,与此同时,Maven经常因其晦涩和干扰而受到批评。 与亚军Ant和Gradle相比,Maven在解释和自定义适应构建模型方面仅具有很小的灵活性。 就像Data Stax的Tim Berglund所说的那样:
但是,让我们开个玩笑,看看一个现实世界中的问题:
整合第三方商业物品
Maven Central并非免费提供您要依赖的所有第三方人工制品。 商业JDBC驱动程序或商业jOOQ版本就是这样的例子。 基本上有三种方法可以将这些伪像集成到您的构建中:
快速而肮脏
通常,您只需要对小型测试项目或演示具有商业依赖性。 您想确保它在运行时可以正常运行,而不必依赖于本地存储库设置或网络连接。 这是<scope>system</scope>
的好用例:
例如: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>
例如:Microsoft SQL JDBC
<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>
这种方法的优点
当您要拥有一个本地的,自包含的模块,该模块可以保证在从源代码管理中检出后立即运行,而无需进行额外的配置和设置,这确实是一个非常简单的解决方案。 当然,不要忘记先将库签入源代码管理。
这种方法的缺点
系统依赖项永远不会传递。 如果您的模块以这种方式依赖jOOQ,则模块的依赖项将看不到jOOQ API。
有关系统依赖性的详细信息,请参见Maven文档 。 从文档中引用:
与作用域系统的依赖关系始终可用,不会在存储库中查找。 它们通常用于告知Maven JDK或VM提供的依赖项。 因此,系统依赖关系对于解决对JDK现在提供的工件的依赖关系特别有用,但以前可以单独下载获得。 典型示例是JDBC标准扩展或Java身份验证和授权服务(JAAS)。
更加坚固
一种看起来更健壮的方法是从版本控制系统中检查依赖性,然后“手动”将其导入本地存储库。 这将使它们可用于您自己的本地版本。 以下Shell脚本显示了如何将jOOQ工件导入本地存储库中
Windows批处理
@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
Linux Shell
#!/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
上面的脚本实际上检查发行版中是否有Javadoc,Sources和/或Binaries,然后安装:
- 父pom.xml
- 各种工件二进制文件,源文件,javadocs和pom.xml文件
这种方法的优点
现在可以像引用任何其他类型的依赖项一样引用依赖项,因为人工制品已在本地存储库中注册。 此外,它们还可以传递给模块自己的依赖项,这些依赖关系可以传递-这可能是您在使用jOOQ时想要的。 然后,您将指定相关性:
<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>
这种方法的缺点
依赖项的安装涉及一个手动步骤。 如果您没有上述可用的脚本,那么弄清楚如何逐步将所有这些依赖项导入到您的存储库中可能会很麻烦。 特别是,如果您正在运行演示或原型,则可能在最坏的情况下导致意外的编译失败。
要走的路
显然,在实际的项目设置中,以上两种方法都不足够,并且您可能会将库导入本地Nexus或Bintray或正在使用的任何存储库中。 只是要注意商业交付物可能对分销的潜在限制。
在此处可以找到有关如何将人工制品安装到Nexus的小教程 。
maven将第三方依赖