『壹』 如何在電腦上使用MOJO 解碼耳放(詳細步驟)
去官網下載驅動然後直接插上去就行
『貳』 如何編寫maven plugin 基礎
當maven內置的功能不能滿足需求的時候怎麼辦,那就只能給它寫插件了。 (話說回來,給maven擴展只能寫一個很完整的插件,而不能是一個簡單的script,真的是太笨重了)網路上很多maven的文章,但基本很少談及如何給它寫插件,即使你搜索maven plugin,也只是給你返回一堆如何使用maven插件的文章。希望這邊文章能給一些maven使用者帶來幫助。我在這里先假設你已經懂得使用maven,我不會貼出完整的pom.xml文件首先,你需要創建一個maven項目,插件是一種特殊的maven項目 然後修改pom.xml,將packaging改為maven-plugin<packaging>maven-plugin</packaging>通過properties定義maven的版本<properties><maven.version>2.2.1</maven.version></properties>maven3已經出了很久,並且兼容maven2,因此我們團隊內部都是統一使用maven3,但是我這里編寫插件使用的是maven2,可以同時在maven2和maven3下使用,不過其實這個原因並不重要,真正的原因是因為maven3的代碼實在太爛了,最初的時候我用maven3的api lib來寫,發現裡面很多代碼根本沒有注釋,而且很多代碼已經廢棄,但是並沒有明確說明究竟用什麼方法代替。接著添加依賴<dependencies><dependency><groupid>org.apache.maven</groupid><artifactid>maven-plugin-api</artifactid><version>${maven.version}</version></dependency><dependency><groupid>org.apache.maven</groupid><artifactid>maven-core</artifactid><version>${maven.version}</version></dependency></dependencies>然後開始創建Mojo類,maven插件裡面每一個具體的功能都是一個Mojo 比如說eclipse:clean和eclipse:eclipse就是兩個Mojo/*** @goal helloWorld*/{publicvoidexecute()throwsMojoExecutionException{getLog().info("Hello, world!");}}首先繼承AbstractMojo,並且實現execute()方法,這個就是每次調用進入的地方 然後需要在類的javadoc上定義,這是一個annotation出來之前常用的定義方法(或許未來maven會將它改成annotation,那就能提供編譯校驗和IDE校驗)。我們必須定義@goal,代表運行目標,簡單來說就是eclipse:clean中的clean Mojo寫在哪個package底下都是可以的這樣,我們就完成了一個簡單的maven plugin,然後我們需要一個簡單的測試來確定他正確運行 先通過maven install將它安裝到本地倉庫然後打開任意maven的項目(比如說我們原來已經在用maven的項目),在pom.xml增加一個plugin<build><plugins><plugin><groupid>xxx</groupid><artifactid>xxx</artifactid><version>xxx</version><executions><execution><phase>compile</phase><goals><goal>helloWorld</goal></goals></execution></executions></plugin></plugins></build>需要留意的是phase部分,我們將這個plugin綁定到compile這個周期 然後我們運行mvn compile,就能成功看見Hello, world!輸出 (當然你也可以直接通過命令行運行,需要帶上完整的groupId和artifactId才能調用)
『叄』 是goal還是phase
是 goal 還是 phase?Maven 插件(plugin)goal 的執行與生命周期 (lifecycle)phase 的關系 這其實並不是一個復雜的問題,但是似乎沒有什麼資料對此做過清晰的說明,本文將對這個 問題做一個詳細的解釋。 背景知識 maven 對構建(build)的過程進行了抽象和定義,這個過程被稱為構建的生命周期(lifecycle)。 生命周期(lifecycle)由多個階段(phase)組成,每個階段(phase)會掛接一到多個goal。goal 是 maven 里定義任務的最小單元,相當於ant 里的target。 以phase 為目標構建 以phase 為目標進行構建是最常見的,如我們平時經常執行的mvn compile,mvn test,mvn package...等等,compile,test,package 都是maven 生命周期(lifecycle)里的phase,通過mvn 命令,你可以指定一次構建執行到那一個階段,在執行過程中,所有經歷的執行階段(phase) 上綁定的goal 都將得到執行。例如,對於一個jar 包應用,當執行mvn package 命令時, maven 從validate 階段一個階段一個階段的執行,在執行到 compile 階段時,compiler 插 件的compile goal 會被執行,因為這個goal 是綁定在compile 階段(phase)上的。這一點可 從其對應的mojo 類上得知: 再比如經常使用的打包插件shade,它的goal 是綁定到package 階段的,這樣,使用mvn package 進行打包時都會執行shade 的。 以goal 為目標構建 雖然以phase 為目標的構建最常見,但是有時候我們會發現,一些插件的goal 並不適合綁 定到任何階段(phase)上,或者是,這些goal 往往是單獨執行,不需要同某個階段(phase) 綁定在一起,比如hibernate 插件的導入\導出goal 多數情況下是根據需要要手動執行的(當 然,也可以綁定到某個階段上,比如進行單元測試時,可考慮將其綁定到 test 階段上)。再 比如jetty(6.1.26)插件,它的goal 都是將打包或未打包的工程部署到jetty 里然後啟動jetty 容器的,多數情況下,人們都是獨立運行這些goal 的,比如:人們希望當鍵入mvn jetty:run 後,工程就能完成編譯後啟動jetty,而jetty 插件也確實是這樣做的,它的run goal 的mojo 是這樣聲明的: 其中@execute phase="test-compile"指明 jetty:run 這一 goal 會促使 maven 先 build 到 test-compile 階段,再執行這個 goal.同樣,對於 jetty:run-war 這個goal 則要求先build 到 package 階段再執行該goal. 而另外一個例子是exec 插件的exec:java. 這個goal 也聲明了execute 的phase,但卻是validate,這樣,如果代碼沒有編譯,執行這 個goal 就會出錯,所以多數情況下,人們總是使用下面的方式執行的: mvn clean compile exec:java
『肆』 maven小例子,要編譯成jar包。但是install不通過。求教!
編譯jar包沒必要install,只要package就可以了
『伍』 maven編譯項目報錯了
看看maven的本地倉庫相應的編譯插件有沒有問題。
我的本地倉庫中的依賴包都是用的阿里雲的鏡像倉庫下載的。
『陸』 eclipse中更新maven update project 如果直接用maven命令的話,是哪個命令i
你好:這個的話,命令也不太好用啊,你可以參考下,這些事maven的所有命令
Maven庫:
http://repo2.maven.org/maven2/
Maven依賴查詢:
http://mvnrepository.com/
Maven常用命令:
1.創建Maven的普通java項目:
mvnarchetype:create
-DgroupId=packageName
-DartifactId=projectName
2.創建Maven的Web項目:
mvnarchetype:create
-DgroupId=packageName
-DartifactId=webappName
-DarchetypeArtifactId=maven-archetype-webapp
3.編譯源代碼:mvncompile
4.編譯測試代碼:mvntest-compile
5.運行測試:mvntest
6.產生site:mvnsite
7.打包:mvnpackage
8.在本地Repository中安裝jar:mvninstall
9.清除產生的項目:mvnclean
10.生成eclipse項目:mvneclipse:eclipse
11.生成idea項目:mvnidea:idea
12.組合使用goal命令,如只打包不測試:mvn-Dtestpackage
13.編譯測試的內容:mvntest-compile
14.只打jar包:mvnjar:jar
15.只測試而不編譯,也不測試編譯:mvntest-skippingcompile-skippingtest-compile
(-skipping的靈活運用,當然也可以用於其他組合命令)
16.清除eclipse的一些系統設置:mvneclipse:clean
ps:
一般使用情況是這樣,首先通過cvs或svn下載代碼到本機,然後執行mvneclipse:eclipse生成ecllipse項目文件,然後導入到eclipse就行了;修改代碼後執行mvncompile或mvntest檢驗,也可以下載eclipse的maven插件。
mvn-version/-v顯示版本信息
mvnarchetype:generate創建mvn項目
mvnarchetype:create-DgroupId=com.oreilly-DartifactId=my-app創建mvn項目
mvnpackage生成target目錄,編譯、測試代碼,生成測試報告,生成jar/war文件
mvnjetty:run運行項目於jetty上,
mvncompile編譯
mvntest編譯並測試
mvnclean清空生成的文件
mvnsite生成項目相關信息的網站
mvn-Dwtpversion=1.0eclipse:eclipse生成Wtp插件的Web項目
mvn-Dwtpversion=1.0eclipse:clean清除Eclipse項目的配置信息(Web項目)
mvneclipse:eclipse將項目轉化為Eclipse項目
在應用程序用使用多個存儲庫
<repositories>
<repository>
<id>Ibiblio</id>
<name>Ibiblio</name>
<url>http://www.ibiblio.org/maven/</url>
</repository>
<repository>
<id>PlanetMirror</id>
<name>PlanetMirror</name>
<url>http://public.planetmirror.com/pub/maven/</url>
</repository>
</repositories>
mvndeploy:deploy-file-DgroupId=com-DartifactId=client-Dversion=0.1.0-Dpackaging=jar-Dfile=d:client-0.1.0.jar-DrepositoryId=maven-repository-inner-Durl=ftp://xxxxxxx/opt/maven/repository/
發布第三方Jar到本地庫中:
mvninstall:install-file-DgroupId=com-DartifactId=client-Dversion=0.1.0-Dpackaging=jar-Dfile=d:client-0.1.0.jar
-DdownloadSources=true
-DdownloadJavadocs=true
mvn-e顯示詳細錯誤信息.
mvnvalidate驗證工程是否正確,所有需要的資源是否可用。
mvntest-compile編譯項目測試代碼。。
mvnintegration-test在集成測試可以運行的環境中處理和發布包。
mvnverify運行任何檢查,驗證包是否有效且達到質量標准。
mvngenerate-sources產生應用需要的任何額外的源代碼,如xdoclet。
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/lifxue/archive/2009/10/14/4662902.aspx
常用命令:
mvn-v顯示版本
mvnhelp:describe-Dplugin=help使用help插件的describe目標來輸出MavenHelp插件的信息。
mvnhelp:describe-Dplugin=help-Dfull使用Help插件輸出完整的帶有參數的目標列
mvnhelp:describe-Dplugin=compiler-Dmojo=compile-Dfull獲取單個目標的信息,設置mojo參數和plugin參數。此命令列出了Compiler插件的compile目標的所有信息
mvnhelp:describe-Dplugin=exec-Dfull列出所有MavenExec插件可用的目標
mvnhelp:effective-pom看這個「有效的(effective)」POM,它暴露了Maven的默認設置
mvnarchetype:create-DgroupId=org.sonatype.mavenbook.ch03-DartifactId=simple-DpackageName=org.sonatype.mavenbook創建Maven的普通java項目,在命令行使用MavenArchetype插件
mvnexec:java-Dexec.mainClass=org.sonatype.mavenbook.weather.MainExec插件讓我們能夠在不往classpath載入適當的依賴的情況下,運行這個程序
mvndependency:resolve列印出已解決依賴的列表
mvndependency:tree列印整個依賴樹
mvninstall-X想要查看完整的依賴蹤跡,包含那些因為沖突或者其它原因而被拒絕引入的構件,打開Maven的調試標記運行
mvninstall-Dmaven.test.skip=true給任何目標添加maven.test.skip屬性就能跳過測試
mvninstallassembly:assembly構建裝配MavenAssembly插件是一個用來創建你應用程序特有分發包的插件
mvnjetty:run調用Jetty插件的Run目標在JettyServlet容器中啟動web應用
mvncompile編譯你的項目
mvncleaninstall刪除再編譯
mvnhibernate3:hbm2ddl使用Hibernate3插件構造資料庫
『柒』 怎麼根據pom文件設置tomcat
1. 發布步驟
1.1 修改tomcat的tomcat-users.xml配置文件
在{tomcat_home}/conf/tomcat-user.xml中加入如下代碼:
<user username="admin"password="admin" roles="admin,manager"/>
說明:該代碼主要是設置 tomcat 控制頁面的用戶名和密碼。
1.2 修改pom.xml文件
修改pom.xml文件,加入tomcat插件代碼,如下:
< plugin >
< groupId > org.codehaus.mojo </ groupId >
< artifactId > tomcat - maven - plugin </ artifactId >
< version > 1.1 </ version >
< configuration >
< url > http://192.168.1.207:8989/manager/html </ url >
< server > tomcat6 </ server >
</ configuration >
</ plugin >
1.3 修改maven的setting.xml文件
打開我的工作目錄,修改{my_home}/.m2/setting.xml文件,如果沒有改文件,可以將{m2_home}/conf/setting.xml復制到{my_home}/.m2目錄之下,然後修改setting.xml文件。
在<servers></servers>中加入如下代碼:
<server>
<id>tomcat6</id>
<username>admin</username>
<password>admin</password>
</server>
說明:改代碼主要是設置tomcat服務的id以及tomcat管理台的用戶名和密碼,應為發布項目的時候需要tomcat的用戶名和密碼,此處的id要和pom.xml中tomcat插件代碼中的<server></server>節點的值一致。
1.4 啟動tomcat
運行{tomcat_home}/bin/startup.bat文件,啟動tomcat。
1.5 通過maven將項目發布到tomcat中
在項目pom.xml所在目錄中,依次執行以下命令:
mvn clean;
mvn compile
mvn package
mvn tomcat:deploy
以上命令執行完畢以後我們的項目就發布到tomcat中了。
以上命令說明:
mvn clean;--清理項目
mvn compile;--編譯項目
mvn package;--打包項目
mvn tomcat:deploy;--根據pom.xml的配置將項目發布到tomcat中
mvn tomcat:undeploy;--卸載tomcat中的項目
『捌』 如何編寫一個Maven插件
基礎
當maven內置的功能不能滿足需求的時候怎麼辦,那就只能給它寫插件了。 (話說回來,給maven擴展只能寫一個很完整的插件,而不能是一個簡單的script,真的是太笨重了)
網路上很多maven的文章,但基本很少談及如何給它寫插件,即使你搜索maven plugin,也只是給你返回一堆如何使用maven插件的文章。希望這邊文章能給一些maven使用者帶來幫助。
我在這里先假設你已經懂得使用maven,我不會貼出完整的pom.xml文件
首先,你需要創建一個maven項目,插件是一種特殊的maven項目 然後修改pom.xml,將packaging改為maven-plugin
<packaging>maven-plugin</packaging>
通過properties定義maven的版本
<properties>
<maven.version>2.2.1</maven.version>
</properties>
maven3已經出了很久,並且兼容maven2,因此我們團隊內部都是統一使用maven3,但是我這里編寫插件使用的是maven2,可以同時在maven2和maven3下使用,不過其實這個原因並不重要,真正的原因是因為maven3的代碼實在太爛了,最初的時候我用maven3的api lib來寫,發現裡面很多代碼根本沒有注釋,而且很多代碼已經廢棄,但是並沒有明確說明究竟用什麼方法代替。最後我使用了maven2中被maven3廢棄的api來完成我的功能,跑的挺好的,就是有時可能會有一些使用准備廢棄的api的提醒而已。
接著添加依賴
<dependencies>
<dependency>
<groupid>org.apache.maven</groupid>
<artifactid>maven-plugin-api</artifactid>
<version>${maven.version}</version>
</dependency>
<dependency>
<groupid>org.apache.maven</groupid>
<artifactid>maven-core</artifactid>
<version>${maven.version}</version>
</dependency>
</dependencies>
然後開始創建Mojo類,maven插件裡面每一個具體的功能都是一個Mojo 比如說eclipse:clean和eclipse:eclipse就是兩個Mojo
/**
*@goalhelloWorld
*/
{
publicvoidexecute()throwsMojoExecutionException
{
getLog().info("Hello,world!");
}
}
首先繼承AbstractMojo,並且實現execute()方法,這個就是每次調用進入的地方 然後需要在類的Javadoc上定義,這是一個annotation出來之前常用的定義方法(或許未來maven會將它改成annotation,那就能提供編譯校驗和IDE校驗)。我們必須定義@goal,代表運行目標,簡單來說就是eclipse:clean中的clean Mojo寫在哪個package底下都是可以的
這樣,我們就完成了一個簡單的maven plugin,然後我們需要一個簡單的測試來確定他正確運行 先通過maven install將它安裝到本地倉庫
然後打開任意maven的項目(比如說我們原來已經在用maven的項目),在pom.xml增加一個plugin
<build>
<plugins>
<plugin>
<groupid>xxx</groupid>
<artifactid>xxx</artifactid>
<version>xxx</version>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>helloWorld</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
需要留意的是phase部分,我們將這個plugin綁定到compile這個周期 然後我們運行mvn compile,就能成功看見Hello, world!輸出 (當然你也可以直接通過命令行運行,需要帶上完整的groupId和artifactId才能調用)
注入
Mojo是一個很簡單的Java Bean模式的類,你會發現Mojo所繼承的AbstractMojo裡面之後非常少的方法。那我們需要在Mojo.execute裡面獲取當前運行中的上下文如何處理呢?答案是注入,就是跟spring ioc差不多的注入方式。
常用的注入主要有兩種,第一種是xml配置中的額外設置 比如說我們有這么一個plugin的配置
<plugin>
<artifactid>maven-eclipse-plugin</artifactid>
<configuration>
<downloadsources>true</downloadsources>
</configuration>
</plugin>
所有寫在configuration裡面的屬性都可以注入到Mojo中,比如說以下代碼
/**
*@parameter
*/
privatebooleandownloadSources;
就可以通過downloadSources變數獲得配置中的值 值得注意的是,這里是不用生成完整的JavaBean模式的get/set的,並且private是有效的
javadoc裡面還可以加入其他屬性,比如說
/**
*@parameterdefault-value="true"
*@readonly
*/
privatebooleandownloadSources;
就是默認為true,並且不能通過配置修改(當然我們這里肯定不會有這樣的需求) 更多的javadoc可以參看官方文檔中的說明
第二種注入的數據就是上下文,跟HttpServlet.getServletContext這種寫法不一樣,如果我們需要Mojo運行期的上下文,也是通過注入獲得的
/**
*@parameterexpression="${project}"
*@readonly
*/
privateMavenProjectproject;
/**
*@component
*@readonly
*/
;
例如這里我們就能獲得ArtifactFactory和MavenProject 需要注意的是這里可能有兩種方法,第一種跟xml配置獲得的方法差不多,通過expression指定名字 實際上,你在xml裡面,也可以通過${project}獲得相應的東西進行一些簡單的操作(當然xml裡面只能文本描述,這里是一個類)
另外一種就是使用@component這個標注,可以獲得一些基本的組件實例。
測試
寫完一個插件之後,我們就需要對他進行測試 如果我們用人工測試的話,將會非常麻煩,因為maven插件本身的發布流程就非常復雜 你需要編譯打包你的maven插件,然後安裝到本地庫(或遠程私庫中),然後寫一個sample project,再運行,看一下是否正確 當然你也可以用單元測試來解決一些問題,但是單元測試比較難保證插件最終正確,而且maven插件很經常是跟文件打交道
這里我們就需要對maven插件進行自動化的集成測試 maven的生命周期是包含集成測試的,默認是沒有綁定任何功能。不過如果你google一下,會找到一些maven進行集成測試的例子,大致就是啟動jetty,然後通過http訪問驗證,再關閉jetty
我們這里使用的是maven-invoker-plugin,它就是用於maven插件的集成測試
先在pom.xml中加入
<build>
<plugins>
<plugin>
<artifactid>maven-invoker-plugin</artifactid>
<configuration>
<cloneprojectsto>${project.build.directory}/it</cloneprojectsto>
</configuration>
<executions>
<execution>
<id>integration-test</id>
<goals>
<goal>install</goal>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
cloneProjectsTo是先將測試案例拷貝出來再運行 execution段的設定是把maven-invoker-plugin的兩個goal綁定到integration-test上 integration-test這個生命周期會在mvn install之前調用
集成測試的內容放在 src/it 目錄下,每新建一個目錄代表一個獨立的測試,裡面放一個完整的maven項目,當然你在這個項目裡面需要引入自己編寫的maven插件並且運行 另外還需要一個postbuild.groovy文件,放在測試案例的根目錄,這個腳本的用處是檢查運行後的maven項目是否達到自己要的效果。很明顯,看名字就知道用groovy來寫,一般我們會檢查一下,是否產生了某某文件等等來判定,如果不正確的話拋出異常
然後我們在maven插件目錄運行mvn integration-test就能進行集成測試了
『玖』 maven compiler plugin3.1compile是什麼意思
maven-compile-plugin
這個插件就如同名字所顯示的這樣,用來編譯源代碼的。
最開始碰到這個插件是在於有的時候我們下載了一些工程需要編譯的時候,比如我們輸入命令:mvn install ,
但是系統編譯的時候報錯了,錯誤的信息如下:
[ERROR]Failedtoexecutegoalorg.apache.maven.plugins:maven-compiler-plugin:2.0.2:compile(default-compile)onprojectspringJMS:Compilationfailure:Compilationfailure:
[ERROR]/home/frank/programcode/SpringJMSSample/src/main/java/huangbowen/net/jms/MessageSender.java:[6,1]error:annotationsarenotsupportedin-source1.3
[ERROR]
[ERROR](use-)
[ERROR]/home/frank/programcode/SpringJMSSample/src/main/java/net/EmbedBrokerApp.java:[5,7]error:-source1.3
[ERROR]->[Help1]
[ERROR]
[ERROR],re-runMavenwiththe-eswitch.
[ERROR]Re-runMavenusingthe-.
[ERROR]
[ERROR],:
[ERROR][Help1]http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
從錯誤顯示的信息我們就可以看出,這是因為編譯的時候是默認用的javac 1.3版本的,太老了不支持代碼里的特性。
為了修改這個問題,我們需要設置編譯器的版本。
解決這個問題的辦法也比較簡單,就是直接在後面的插件部分增加如下的插件,
比如如下部分,將編譯器的版本設定為1.7:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
『拾』 使用maven編譯JAVA程序是出錯
問題描述:
在eclipse中build一個普通maven項目,報錯,提示信息是缺少maven插件(插件名稱忘了)。
原因:
可能是由於使用了eclipse自帶的jre導致的,這個jre里沒有tools.jar,而jdk的lib目錄下有(個人理解)。
解決辦法:
1、檢查eclipse的配置,確保使用的不是eclipse自帶的版本。
步驟:在eclipse中打開Window->Preferences->Java->Installed JREs->Add,添加自己下載並配置好的jdk(別忘了配置環境變數),我用的是jdk1.6.0_4.3。
2、然後再次編譯maven項目,仍然報錯,但提示信息改變了,提示的是C:\Users\Administrator.EED4VRFALFPIIBP\.m2\repository\commons-logging\commons-logging下的jar包解析失敗;
3、解決方案:刪除repository文件夾,確保網路暢通,重啟eclipse,執行Maven->Project
Update,問題解決。
注意:如果你的eclipse中配置了tomcat,那麼你也需要重新選擇tomcat的jdk版本,確保與前面的一致。
步驟:在eclipse中打開Window->Preferences->Server->Runtime
Environment->選中你的tomcat server->Edit,在JRE這項里選擇你的jdk,完成。