學習maven的各種問題


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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM