2011-10-14 109 views
10

我有多模塊maven項目。當我嘗試構建網站時,例如在父項目上執行maven site,它無法解決依賴關係到其中一個模塊。 但是,如果我只編譯(mvn clean compile父項目)它或運行測試(父項目mvn clean test)沒有依賴性問題。maven無法解決依賴關係

什麼會導致此類行爲?

UPD

Maven版本

Apache Maven 3.0.2 (r1056850; 2011-01-09 02:58:10+0200) 
Java version: 1.6.0_26, vendor: Sun Microsystems Inc. 
Java home: c:\Program Files\Java\jdk1.6.0_26\jre 
Default locale: en_US, platform encoding: Cp1252 
OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows" 

Maven的網站插件版本

[DEBUG] Included: org.apache.maven.plugins:maven-site-plugin:jar:2.0.1 

錯誤消息

[ERROR] Failed to execute goal on project myproj-client: Could not resolve dependencies for project mycompany.myproj:myproj-client:jar:0.0.1-SNAPSHOT: Could not find artifact mycompany.myproj:myproj-common:jar:0.0.1-SNAPSHOT -> [Help 1] 
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal on project myproj-client: Could not resolve dependencies for project mycompany.myproj:myproj-client:jar:0.0.1-SNAPSHOT: Could not find artifact mycompany.myproj:myproj-common:jar:0.0.1-SNAPSHOT 
    at org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.getDependencies(LifecycleDependencyResolver.java:190) 
    at org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.resolveProjectDependencies(LifecycleDependencyResolver.java:104) 
    at org.apache.maven.lifecycle.internal.MojoExecutor.ensureDependenciesAreResolved(MojoExecutor.java:258) 
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:201) 
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153) 
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) 
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84) 
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59) 
    at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183) 
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161) 
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:319) 
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156) 
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:534) 
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196) 
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:141) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352) 
Caused by: org.apache.maven.project.DependencyResolutionException: Could not resolve dependencies for project mycompany.myproj:myproj-client:jar:0.0.1-SNAPSHOT: Could not find artifact mycompany.myproj:myproj-common:jar:0.0.1-SNAPSHOT 
    at org.apache.maven.project.DefaultProjectDependenciesResolver.resolve(DefaultProjectDependenciesResolver.java:156) 
    at org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.getDependencies(LifecycleDependencyResolver.java:165) 
    ... 22 more 
Caused by: org.sonatype.aether.resolution.ArtifactResolutionException: Could not find artifact mycompany.myproj:myproj-common:jar:0.0.1-SNAPSHOT 
    at org.sonatype.aether.impl.internal.DefaultArtifactResolver.resolveArtifacts(DefaultArtifactResolver.java:526) 
    at org.sonatype.aether.impl.internal.DefaultRepositorySystem.resolveArtifacts(DefaultRepositorySystem.java:304) 
    at org.sonatype.aether.impl.internal.DefaultRepositorySystem.resolveDependencies(DefaultRepositorySystem.java:334) 
    at org.apache.maven.project.DefaultProjectDependenciesResolver.resolve(DefaultProjectDependenciesResolver.java:150) 
    ... 23 more 
Caused by: org.sonatype.aether.transfer.ArtifactNotFoundException: Could not find artifact mycompany.myproj:myproj-common:jar:0.0.1-SNAPSHOT 
    at org.sonatype.aether.impl.internal.DefaultArtifactResolver.resolveArtifacts(DefaultArtifactResolver.java:517) 
    ... 26 more 
[ERROR] 
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles: 
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/DependencyResolutionException 
[ERROR] 
[ERROR] After correcting the problems, you can resume the build with the command 
[ERROR] mvn <goals> -rf :myproj-client 
+0

什麼行家的版本和網站插件的是什麼版本? – jtahlborn

+0

@jtahlborn,用maven版本更新了問題。沒有在pom文件中明確定義的站點插件。 –

+0

如果你用-X參數運行mvn,它會吐出大量的信息。這應該使你能夠確定你正在使用的各種庫的版本。 – jtahlborn

回答

-2

來自Apache website

網站:使用網站爲單個項目生成網站。請注意,多模塊構建中的模塊站點之間的鏈接將不起作用。

+0

你對這意味着什麼感到困惑。這意味着,如果您加載生成子模塊頁面到Web瀏覽器,模塊間的聯繫將被打破。您需要登臺或部署該網站以使其進入正確的結構,以便鏈接正常工作。 – jtahlborn

+0

@jtahlborn,但現在的問題是不是與聯繫,它與依賴:( –

+0

@mishanesterenko - 是的,我明白你的要求,我在回答這個答案,這是不正確的 – jtahlborn

0

它看起來像maven正在尋找myproj-common:jar:0.0.1-SNAPSHOT在存儲庫中。

失敗的原因可能是: maven無法訪問存儲庫中的快照構件。

要啓用快照文物:

請檢查您的pom.xml爲快照下的庫部分標籤。

<repository> 
    <name>xyz</name> 
    <id>repoid</id> 
    <url>http://x.y.z</url> 
    <releases> 
     <enabled>true</enabled> 
    </releases> 
    <snapshots> 
     <enabled>true</enabled> 
    </snapshots> 
</repository> 
+0

OP表示,正常編譯作品很好,所以我懷疑這是個問題。 – jtahlborn

3

這可能是該網站的插件沒有進入反應堆,因而沒有看到該項目神器在你的項目源可用的問題。 (這僅僅是一種假設,也許MSITE-302支持。)

嘗試運行第一mvn install,它安裝您的工件在本地資源庫中,然後運行mvn site

有關反應器的更多信息,請嘗試:

+0

是否有必要安裝運行各子工程? – gfan

1

嘿,出於某種原因,當我作了一些修改模塊和父POM文件,問題消失了。我不知道到底做了什麼,但目前父母項目上的mvn site正常工作。不幸的是,我沒有時間調查問題的根源。但似乎將網站版本更改爲3.0使我走上了正確的道路。我也可以通過以下方式執行網站(在修復之前)mvn compile site,在這種情況下,它可以找到依賴關係。

+0

因此是Maven的智慧 – Totoro

13

我有同樣的問題。我沒有深入研究Maven的源代碼。但這是我的觀察。

假設你從來沒有mvn install的Myproj常見在你的本地庫,沒有它部署到任何遠程倉庫。當您在父項目運行mvn clean site,事情發生是這樣的:

  1. 行家決定之前 的Myproj客戶端根據自己的依賴關係
  2. mvn clean site運行上的的Myproj常見順序myproj-common。以前的所有結果都在myproj-common/target被刪除,並且myproj-common/target/site是 生成的。 (請注意,此步驟之後,既不是編譯的類,也沒有包裝罐在的Myproj共用/靶存在)
  3. mvn clean site的Myproj客戶端上運行。 Maven的首先檢查這個項目的 依賴,並試圖找出的Myproj常見的 神器(類或jar)在這些地方:(一)的Myproj常見/目標(B)的本地存儲庫(3)遠程存儲庫。
  4. mvn site失敗的Myproj客戶端上,因爲它不能找到的Myproj常見

這就解釋了爲什麼mvn clean compile sitemvn clean package site作品的神器。他們都準備myproj-common工件在其目標目錄mvn site運行之前myproj客戶端

mvn install其次是mvn site作品也。

一個特殊的例外是,如果你在報告中加入了像emma-maven-plugin這樣的東西,它會自動編譯和儀器類。在這種情況下,mvn clean site總是有效。

我不確定爲什麼Maven試圖在步驟3中找到myproj-common的jar,它似乎與mvn site無關。在進入maven-site-plugin之前,Maven核心很早就發生了異常。它看起來不像maven-site-plugin的問題,而是所有maven生命週期的普遍行爲(我相信clean除外)。

3

我正面臨相同的,但對於struts和paypal_base依賴,我通過下面的做法修復。

  1. 我檢查了一下,發現jar文件不存在於maven倉庫(.m2/reposotory ....)的相應文件夾中。
  2. 我已經安裝,其經由以下MVN命令jar文件

    MVN安裝:安裝文件-Dfile = C:\依賴\ paypal_base.jar \ -DgroupId =貝寶-DartifactId = paypal_base -Dversion = 0。1 \ -Dpackaging =罐子

mvn install:install-file -Dfile=C:\Dependencies\struts.jar \ 
    -DgroupId=struts -DartifactId=struts -Dversion=0.1 \ 
    -Dpackaging=jar 

(-DFile是jar文件在你的系統的位置)

  • 重建Maven項目。
  • 我的項目成功構建。
  • 必須檢查罐子,使用上面指令罐子不存在的。 可能會有所幫助。