使用Maven进行Coldfusion项目

Bos*_*one 9 coldfusion continuous-integration maven-2

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

Ric*_*ler 13

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

构建工具,Maven的和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"项目,则可以使用范围导入(从Maven 2.0.9开始)引用它,这会将dependencyManagement部分从"app"项目导入项目POM .有关详细信息,请参阅依赖性文档.

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

命名约定 您需要包的命名约定以避免冲突.最好遵循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>
Run Code Online (Sandbox Code Playgroud)

Nexus书中有一节描述了自定义生命周期(请点击链接了解更多细节.基本上你需要创建一个带有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>
Run Code Online (Sandbox Code Playgroud)

  • 丰富,这太棒了!远远超过我讨价还价 - 非常感谢你花时间在这些细节中回答这个问题! (3认同)