【问题标题】:Add local external jar - should not point at files within the project directory添加本地外部 jar - 不应指向项目目录中的文件
【发布时间】:2019-03-15 13:04:52
【问题描述】:

在我的 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] 

【问题讨论】:

  • 我会尽量避免 systemPath 依赖。

标签: maven


【解决方案1】:

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

【讨论】:

【解决方案2】:

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

您可以考虑以下两种正确方法

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

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

希望对你有帮助

【讨论】:

  • 第二种方法没有帮助。同样的警告。
  • 这很奇怪,您是否删除了systemPath 属性?第一个选项是理想的
  • 如果我删除 ${project.basedir}/libs/my-custom-external-1.0-SNAPSHOT.jar 然后我得到错误:[警告] com.myproject:my-custom-external:jar:1.0-SNAPSHOT 的 POM 丢失,没有可用的依赖信息从 localrepository 下载:file:xxx
  • 您是否将libs 文件夹添加为repository
  • 不确定为什么将 lib 文件夹添加为本地存储库对您不起作用,但很高兴第一种方法解决了它
【解决方案3】:

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

CheckSum 相关步骤的功劳:Casey Jordan

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

    为此,请运行以下命令

    mvn install:install-file -Dfile=&lt;path-to-file&gt; -DgroupId=&lt;group-id&gt; -DartifactId=&lt;artifact-id&gt; -Dversion=&lt;version&gt; -Dpackaging=jar -DcreateChecksum=true

    &lt;&gt;(包括&lt;&gt;)内的字段需要替换为实际值。

  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 在这一点上与 &lt;group-id&gt; 在点 #2 相同。只需将任何句点 (.) 替换为斜线 (\)。

    • my_artifact_id 在这一点上与 &lt;artifact-id&gt; 在点 #2 相同。无需对此进行任何更改。

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

    <repositories>
       <repository>
          <id>any_name</id>
          <name>Any Name</name>
          <url>file://[path-to-lib-folder]</url>
       </repository>
    </repositories>
    
    • 您可以为idname 选择任何名称。
    • [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>
    

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    • 2012-01-22
    • 2011-01-23
    • 2012-05-03
    相关资源
    最近更新 更多