添加本地外部jar-不应指向项目目录中的文件

时间:2019-03-15 13:04:52

标签: maven

在我的maven项目中,我使用如下所示的自定义外部my-custom-external jar:

pom.xml

<dependencies>
    <dependency>
        <groupId>com.myproject</groupId>
        <artifactId>my-custom-external</artifactId>
        <version>1.0-SNAPSHOT</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/libs/my-custom-external-1.0-SNAPSHOT.jar</systemPath>
    </dependency>
    <dependency>
        <groupId>org.jetbrains.kotlin</groupId>
        <artifactId>kotlin-stdlib-jdk8</artifactId>
        <version>${kotlin.version}</version>
    </dependency>

我成功构建了mvn verify项目,但在控制台中我发出了警告:

[INFO] Scanning for projects...
[WARNING] 
[WARNING] Some problems were encountered while building the effective model for com.myproject:prj_1:jar:1.0-SNAPSHOT
[WARNING] 'dependencies.dependency.systemPath' for com.myproject:my-custom-extneral:jar should not point at files within the project directory, ${project.basedir}/libs/my-custom-extneral-1.0-SNAPSHOT.jar will be unresolvable by dependent projects @ line 62, column 25
[WARNING] 
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING] 
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING] 

3 个答案:

答案 0 :(得分:3)

我来到这里是因为我遇到了类似的问题。基于 this answer by Prasann,我认为我有一个可行的解决方案,可以解决大多数问题。如果我错了,请随时纠正我。

CheckSum 相关步骤的功劳:Casey Jordan

  1. 在开发过程中,安装本地外部 jar。

    为此,请运行以下命令

    mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> -DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=jar -DcreateChecksum=true

    <> 中的字段(包括 <>)需要替换为实际值。

  2. 重命名生成的 maven-metadata-local 文件以删除 local 部分。

  3. 将这个 jar 文件的整个文件夹(我称之为安装文件夹)从您的本地 Maven 存储库复制到您项目的 {{1} } 文件夹。您需要从 Maven 存储库的根目录维护文件夹结构。

    例如,如果您安装文件夹的绝对路径是lib,那么您的项目lib文件夹也应该看起来像C:\Users\so_user\.m2\repository\my_group_id\my_artifact_id\

    还要注意的是,

    • ${project.basedir}\lib\my_group_id\my_artifact_id\ 在这一点上与第 2 点中的 my_group_id 相同。只需将任何句点 (.) 替换为斜杠 (\)。

    • <group-id> 在这一点上与第 2 点中的 my_artifact_id 相同。对此无需更改。

  4. 在您的 <artifact-id> 文件中,通过添加以下几行来创建本地存储库:

    pom.xml
    • 您可以为 <repositories> <repository> <id>any_name</id> <name>Any Name</name> <url>file://[path-to-lib-folder]</url> </repository> </repositories> id 选择任何名称。
    • name 替换为实际文件夹路径。您可以在此处使用 [path-to-lib-folder]${project.basedir}。不会弹出警告。
  5. 像往常一样向外部 jar 添加依赖项。

    ${pom.basedir}

    用点 #1 的实际值替换 <dependencies> <dependency> <groupId>[group-id]</groupId> <artifactId>[artifact-id]</artifactId> <version>[version]</version> </dependency> </dependencies> [group-id][artifact-id]

因为您在项目 [version] 文件夹中提供了整个安装文件夹,所以当您将此项目转移到新系统时,无需再次运行 lib

答案 1 :(得分:2)

这只是一个警告,您可以这样做,只要它仅在该项目中使用,因为从属项目将看不到它。

您可以考虑以下两种选择来正确完成操作

  1. 将第3方jar安装到本地存储库,并像引用其他任何依赖项一样引用它。有关安装库的更多详细信息,请参见this link
  2. 如果要从项目中引用它,请如下所示将项目libs文件夹添加为存储库

    <repositories>
        <repository>
            <id>localrepository</id>
            <url>file://${project.basedir}/libs</url>
        </repository>
        .
        .
        .
        .
    </repositories>
    

希望这会有所帮助

答案 2 :(得分:-1)

您可以使用$ {pom.basedir}代替$ {project.basedir}