Maven:包括在公共存储库中找不到的jar

时间:2009-08-31 02:24:46

标签: maven-2 dependencies pom.xml

如果我要使用不在maven公共存储库中的第三方库,那么将它作为项目的依赖项包含在内的最佳方法是什么,以便当其他人签出我的代码时它仍然可以构建?

我的应用程序“A”依赖于公共存储库中不存在的jar“B”。但是,我希望将“B”添加为对“A”的依赖,这样当世界另一端的人可以查看代码并仍能构建“A”时

6 个答案:

答案 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 packagemvn deploy

来打包或部署项目

第三方罐子也将包含在包中。

答案 4 :(得分:0)

如果您正在使用groovy / grail工具套件( GGTS ),那么您可以使用以下步骤直接导入该第三方依赖项(但请确保您在本地存储库中具有该第三方依赖项):

  1. 转到Project Explorer并右键单击项目。
  2. 点击导入选项。
  3. 使用 maven 选项并选择安装或部署 工件到maven存储库,然后单击“下一步”。
  4. 使用工件文件浏览并选择第三方依赖项 选项并输入组ID,工件ID和版本的详细信息 使用 POM.xml 文件,然后点击完成
  5. 等一下,可能会出现错误。

答案 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文件打包在一起。