2009-08-25 85 views
9

我必須處理直到今天仍然是通過生產服務器上的直接修改來維護的ColdFusion代碼的非常醜陋和大塊(不要問)。我設法將它從模糊和備份中清理出來並放到Subversion中,現在我需要選擇一個make系統來把它放到連續編譯(TeamCity)和預定版本中。 令我驚訝的是,我只發現了關於how to retrofit CF project with Maven的單篇博客文章,所以問題是 - 有沒有人在CF上使用Maven以及一般人用於管理大型CF項目的成功經驗? 您的建議,提示和鏈接將非常感激 因爲我不想啓動的宗教戰爭 - Maven是相當多公司的標準(VS螞蟻)使用Maven for Coldfusion項目

回答

12

首先,這裏你可以找到有用的另一個博客。

build-tools-maven-and-coldfusion

我沒有試圖建立的ColdFusion使用Maven,但我有經驗,有管理的Maven構建爲一個大公司。有幾件事情需要你考慮。

項目結構

ColdFusion的CFM和CFC文件應該放在的src/main /資源,使它們在罐子捆綁(上面提到的博客覆蓋了Maven的約定把他們在SRC。這是好的,但如果您以後需要向項目添加其他任何內容,可能會出現問題)。

我可能會將cfc和cfm文件放在單獨的項目中,並使用適當的依賴聲明來鏈接它們,這會將cfc項目保存爲庫並幫助重用。還值得考慮cfc項目的粒度。一般來說,Maven的依賴管理可以幫助您保持較小的工件,無需擔心找到所有的罐子。

部署

交付文物最簡單的方法是使用maven-war-plugin創建包含您的工件和所有的傳遞依賴的戰爭。這使得每個應用程序都是獨立的,這可能很有用。這樣做的缺點是你最終會重複捆綁相同的工件,而且它們可能會很大。爲了緩解這種情況,您可以使用assembly-plugin來創建不包含通用組件的自定義軟件包,也可以指定某些組件(例如ColdSpring)的範圍爲,其提供,這意味着它們不會包含在戰爭中。

版本管理

的Maven鼓勵依賴的增殖,默認情況下每個依賴性聲明中有一個版本,這可能造成維護上的問題,特別是當你要碰到一個外部依賴的版本。您可以通過定義父POM或「應用程序」POM來緩解此問題。要麼有一個dependencyManagement部分聲明常見構件的細節(groupId,artifactId和版本)。從父類繼承的任何POM都不需要聲明依賴版本,因爲它將被繼承(注意,這並不意味着所有的子類將擁有所有的依賴關係,只是任何聲明依賴的子類都不需要聲明該版本)。如果你定義了一個包含「pom」和dependencyManagement部分的「app」項目,你可以參考它的範圍import(從Maven 2.0.9開始),這會將dependencyManagement部分從「app」項目導入到項目POM。有關更多詳細信息,請參閱dependency documentation

如果您在dependencyManagement部分聲明瞭範圍的依賴關係,那麼該範圍將被繼承,除非它在子POM中被重寫。與上面的部署部分相關,這意味着您可以在父級中聲明公共庫範圍提供,以確保它們未捆綁在每個應用程序中。

命名約定 您需要一個命名約定來避免衝突。 可能最好遵循Maven約定,並使用Java package-groupIds(org.apache.maven for maven.apache.org)和artifact的jar名稱。此慣例將爲ColdSpring提供groupId「org.coldspringframework」和artifactId「coldspring」。

公司可能需要進一步區分。例如,如果你有一個網絡和核心團隊,你可以給網絡團隊的組id com.mycompany.web。*和核心團隊com.mycompany.core。*

依賴管理

您需要將您的CFC包添加到Maven存儲庫,例如Nexus,以便整個企業的其他構建都可以訪問它們。

如果你想保持CFC包與罐子分開。您可以指定自定義打包類型,以便它們不會與任何Java工件混淆。如果創建自定義打包類型,工件可以具有「.jar」擴展名,但是任何依賴關係聲明都必須設置類型。

這裏有以下這些公約的例子:

<dependency> 
    <groupId>org.coldspringframework</groupId> 
    <artifactId>coldspring</artifactId> 
    <version>1.2</version> 
    <!--custom packaging type helps keep separate from Java artifacts--> 
    <type>cfc</type> 
</dependency> 

有沒有在Nexus的書,描述custom lifecycles(遵循有關詳細信息的鏈接從本質上講,你需要創建一個META-INF /叢插件的部分。 /components.xml描述叢力學(用什麼歸檔,什麼擴展輸出等)

的components.xml中會是這個樣子:

<component-set> 
    <components> 
    <component> 
     <role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role> 
     <role-hint>cfc</role-hint> 
     <implementation>org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping</implementation> 
     <configuration> 
     <phases> 
      <process-resources>org.apache.maven.plugins:maven-resources-plugin:resources</process-resources> 
      <package>com.hsbc.maven.plugins:maven-jar-plugin:jar</package>   
      <install>org.apache.maven.plugins:maven-install-plugin:install</install> 
      <deploy>org.apache.maven.plugins:maven-deploy-plugin:deploy</deploy> 
     </phases> 
     </configuration> 
    </component> 
    <component> 
     <role>org.apache.maven.artifact.handler.ArtifactHandler</role> 
     <role-hint>cfc</role-hint> 
     <implementation>org.apache.maven.artifact.handler.DefaultArtifactHandler</implementation> 
     <configuration> 
     <extension>jar</extension> 
     <type>cfc</type> 
     <packaging>cfc</packaging> 
     </configuration> 
    </component> 
    <component> 
     <role>org.codehaus.plexus.archiver.Archiver</role> 
     <role-hint>cfc</role-hint> 
     <implementation>org.codehaus.plexus.archiver.zip.ZipArchiver</implementation> 
     <instantiation-strategy>per-lookup</instantiation-strategy> 
    </component> 
    <component> 
     <role>org.codehaus.plexus.archiver.UnArchiver</role> 
     <role-hint>cfc</role-hint> 
     <implementation>org.codehaus.plexus.archiver.zip.ZipUnArchiver</implementation> 
     <instantiation-strategy>per-lookup</instantiation-strategy> 
    </component> 
    </components> 
</component-set> 
+3

豐富,這太棒了!遠遠超過我的討價還價 - 非常感謝你花時間回答這些細節! – Bostone 2009-08-25 15:50:08

+0

非常歡迎。如果您對此方法有任何疑問,我會很感興趣。 – 2009-08-25 15:57:33

+1

事實上 - 我把這個放到我的開發博客,應有的信譽http://is.gd/2y8pw – Bostone 2009-08-25 16:04:07

0

Maven看起來也很有趣,但我找不到足夠的資源,並沒有足夠的時間來解決它,所以我轉向了似乎也很好的方向。

我知道你更喜歡使用Maven,我遇到過幾篇關於Ant和Coldfusion的文章,以及最近關於Coldfusion的一篇關於Hudson的文章。

Coldfusion也有一個cfant(無證)標籤。你可以直接從CF運行ANT腳本?

+0

我用Maven + Ant(通過Antrun插件)和依賴插件做了相當不錯的工作。一旦您從Maven以Jave爲中心抽象出自己,將它應用於任何事情其實都非常簡單 – Bostone 2009-10-13 15:54:24