【发布时间】:2010-11-24 05:48:23
【问题描述】:
如果我要使用不在 maven 公共存储库中的 3rd 方库,将它作为我的项目的依赖项包含在内的最佳方法是什么,以便当其他人检查我的代码时它仍然能够构建?
即
我的应用程序“A”依赖于公共存储库中不存在的 jar “B”。但是,我希望将“B”添加为“A”的依赖项,这样当世界另一端的人可以检查代码并仍然能够构建“A”时
【问题讨论】:
标签: maven-2 dependencies pom.xml
如果我要使用不在 maven 公共存储库中的 3rd 方库,将它作为我的项目的依赖项包含在内的最佳方法是什么,以便当其他人检查我的代码时它仍然能够构建?
即
我的应用程序“A”依赖于公共存储库中不存在的 jar “B”。但是,我希望将“B”添加为“A”的依赖项,这样当世界另一端的人可以检查代码并仍然能够构建“A”时
【问题讨论】:
标签: maven-2 dependencies pom.xml
您可以自己安装项目。
或者您可以使用system 范围,如下所示:
<dependency>
<groupId>org.group.project</groupId>
<artifactId>Project</artifactId>
<version>1.0.0</version>
<scope>system</scope>
<systemPath>${basedir}/lib/project-1.0.0.jar</systemPath>
</dependency>
systemPath 需要项目的绝对路径。为方便起见,如果 jar 文件位于存储库/项目中,您可以使用绑定到项目根目录的 ${basedir} 属性。
【讨论】:
如果您的父项目带有处于这种情况的模块(需要不在存储库中的依赖项),您可以设置您的父项目以使用 exec-maven-plugin 插件来自动安装您的依赖文件。例如,我必须使用 authorize.net jar 文件来执行此操作,因为它不是公开可用的。
父 POM:
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<inherited>false</inherited>
<executions>
<execution>
<id>install-anet</id>
<phase>validate</phase>
<goals>
<goal>exec</goal>
</goals>
</execution>
</executions>
<configuration>
<executable>mvn</executable>
<arguments>
<argument>install:install-file</argument>
<argument>-Dfile=service/lib/anet-java-sdk-1.4.6.jar</argument>
<argument>-DgroupId=net.authorize</argument>
<argument>-DartifactId=anet-java-sdk</argument>
<argument>-Dversion=1.4.6</argument>
<argument>-Dpackaging=jar</argument>
</arguments>
</configuration>
</plugin>
</plugins>
</build>
在上面的例子中,jar 的位置在“service”模块的 lib 文件夹中。
当服务模块进入验证阶段时,jar 将在本地存储库中可用。只需按照您在父 pom.xml 中设置 groupid、artifact 等的方式引用它。例如:
<dependency>
<groupId>net.authorize</groupId>
<artifactId>anet-java-sdk</artifactId>
<version>1.4.6</version>
</dependency>
【讨论】:
install 之前将依赖项包含在您的 pom 中,那么它会尝试在插件启动之前收集和解决依赖项有机会安装第三方 jar,因此构建失败。 II 删除第三方依赖声明,运行install,然后jar被安装到我的本地存储库,我可以将jar声明添加回pom,然后构建成功。
使用系统范围可能有效,但即使在 Maven 规范中也不建议这样做。 它不是便携式的。
来自 Maven 书:
system- 系统范围与提供的类似,不同之处在于您 必须提供一个 本地文件系统上 JAR 的显式路径。这是为了允许编译 针对可能是系统库一部分的本机对象。假设工件 始终可用并且不在存储库中查找。如果您声明范围为 是系统,您还必须提供 systemPath 元素。请注意,此范围不是 推荐(您应该始终尝试在公共或自定义 Maven 中引用依赖项 存储库)。
最好的方法是安装到您的本地存储库或企业存储库,以便您的所有同行都可以访问。
如果您使用的是 Nexus 等存储库管理器,这非常容易。
【讨论】:
一般来说,您应该首先将 3rd 方 jar 放入您的本地存储库。之后,您可以通过将依赖项添加到 pom.xml 中来使用它。
例如。
1.先将jar放入本地仓库:
mvn install:install-file -Dfile=<path-to-file>
注意:此命令需要 maven-install-plugin 2.5 或更高版本。如果没有,可以参考Here
2.通过将依赖项添加到项目的 pom.xml 中来使用 jar。
只需将其添加到项目的 pom.xml 中即可:
<dependency>
<groupId>${the groupId in the jar's pom.xml}</groupId>
<artifactId>${the artifactId in the jar's pom.xml}</artifactId>
<version>${the version in the jar's pom.xml}</version>
</dependency>
3.然后您可以通过运行mvn package 或mvn deploy 来打包或部署您的项目
第 3 方 jar 也将包含在包中。
【讨论】:
mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> -DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>
这个解决方案对我有用; 1.在我项目的根目录中创建了一个local-maven-repo,并将我所有的jar都复制到了 2. 执行以下命令,为我需要使用的每个 jar 生成必要的 pom 文件和元数据等;
mvn deploy:deploy-file -DgroupId=<somegroupid> -DartifactId=<someartifact> -Dversion=1.0.0 -Durl=file:./local-maven-repo/ -DrepositoryId=local-maven-repo -DupdateReleaseInfo=true -Dfile=<path to jar file>
这在 local-maven-repo 中生成了一个带有 pom 文件的新 jar 文件,我能够像这样将其作为依赖项包含到我的项目中;
<dependency>
<groupId>somegroupid</groupId>
<artifactId>someartifact</artifactId>
<version>1.0.0</version>
</dependency>
然后mvn package 确保我的项目依赖项已解决并与我的war文件打包。
【讨论】:
如果您使用的是 groovy/grail 工具套件 (GGTS),那么您可以使用以下步骤直接导入该第三方依赖项(但请确保您的本地存储库中有该第三方依赖项):
稍等片刻,这个问题可能会出错。
【讨论】: