2012-04-10 82 views
2

我試圖將我的項目從Maven 2.2.1升級到Maven 3.0.4,但運行時出現依賴關係解決方案的問題。我花了整整一天的時間試圖通過查看Maven文檔和類似帖子來研究這一點,但我仍然陷入困境。這是我在stackoverflow上的第一個問題,所以希望我在這裏遵守了禮儀。謝謝你的幫助!當從Maven 2.2.1升級到Maven 3.0.4時出現DependencyResolutionException

我的項目結構如下:

pom.xml (acme-parent) 
child-alpha 
+-----> pom.xml 

另外,我有我自己的存儲庫中的下列文件:

反過來
http://maven.my-own-repo.com/acme/child-dep-jdk15/maven-metadata-local.xml 
http://maven.my-own-repo.com/acme/child-dep-jdk15/1.0/child-dep-jdk15-1.0.jar 
http://maven.my-own-repo.com/acme/child-dep-jdk15/1.0/child-dep-jdk15-1.0.pom 

孩子-α/ pom.xml中都有一個配置文件依賴於我自己的acme:child-dep-jdk15,它已被單獨構建到一個jar文件中,並具有它自己的.pom文件,該文件指定了一個與父alpha相同的父親父母。

以下是相關文件的摘錄:

極致父母的pom.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<project> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>acme</groupId> 
    <artifactId>acme-parent</artifactId> 
    <name>Acme Parent Project</name> 
    <version>1</version> 
    <packaging>pom</packaging> 

    <properties>...</properties> 

    <modules> 
     <module>child-alpha</module> 
    </modules> 

    <repositories> 
     <repository> 
      <id>acme-repo</id> 
      <url>http://maven.my-own-repo.com</url> 
     </repository> 
     <repository> 
      <id>central</id> 
      <url>http://repo1.maven.org/maven2</url> 
     </repository> 
    </repositories> 

    <pluginRepositories>...</pluginRepositories> 

    <build> 
     <plugins>...</plugins> 
    </build> 

    <dependencies>...</dependencies> 
</project> 

孩子-α的pom.xml:

<project> 
    <modelVersion>4.0.0</modelVersion> 
    <parent> 
     <groupId>acme</groupId> 
     <artifactId>acme-parent</artifactId> 
     <version>1</version> 
    </parent> 
    <artifactId>child-alpha</artifactId> 
    <name>Child Alpha Project</name> 
    <version>1.0</version> 
    <packaging>jar</packaging> 

    <scm>...</scm> 

    <properties>...</properties> 

    <build> 
     <resources>...</resources> 
     <plugins>...</plugins> 
    </build> 

    <profiles> 
     <profile> 
      <id>jdk15</id> 
      <activation> 
       <activeByDefault>true</activeByDefault> 
       <jdk>1.5</jdk> 
      </activation> 
      <dependencies> 
       <dependency> 
        <groupId>acme</groupId> 
        <artifactId>child-dep-jdk15</artifactId> 
        <version>1.0</version> 
       </dependency> 
      </dependencies> 
     </profile> 
    </profiles> 

    <dependencies>...</dependencies> 
</project> 

兒童DEP-jdk15- 1.0.pom:

<project> 
    <modelVersion>4.0.0</modelVersion> 
    <parent> 
     <groupId>acme</groupId> 
     <artifactId>acme-parent</artifactId> 
     <version>1</version> 
    </parent> 
    <groupId>acme</groupId> 
    <artifactId>child-dep-jdk15</artifactId> 
    <name>Acme Child Dependency</name> 
    <version>1.0</version> 
    <packaging>jar</packaging> 

    <build>...</build> 

    <dependencies>...</dependencies> 
</project> 

Wh恩我試圖建立兒童-α(而在孩子-α目錄),我跑以下命令:

mvn -U -e clean install 

而且我得到了以下日誌信息和堆棧跟蹤(除去多餘的消息):

Downloading: http://maven2.my-own-repo.com/acme/acme-parent/1/acme-parent-1.pom 
Downloading: http://repo1.maven.org/maven2/acme/acme-parent/1/acme-parent-1.pom 

[...] 

[ERROR] Failed to execute goal on project child-alpha: Could not resolve dependencies for project acme:child-alpha:jar:1.0: [...] 

Caused by: org.apache.maven.project.DependencyResolutionException: Could not resolve dependencies for project acme:child-alpha:jar:1.0: [...] 

Caused by: org.sonatype.aether.collection.DependencyCollectionException: Failed to collect dependencies for [...] 
    at org.sonatype.aether.impl.internal.DefaultDependencyCollector.collectDependencies(DefaultDependencyCollector.java:258) 
    at org.sonatype.aether.impl.internal.DefaultRepositorySystem.collectDependencies(DefaultRepositorySystem.java:308) 
    at org.apache.maven.project.DefaultProjectDependenciesResolver.resolve(DefaultProjectDependenciesResolver.java:150) 
    ... 23 more 
Caused by: org.sonatype.aether.resolution.ArtifactDescriptorException: Failed to read artifact descriptor for acme:child-dep-jdk15:jar:1.0 
    at org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.loadPom(DefaultArtifactDescriptorReader.java:331) 
    at org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.readArtifactDescriptor(DefaultArtifactDescriptorReader.java:186) 
    at org.sonatype.aether.impl.internal.DefaultDependencyCollector.process(DefaultDependencyCollector.java:412) 
    at org.sonatype.aether.impl.internal.DefaultDependencyCollector.collectDependencies(DefaultDependencyCollector.java:240) 
    ... 25 more 
Caused by: org.apache.maven.model.resolution.UnresolvableModelException: Could not find artifact acme:acme-parent:pom:1 in acme-repo (http://maven.my-own-repo.com) 
    at org.apache.maven.repository.internal.DefaultModelResolver.resolveModel(DefaultModelResolver.java:126) 
    at org.apache.maven.model.building.DefaultModelBuilder.readParentExternally(DefaultModelBuilder.java:813) 
    at org.apache.maven.model.building.DefaultModelBuilder.readParent(DefaultModelBuilder.java:664) 
    at org.apache.maven.model.building.DefaultModelBuilder.build(DefaultModelBuilder.java:310) 
    at org.apache.maven.model.building.DefaultModelBuilder.build(DefaultModelBuilder.java:232) 
    at org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.loadPom(DefaultArtifactDescriptorReader.java:322) 
    ... 28 more 
Caused by: org.sonatype.aether.resolution.ArtifactResolutionException: Could not find artifact acme:acme-parent:pom:1 in acme-repo (http://maven.my-own-repo.com) 
    at org.sonatype.aether.impl.internal.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:538) 
    at org.sonatype.aether.impl.internal.DefaultArtifactResolver.resolveArtifacts(DefaultArtifactResolver.java:216) 
    at org.sonatype.aether.impl.internal.DefaultArtifactResolver.resolveArtifact(DefaultArtifactResolver.java:193) 
    at org.apache.maven.repository.internal.DefaultModelResolver.resolveModel(DefaultModelResolver.java:122) 
    ... 33 more 
Caused by: org.sonatype.aether.transfer.ArtifactNotFoundException: Could not find artifact acme:acme-parent:pom:1 in acme-repo (http://maven.my-own-repo.com) 
    at org.sonatype.aether.connector.wagon.WagonRepositoryConnector$4.wrap(WagonRepositoryConnector.java:947) 
    at org.sonatype.aether.connector.wagon.WagonRepositoryConnector$4.wrap(WagonRepositoryConnector.java:941) 
    at org.sonatype.aether.connector.wagon.WagonRepositoryConnector$GetTask.run(WagonRepositoryConnector.java:669) 
    at org.sonatype.aether.util.concurrency.RunnableErrorForwarder$1.run(RunnableErrorForwarder.java:60) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:680) 

雖然使用Maven 2,我從來沒有需要在以下位置極致父母的pom.xml: http://maven2.my-own-repo.com/acme/acme-parent/1/acme-parent-1.pom

我們沒有我們自己的回購父pom.xml的原因是爲我們在創建版本時使用了一個腳本在控制分支上,根據我們所在的分支在acme-parent pom.xml中更改一些值,因此將pom.xml放入回購並將其正確更新爲我們所有的不同分支試圖與我們的持續集成服務器同時構建。

在Maven 2中,當進行child-alpha構建時,Maven將無法找到acme-parent pom.xml的一個目錄,即相對路徑爲../pom.xml,因此它永遠不會嘗試去我的倉庫找到它。在我的本地簽出只有父pom.xml,並沒有它在回購在Maven 2中工作正常。

但是,當我嘗試在Maven 3.0.4下構建child-alpha時,發生上述異常。起初,我認爲我需要在child-alpha的pom.xml頂部的標籤中顯式設置relativePath,但這並沒有解決它 - 並且acme-parent的pom.xml確實已經在默認的relativePath中../pom.xml,所以不需要明確地設置它。

然後,我嘗試在child-alpha的pom.xml部分中註釋child-dep-jdk15依賴項。這個依賴關係被註釋掉了,子alpha-maven構建成功完成。

我不明白爲什麼child-alpha在child-dep-jdk15依賴項到位時不會在Maven 3中生成。如果Maven最初能夠正確地找到最初的acme-parent pom.xml(爲每個頂部的塊),爲什麼它現在試圖在處理child-dep-jdk15依賴項時從repos下載它?我是否配置了錯誤的東西,如果有,我該如何解決?

另一件事:如果我首先在與acme-parent的pom.xml相同的目錄中運行mvn -N install,然後嘗試構建child-alpha,那麼即使保留依賴項child-dep-代碼中的jdk15。運行該命令後,我可以驗證acme-parent-1.pom是否位於本地.m2目錄中。雖然這種解決方法對於單個開發人員可能沒有問題,但對於持續集成服務器來說,這會是一個問題,因爲它需要能夠爲不同分支運行併發構建。

由於上面提到的版本控制分支更改,我強烈希望不必重新配置我的存儲庫以承載acme-parent pom.xml。

+0

'http://maven.my-own-repo ...'和'下載:http://maven2.my-own-repo ...'。你有兩套或回購? – 2013-04-16 06:38:27

回答

0

在Maven 3中,如果您剛下載失敗並已修復它(例如通過將jar上傳到存儲庫),它將緩存失敗。要強制刷新,請在命令行中添加-U

由於其他可能的原因DependencyResolutionException請參閱Maven Confluence