处理生成代码的好策略是什么?我们的一个项目使用Apache CXF的 wsdl2java 工具为一组wsdl生成JAX-WS存根。该代码应如何处理?
我可以看到两个选项:
生成存根一次并将其存储在版本控制中。这样,您就不必处理IDE类路径问题,因为您的树(或附近)中有源文件。但是,除了诱惑某人使用生成的代码进行欺骗外,你在版本控制方面还有很多混乱
每次在构建时生成存根。这颠倒了#1的利弊,因为开发人员现在必须处理运行构建脚本并将生成的jar添加到他/她的类路径中。
我们选择了#2,因为类路径相关问题的烦恼似乎超过了#1中详述的问题。
其他人在做什么?有没有人有任何建议来简化这个过程?
答案 0 :(得分:8)
我的态度是生成的代码实际上永远不会存储在版本控制中。必须有一个令人信服的理由去做。我通常会创建一个ant任务“build-for-eclipse”来构建所有生成的代码。我运行它,刷新生成代码的目录,瞧,我很适合去。
目标是你有一个“一键式”琐碎的任务,任何开发人员都可以这样做,他们将拥有所有的源 - 生成而不是 - 在他们的IDE中,但没有输出任何东西都存储在源代码管理中。如果它是生成器的输出,那么根据定义,它不是 source 。 : - )
这应该可以安全地满足每个人的需求。
答案 1 :(得分:2)
我已经尝试过两种方式,并决定不存储生成的代码作为一般规则。当存在轻微的微不足道的差异时,这可能是一个问题,并且看起来版本控制发生了变化,并且确实没有任何重要的东西。此外,使用#1,您最终可能会在您的存储库中放入大量垃圾,特别是在生成的代码是二进制的情况下。大多数repos不存储二进制代码的差异,而是完整副本。
即使在像你这样的情况下,生成的东西都是文本,我倾向于不存储它,除非我绝对必须对它进行代码更改才能使它工作。
答案 2 :(得分:2)
我更喜欢选项#3,它的优点是1& 2但不是缺点:从不将生成的文件提交到源代码控制中,而是创建一个完全自动化的可移植构建过程(一个shell命令在每个工作站上运行它)。
关于这两个方面,关于SO(和'Net)的其他地方有很多讨论。可以这样说:源代码控制是针对SOURCE,而不是生成的代码或二进制文件,并且此类源代码包含可自动执行可重复构建的脚本。
您真正的问题取决于基于IDE的构建过程,这将不可避免地伤害您。让开发人员为构建配置他们的IDE,但不要在它上面打赌,也不要让它进入你的源代码管理系统。
祝福。
答案 3 :(得分:0)
我认为你会发现J2EE / EJB 2.x人群必须处理与XDoclet类似的问题。根据我的经验,我已经看到它以两种方式完成 - 人们将生成的代码存储在版本控制和在构建期间生成代码的人。
只要你有一个好的测试系统,我认为#1更可取。如果你有非常好的工具可以处理样式#2(比如Eclipse的Xdoclet功能),那就去吧。注意 - 如果你长时间构建和重建,那么#2通常可以填充JVM的永久代,并且重新启动你的IDE / JVM通常很痛苦。
答案 4 :(得分:0)
2号是更好的日子。使用#2,您可以利用对代码生成器(在您的情况下为Apache CXF)所做的改进。每次开始使用新的CXF版本时,都不必重新生成和签入。 是的,有一个单击构建系统可以完成所有事情: - )
答案 5 :(得分:0)
我们使用Eclipse作为主要的IDE /工具。我们为每个生成的代码定义新的Java项目。例如,如果我在使用hibernate和Axis Web Services的Web项目中工作。我们在工作区中有这个结构:
projectWeb:这是一个主要项目,通常是一个动态的Web项目。所有程序员都在这里工作: - )
projectORM:使用hibernate工具生成的代码。
projectWS:使用Java2WDSL生成的代码。
projectWSClient:使用WDSL2Java生成的代码。
每个项目都在修订控制(SVN)。我们使用Maven 2作为depencendy / build工具,生成的代码中的二进制文件作为jar保存到我们的Maven 2存储库中。在此之前,团队中的一个人(或更多)负责处理生成的代码并在每一代之后对其进行测试(例如,当模型发生更改时)。
此致
答案 6 :(得分:0)
大多数时候,我会选择#2选项。原因很明显,我已经看到其他人已经足够支持这种选择了。
我的书中有一个例外。如果以下大部分/全部适用:
(因为,“大多数情况下”,你知道 - 这是一个思考标准,而不是写在石头上的东西......)
我通常会编写脚本化生成步骤(并在源代码管理中记录这些步骤),但只能手动执行代理生成。
以上的典型示例是数据库ORM类和Web服务代理类。
**(多长时间“太长了”?这取决于;在高度互动的环境中,一分钟可能“太长”。正如我所说,这是你思考的标准。在真正的编程中,如在现实生活中,你必须挑选自己的邪恶)。*