如果我要使用不在maven公共存储库中的第三方库,那么将它作为项目的依赖项包含在内的最佳方法是什么,以便当其他人签出我的代码时它仍然可以构建?
即
我的应用程序“A”依赖于公共存储库中不存在的jar“B”。但是,我希望将“B”添加为对“A”的依赖,这样当世界另一端的人可以查看代码并仍能构建“A”时
答案 0 :(得分:60)
您可以自己安装项目。
或者您可以使用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}
属性,该属性绑定到项目的根目录。
答案 1 :(得分:16)
如果您的父项目具有处于这种情况的模块(需要不在存储库中的依赖项),您可以设置您的父项目以使用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中设置groupid,artifact等的方式引用它。例如:
<dependency>
<groupId>net.authorize</groupId>
<artifactId>anet-java-sdk</artifactId>
<version>1.4.6</version>
</dependency>
答案 2 :(得分:15)
使用系统范围可能有效,但即使在Maven规范中也不建议使用。 它不便携。
来自Maven的书:
system-系统范围与您提供的类似 必须提供 本地文件系统上JAR的显式路径。这是为了允许编译 对可能属于系统库的本机对象。假设工件 永远可用,不在存储库中查找。如果您将范围声明为 在系统中,您还必须提供systemPath元素。请注意,此范围不是 建议(您应该总是尝试在公共或自定义Maven中引用依赖项 库)。
最好的方法是安装到本地存储库或企业存储库,以便所有对等方都可以访问。
如果您使用的是Nexus等存储库管理器,这非常容易。
答案 3 :(得分:1)
一般来说,您应该先将第三方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
第三方罐子也将包含在包中。
答案 4 :(得分:0)
如果您正在使用groovy / grail工具套件( GGTS ),那么您可以使用以下步骤直接导入该第三方依赖项(但请确保您在本地存储库中具有该第三方依赖项):
等一下,可能会出现错误。
答案 5 :(得分:0)
此解决方案对我有效; 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>
这生成了一个新的jar文件,其中的pom文件位于local-maven-repo内部,我能够像这样的依赖项将其包含在我的项目中;
<dependency>
<groupId>somegroupid</groupId>
<artifactId>someartifact</artifactId>
<version>1.0.0</version>
</dependency>
然后mvn package
确保解决了我的项目依赖项并将其与我的war文件打包在一起。