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 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)