1. The container 'Maven Dependencies' references non existing library
解決方法,將eclipse中maven插件中“resolve dependencies from workspace projects”的選項取消
默認的本地庫更改,修改maven_home\conf\settings.xml中localRepository的配置
[ERROR] The goal you specified requires a project to execute but there is no POM in this directory (...). Please verify you invoked Maven from the correct directory.
到有pom.xml文件的目錄下執行命令
2. myeclipse從svn導入maven項目,有modules。
myeclipse的check out maven projects from scm,沒有試成功怎么導出。但可以先從svn檢查maven項目,包含子module,然后再導入exists maven projects。
3. Failure to find xxx:jar:1.0 in ... was cached in the local repository, resolution will not be reattempted until the update interval of nexus has elapsed or updates are forced
這是一些jar包在之前的倉庫無法獲得,在更改倉庫后,或把jar包部署到了私服上后,仍然出錯。這時把.m2 文件夾下對應的 xxx.lastUpdated文件再更新依賴,就可以了。或者使用mvn命令時加 -U參數,忽略xxx.lastUpdated。
另外以上方式仍然報錯,這時可能是maven 庫或私服里確實沒有對應的jar包,這時可以在私服里增加倉庫,或者更改倉庫。
4. pom聚合的install,在maven 的build config里,goals選項里填入install,profiles中填入maven聚合項目中配置的modules profile的id,如果是如下配置:
<profiles>
<profile>
<id>modules</id>
<modules>
<module>modules/parent</module>
<module>modules/common</module>
<module>modules/entity</module>
<module>modules/ejb</module>
<module>modules/spring</module>
<module>modules/hibernate</module>
<module>modules/web</module>
<module>modules/test</module>
</modules>
</profile>
</profiles>
則這里就要填入modules
5. maven install的plugin找不到,比如effective pom 中配的是2.3.1,本機上已經有2.2.1了,是不會使用的。就會去maven倉庫中下載新版本,maven 的中央庫連接經常不穩定。一般會在settings.xml中配置一些鏡像。但maven不會依次去嘗試所有鏡像,而當排在前面的鏡像失效、或不能提供最新版本時,就需要調整鏡像的位置。
6. 導入的maven項目找不到jdk中的類
jdk版本是1.6,ide是ide出問題了,將Myeclipse重啟ide,對有依賴的maven項目進行更新maven依賴、更新maven項目配置操作,然后對本項目clean、 重新build后就可以了。
7. 拷貝依賴包 mvn dependency:copy-dependencies,默認會拷到項目的 target\dependency 目錄,想要復制到自定義的目錄比如target/libs目錄下,需要在pom.xml文件中添加設置覆蓋默認設置:
<build>
<plugins>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<excludeTransitive>false</excludeTransitive>
<stripVersion>true</stripVersion>
</configuration>
</plugin>
其中${project.build.directory}是maven變量,表示target目錄。如果不寫的話,將在根目錄下創建lib目錄。
excludeTransitive,表示是否不包含間接依賴的包;
stripVersion表示復制的jar文件去掉版本信息。
如果需要在其他過程,比如package中加入copy-dependencies,需要在該plugin標簽中這樣設置:
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>libs</outputDirectory>
<excludeTransitive>false</excludeTransitive>
<stripVersion>true</stripVersion>
</configuration>
</execution>
</executions>
8. 導入jar包到本地庫
有時候有些第三方就是從倉庫中下載不下來,配的私服也有問題,就只有手動導入jar包了。Myeclipse 10 可以使用“Myeclipse -- utilities -- Maven4MyEclipse -- import jar to local repository”工具,導入jar包到本地庫。eclipse的m2eclipse插件暫時沒找到這樣的工具。使用maven命令的可以這樣:
mvn install:install-file
-DgroupId=com.danga
-DartifactId=memcached
-Dversion=2.0.1
-Dfile=java_memcached-release_2.0.1.jar (或者/d:/java_memcached-release_2.0.1.jar)
-Dpackaging=jar -DgeneratePom=true
This will add the memcache jar into your local Maven2 repository under groupId com.danga and artifactId memcached, you can then edit your pom.xml adding this dependency.
However, the maven eclipse can not recognize it since it always search from public repository .
安裝到私服
mvn deploy:deploy-file -DgroupId=org.apache.hadoop -DartifactId=hbase -Dversion=1.0 -Dpackaging=jar -Dfile=[path to file] -Durl=[url] -DrepositoryId=[id]
批量導入jar
直接拷貝文件至/opt/data/nexus/sonatype-work/nexus/storage/pvinsight/org/apache/hadoop/hive/hive-exec/0.5.0
或者
通過腳本執行 mvn deploy:deploy-file
9. 使用maven發布是,報某個類找不到,原因是某個運行時的類,import了用於測試的類(但並未使用),比如junit相關的類。這樣,在ide中和maven compile時都不會報錯,在打包時,由於junit這樣的jar的scope是test類型,因此就不會包含進來,於是就出錯了。解決方法就是刪除不不要的引用。
建立maven的本地代碼庫服務器,也就是“私服”
Maven的服務器很簡單,一個普通的http服務器就行,比如apache,裝好apache以后。
將你本地代碼庫文件夾拷貝到apache安裝目錄下htpdocs/maven2,windows用戶是C:/Documents and Settings/jeffrey/.m2/repository,linux下是 /home/Jeffrey/.m2/repository(注意.m2在linux下是隱藏文件夾)
啟動apache服務器,在瀏覽器中輸入http://localhost/maven2/repository,應該可以查看到repository的文件目錄
編輯項目pom,指定本地的代碼庫服務器
在project中加入:
xml 代碼
<repositories>
<repository>
<id>mylibsid>
<url>http://localhost/maven2/repositoryurl>
repository>
repositories>
可以加入多個repository,mvn會按照順序檢索,如果都沒有找到,最后會去找官方的服務器
maven問題匯總
常用命令
maven日用三板斧
mvn package 打包(在每個模塊的target下生成對應文件)
mvn install 打包,並安裝到本地庫,如果package失敗,報告應用模塊找不到,那就試試install
mvn eclipse:eclipse 生成eclipse項目文件
Maven/AntX命令對照表
AntX Maven
構建項目 antx reactor mvn install
發布項目 antx reactor -P release mvn install -Denv=release
生成eclipse antx eclipse mvn eclipse:eclipse
清空項目 antx clean mvn clean
更新二/三方庫 svn up (庫目錄) mvn a2m:purge
指定配置文件 antx -u antx.properties mvn -DuserProp=antx.properties
Maven常用命令
命令 說明
mvn archetype:generate 創建 Maven 項目
mvn compile 編譯源代碼
mvn test-compile 編譯測試代碼
mvn test 運行應用程序中的單元測試
mvn eclipse:eclipse 生成 Eclipse 項目文件
mvn eclipse:clean 清除 Eclipse項目文件
mvn package 依據項目生成 jar 文件
mvn install 在本地 Repository 中安裝 jar
mvn clean 清除目標目錄中的生成結果
mvn site 生成項目相關信息的網站
Maven常用參數
參數 說明
mvn -U 強制更新snapshot類型的插件或依賴庫(否則maven只會一天更新一次snapshot依賴)
mvn -o 運行在offline模式,不聯網的時候適用
mvn -N 僅在當前項目模塊執行命令,關閉reactor
mvn -pl [opentech:module_name] 在指定的模塊上執行命令的,而非全部模塊
mvn -ff 在遞歸執行命令過程中,一旦發生錯誤就直接退出(fail fast)
mvn -Dxxx=yyy 指定java全局屬性
mvn -Pxxx 應用profile xxx
Maven插件常用參數
命令 說明
mvn -Dmaven.test.skip=true 如果命令包含了test phase,則忽略單元測試(用一次,rp值少10點,自己看着辦)
mvn -DdownloadSources=true -Declipse.addVersionToProjectName=true eclipse:eclipse 生成eclipse項目文件,嘗試從repository下載源代碼,並且生成的項目名包含模塊版本(注:如果用公共POM,上述的開關缺省已打開)
mvn dependency:tree -Dverbose 為當前所在模塊及所有子模塊生成詳細的依賴圖(包括被仲裁掉的)
Maven簡單故障排除
命令 說明
mvn -Dsurefire.useFile=false 如果執行單元測試出錯,用該命令可以在console輸出失敗的單元測試及相關信息
set MAVEN_OPTS=-Xms256m -Xmx512m
-XX:MaxPermSize=128m -XX:ReservedCodeCacheSize=64m Maven內存不夠
mvn -X maven log level設定為debug在運行
mvndebug 運行jpda允許remote debug
mvn --help 如果不清楚這個命令用法,請和我們聯系,馬上安排專人伺候~
如何查找maven插件的文檔
maven所有插件都是maven編譯的,在發布的時候,都會為每個插件的配置參數生成一個插件文檔:比如我們自己的maven-car-plugin插件,文檔在這里:http://repo.alibaba-inc.com/mvn/internal/snapshots/sites/maven-car-plugin/project-reports.html
定位這個文檔是有模式可循的:maven generated site -> Project Reports -> Plugin Documentation
定位maven core/plugins的svn:
同上,maven generated site -> Project Information -> Source Repository 按照這個規則去找maven-car-plugin的svn信息吧。
如果要google某個插件的用法,比如dependency插件,請用關鍵詞maven-dependency-plugin.
記得關鍵詞模式是:maven-${pluginname}-plugin
如何查找某個二方庫或者三方庫jar的pom設置groupId和artifactId?
全文檢索的方式查詢maven庫中是否存在某個jar包,二方庫或者三方庫:
http://repo.alibaba-inc.com/archiva/index.action
查到后點擊可得到pom設置,如:
<dependency>
<groupId>com.alibaba.external</groupId>
<artifactId>ajax.dwr</artifactId>
<version>3.0.0.rc1</version>
</dependency>
淘寶maven庫的查詢: http://mvnrepo.taobao.ali.com:8081/nexus/index.html#welcome
我們現在不能用淘寶的maven庫?setting.xml里有,但是未啟用。
其他一些問題的解決方案
m2eclipse 更新index時間太長的解決辦法?
A: 下載index.zip等文件到本地,放到tomcat下並運行tomcat,eclipse打開,設定索引url為http://repo.alibaba-inc.com/mvn/ 然后update index即可。
mvn test失敗后只顯示了失敗個數,沒看到異常信息
A: 在target/surefire-reports目錄下有各測試方法失敗的詳細信息,查看命令:cat target/surefire-reports/*.txt
如何引用pom文件上的內容?
通過${project.xxx}引用當前pom文件的任意節點的內容,比如:
${project.packaging} 項目的打包類型,對應<project><packaging>jar</packaging></project>的內容。
另外,一些常用的目錄變量:
${basedir} 項目根目錄
${project.build.directory} 構建目錄,缺省為target
${project.build.outputDirectory} 構建過程輸出目錄,缺省為target/classes
如何在Maven中為同一個項目指定不同的antx properties文件?
maven-autoconf-plugin可以支持從命令行指定antx.properties。
mvn -DuserProp=/x/y/z/my.properties
That's it !
更多配置參數參見插件文檔:
http://repo.alibaba-inc.com/mvn/internal/snapshots/sites/maven-autoconf-plugin/config-mojo.html
缺少依賴
有時 build 會因為找不到某些依賴而失敗,如下面這段輸出:
Missing:
----------
1) com.alibaba.external:jakarta.log4j:jar:1.2.16
Try downloading the file manually from the project website.
Then, install it using the command:
mvn install:install-file -DgroupId=com.alibaba.external -DartifactId=jakarta.log4j -Dversion=1.2.16 -Dpackaging=jar -Dfile=/path/to/file
Alternatively, if you host your own repository you can deploy the file there:
mvn deploy:deploy-file -DgroupId=com.alibaba.external -DartifactId=jakarta.log4j -Dversion=1.2.16 -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id]
Path to dependency:
1) com.alibaba.dragoon:dragoon-common:jar:2.5.0-SNAPSHOT
2) com.alibaba.external:jakarta.log4j:jar:1.2.16
如果缺少的是二方庫( groupId 為 com.alibaba.shared )或三方庫( groupId 為 com.alibaba.external ),且確定缺少的依賴在二方庫或三方庫中是存在的,那出現這個問題很有可能是你的 pom 或 settings 沒有配置正確。解決這個問題可以從兩個方面入手,首先查看你使用的 settings 是否是 b2b 最新的 settings,最新的 settings 地址為http://svn.alibaba-inc.com/repos/ali_platform/maven/settings/settings.xml,其次檢查你 pom 里面有沒有配置 parent,或者運行以下命令,並把輸出重定向到文件中:
mvn help:effective-pom -Doutput=output.txt
然后在文件中查找二方庫的地址:http://repo.alibaba-inc.com:9091/shared 和三方庫的地址:http://repo.alibaba-inc.com:9091/external。
注: 在頂級 pom 下運行的時候最好加上 -N 選項,指示 maven 不遞歸到當前項目的子模塊中。
有的時候配置了正確的 settings,但沒有設置 parent,就可能會引起一些三方庫找不到,這是因為二方庫的地址在settings 里面已經有了配置,而三方庫的地址僅在 parent pom com.alibaba:b2b 中配置了,所以如果三方庫找不到,那就要在 pom 里設置一個相應的 parent。