在上一篇博客使用maven進行開發過程管理之准備篇中提到了maven的基本概念。IT男羅書全覺得概念我是懂了,但是那些東西似乎離我很遠啊。先開發再說吧,
於是IT男羅書全就在svn上取了源代碼,並開始導入到本地開發環境中去。三下五除二,點擊import,出現熟悉的導入界面。
導入失敗,這是怎么回事?問了同事才知道,公司使用的是idea開發環境,而自己用的是eclipse.怎么辦呢?放棄自己心愛的eclipse,真痛苦,而且不熟悉會導致開發效率較低。有沒有兩全其美的辦法呢?有的。
想想大家做數據訪問層時,hibernate是怎么實現兼容不同數據庫的呢?創立中間的一種語言,比如hql,在配置里得知連接的數據庫具體類型時,調用其適配功能實現hql-->相應數據庫sql的轉換。Maven的原理也是類似,提供了pom描述文件來對項目的組成要素做了說明,如src,target,lib等的位置,在命令中得知需要適配哪個開發環境中時,就可以轉換過去。這樣就給具體開發提供了一定的靈活性。在maven中提供了轉換到主流環境eclipse的插件maven-eclipse-plugin,相應轉換命令是eclipse:eclipse.對於IDEA也提供了轉換到IDEA的插件maven-idea-plugin,轉換到相應開發環境的命令是idea:idea.
IT男羅書全在命令行中進入項目所在根目錄下,運行mvn eclipse:eclipse,然后導入,成功了。IT男羅書全欣喜萬分,在欣喜萬分的同時,又疑惑了,maven是怎么做的轉換的呢?
其實任何開發環境都是要識別項目特性,才能順利進行開發的。比如在eclipse項目里面,可以看到有幾個基本要素,如像src/main/java文件夾上有個包的,就是源代碼目錄,源代碼目錄就是放置用戶編寫源代碼的位置。像target目錄,就是生成目標文件的地方,如class文件等。Referenced Libraries就是放置項目依賴的jar包的地方等。
這些項目描述都是在.classpath和.project中說明的。例如.classpath文件:
顯然的,可以得出以下幾個結論:
- kind="src",path=src/main/java,里面說明了src的位置;
- kind="output”,path=target/classes,說明了target目錄的位置;
- kind=“var”,說明的是一個lib的位置。
.project文件中說明了此項目需要的插件,以及使用的builder.
那么maven又是怎么做的呢?其實他也是分析了所有開發環境的共性,而對其概念作了抽象。在下面的代碼中說明:
org.apache.maven.plugin.ide.AbstractIdeSupportMojo.java
1: boolean processProject = setup();
2: if ( !processProject )
3: {
4: return;
5: }
6: // 解析得到所有的依賴,形成lib引用
7: IdeDependency[] deps = doDependencyResolution();
8: //綁定source代碼和javadoc
9: resolveSourceAndJavadocArtifacts( deps );
10: //生成特定開發環境的配置文件
11: writeConfiguration( deps );
12: reportMissingArtifacts();
這是個template模式的實現,具體的開發環境只要繼承AbstractIdeSupportMojo來override其中的writeConfiguration(deps)來生成具體的配置文件。
因此,maven 對開發環境與源代碼的隔離提供了強有力的插件支持,兼顧了不同程序員的愛好,從而提高了整體的開發效率。