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

a_s*_*ber 6 maven

在我的 Maven 项目中,我使用这样的自定义外部my-custom-externaljar:

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>
Run Code Online (Sandbox Code Playgroud)

我成功构建了我的项目,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] 
Run Code Online (Sandbox Code Playgroud)

小智 22

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


Gai*_*inD 8

我到达这里是因为我遇到了类似的问题。根据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 存储库复制到项目的lib文件夹中。您需要维护 Maven 存储库根目录的文件夹结构。

    例如,如果您安装的文件夹的绝对路径是C:\Users\so_user\.m2\repository\my_group_id\my_artifact_id\,那么您的项目 lib 文件夹也应该类似于${project.basedir}\lib\my_group_id\my_artifact_id\

    另请注意,

    • my_group_id<group-id>这一点与#2 中的相同。只需将任何句点 (.) 替换为斜杠 (\)。

    • my_artifact_id<artifact-id>这一点与#2 中的相同。为此无需进行任何更改。

  4. 在您的pom.xml文件中,通过添加以下行来创建本地存储库:

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

    <dependencies>
       <dependency>
          <groupId>[group-id]</groupId>
          <artifactId>[artifact-id]</artifactId>
          <version>[version]</version>
       </dependency>
    </dependencies>
    
    Run Code Online (Sandbox Code Playgroud)

    [group-id],[artifact-id]和替换[version]为第 1 点的实际值。

由于您已在项目文件夹中提供了整个已安装的文件夹,因此当您将此项目转移到新系统时lib无需再次运行。mvn install:install-file


Pra*_*ann 6

这只是一个警告,你可以这样做,只要它只在这个项目中使用,因为它对依赖项目不可见。

您可以考虑以下两个选项以正确执行此操作

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

    <repositories>
        <repository>
            <id>localrepository</id>
            <url>file://${project.basedir}/libs</url>
        </repository>
        .
        .
        .
        .
    </repositories>
    
    Run Code Online (Sandbox Code Playgroud)

希望这可以帮助