使用Maven进行Coldfusion项目

时间:2009-08-25 05:06:13

标签: maven-2 coldfusion continuous-integration

我必须处理那些非常丑陋和大量的ColdFusion代码,直到今天,这些代码都是通过生产服务器上的直接修改来维护的(不要问)。我设法从欺骗和备份中清理它并将其放入Subversion,现在我需要选择一个make系统才能将其置于持续构建(TeamCity)和预定版本中。 令我惊讶的是,我只在how to retrofit CF project with Maven上发现了几篇博客文章,所以问题是 - 是否有人有成功使用Maven在CF上的经验以及一般人用来管理大型CF项目的经验? 您的建议,提示和链接将非常感谢 因为我不想开始宗教战争 - Maven几乎是公司标准(vs Ant)

2 个答案:

答案 0 :(得分:13)

首先,这是另一个你可能会发现有用的博客。

build-tools-maven-and-coldfusion

我没有尝试使用Maven构建ColdFusion,但我有为大型公司管理Maven构建的经验。有几件事你可以考虑。

项目结构

Coldfusion cfm和cfc文件应放在src / main / resources中,以便它们捆绑在jar中(上面引用的博客会覆盖Maven约定,将它们放在src中。这没关系,但如果你有问题可能会有问题以后需要在项目中添加任何其他内容。)

我可能会将cfc和cfm文件保存在单独的项目中,并使用适当的依赖声明来链接它们,这样可以将cfc项目保存为库并帮助重用。同样值得考虑cfc项目的粒度。通常,Maven的依赖管理可以帮助您保持较小的工件,而不必担心找到所有的罐子。

<强>部署

传递工件的最简单方法是使用maven-war-plugin创建包含工件及其所有传递依赖项的war。这使得每个应用程序都是自包含的,这可能很有用。这样做的缺点是你最终会反复捆绑相同的工件并且它们可能非常大。为了缓解这个问题,您可以使用assembly-plugin创建不包含常用组件的自定义程序包,也可以指定某些组件(例如ColdSpring)是范围提供,这意味着它们不会被列入战争。

版本管理

Maven鼓励依赖项泛滥,默认情况下,每个依赖项声明都有一个版本,这可能会导致维护问题,尤其是当您想要破坏外部依赖项的版本时。您可以通过定义父POM或“app”POM来缓解此问题。要么有一个dependencyManagement部分声明常见工件的细节(groupId,artifactId和version)。从父级继承的任何POM都不需要声明依赖项版本,因为它将被继承(注意这并不意味着所有子级都将拥有所有依赖项,只是声明依赖项的任何一个都不需要声明版本)。如果您使用打包“pom”和dependencyManagement部分定义“app”项目,则可以使用范围 import (从Maven 2.0.9开始)引用它,这将从“”导入dependencyManagement部分“ app“项目到项目POM。有关详细信息,请参阅dependency documentation

如果在dependencyManagement部分中声明了与作用域的依赖关系,则除非在子POM中重写该作用域,否则将继承该作用域。与上面的部署部分相关,这意味着您可以在父级中声明公共库范围提供,以确保它们不会捆绑在每个应用程序中。

命名约定 您需要包的命名约定以避免冲突。 最好遵循Maven约定并使用类似java包的groupIds(maven.apache.org的org.apache.maven)和工件的jar名称。这个约定将为ColdSpring提供groupId“org.coldspringframework”和artifactId“coldspring”。

可能需要在整个公司进行进一步的区分。例如,如果您有一个Web和核心团队,您可以向Web团队提供groupIds 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 / plexus / 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>

答案 1 :(得分:0)

Maven对我来说也很有趣,但是我找不到足够的资源,没有足够的时间来弄明白,所以我也开始看起来也很好。

我知道你更喜欢使用Maven,我已经看过几篇关于Ant和Coldfusion的文章,以及最近关于Hudson和Coldfusion的文章。

Coldfusion也有cfant(未记录的)标签。你可以直接从CF运行ANT脚本吗?