Maven> 3.04在错误的地方寻找本地存储库

时间:2014-12-11 16:19:48

标签: maven repository maven-3

我目前正在开发一个较旧的Java项目,我们需要使用当前的maven构建,理想情况下为3.1或更高版本。

该项目需要通过Maven Central无法使用的Oracle库版本,因此我们为其创建了一个本地存储库。这在使用maven 3.0.4的同事的机器上工作正常,但更高版本报告以下错误:

[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] maventest ......................................... SUCCESS [0.008s]
[INFO] maventest-core .................................... FAILURE [0.288s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.442s
[INFO] Finished at: Thu Dec 11 17:01:48 CET 2014
[INFO] Final Memory: 6M/150M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal on project maventest-core: Could not resolve dependencies for project tld.org.maventest:maventest-core:jar:0.1.6-SNAPSHOT: Could not find artifact com.oracle:oracle:jar:10.2.0.2.0 in maventest.local (file:/home/jstarek/src/maventest/maventest-core/repository) -> [Help 1]enter code here

我想了解为什么maven搜索~/src/maventest/maventest-core/repository。存储库实际上位于~/src/maventest/repository以上的一级。从“maventest”的构建成功可以看出,在该顶级,存储库被解析为正确的目录,并找到该文件。但是下降到maventest-core,它假定存储库位置错误。

这是项目目录层次结构的草图:

maventest/
├── maventest.properties
├── maventest-core
│   ├── pom.xml
│   └── src
│       ├── ...
│
├── pom.xml
├── repository
│   └── com
│       └── oracle
│           ├── ojdbc14
│           │   ├── 10.2.0.2.0
│           │   │   ├── ojdbc14-10.2.0.2.0.pom
│           │   │   └── ojdbc14-10.2.0.2.0.pom.sha1
│           │   ├── 10.2.0.3.0
│           │   │   ├── ojdbc14-10.2.0.3.0.pom
│           │   │   └── ojdbc14-10.2.0.3.0.pom.sha1
│           │   └── 10.2.0.4.0
│           │       ├── ojdbc14-10.2.0.4.0.pom
│           │       └── ojdbc14-10.2.0.4.0.pom.sha1
│           └── oracle
│               ├── 10.2.0.2.0
│               │   ├── oracle-10.2.0.2.0.jar.lastUpdated
│               │   ├── oracle-10.2.0.2.0.pom
│               │   └── oracle-10.2.0.2.0.pom.lastUpdated
│               └── maven-metadata-local.xml

依赖关系在maventest / pom.xml中指定,如下所示:

<repositories>
  <repository>
    <id>maventest.local</id>
    <name>maventest</name>
    <url>file:${project.basedir}/repository</url>
  </repository>
</repositories>

<dependencyManagement>
  <dependencies>
    <dependency>
      ....
    </dependency>
    <dependency>
      <groupId>com.oracle</groupId>
      <artifactId>oracle</artifactId>
      <version>10.2.0.2.0</version>
    </dependency>
  </dependencies>
</dependencyManagement>

...更深层次,在maventest / maventest-core / pom.xml,如下:

<dependencies>
  <dependency>
    <groupId>com.oracle</groupId>
    <artifactId>oracle</artifactId>
  </dependency>
</dependencies>

看起来${project.basedir}几乎不同......任何想法?发生了什么,以及3.0.4及更高版本之间的这种行为是如何变化的?

2 个答案:

答案 0 :(得分:2)

${project.basedir}是一个maven预定义属性,它总是引用当前模块/项目的基本路径,即相对URL而不是绝对未更改的URL。 要解决此问题,我建议使用以下任一方法:

  • 我建议将绝对目录路径指定为存储库URL,以便父模块和子模块使用相同的未更改路径:
<repositories>
  <repository>
    <id>maventest.local</id>
    <name>maventest</name>
    <url>file://absolute/path/to/repository</url>
  </repository>
</repositories>
  • 否则,如果您坚持避免使用绝对路径,则可以使用将存储库指向自定义属性,例如: ${test.repository.url}将在每个模块级别进行更改,以使路径相对位于根父项目路径下:

父工件

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

      <modelVersion>4.0.0</modelVersion>
      <groupId>tld.org.maventest</groupId>
      <artifactId>maventest</artifactId>
      <version>0.1.6-SNAPSHOT</version>

      <repositories>
        <repository>
          <id>maventest.local</id>
          <name>maventest</name>
          <url>file:${test.repository.url}</url>
        </repository>
      </repositories>

      <properties>
        <test.repository.url>${project.basedir}/repository</test.repository.url>
      </properties>
    </project>

子模块

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

      <modelVersion>4.0.0</modelVersion>    
      <parent>
        <groupId>tld.org.maventest</groupId>
        <artifactId>maventest</artifactId>
        <version>0.1.6-SNAPSHOT</version>
      </parent>

      <groupId>tld.org.maventest</groupId>
      <artifactId>maventest-core</artifactId>

      <properties>
        <test.repository.url>${project.basedir}/../repository</test.repository.url>
      </properties>
    </project>

答案 1 :(得分:0)

简单的回答是开始使用repository manager并在那里安装这些工件,之后您可以像使用通常的依赖关系一样使用这些工件而不会有任何麻烦。其他方面需要更多维护,因为真正需要比你想要的更令人头痛。