你如何处理生成的代码?

时间:2009-02-26 00:26:28

标签: java

处理生成代码的好策略是什么?我们的一个项目使用Apache CXF的 wsdl2java 工具为一组wsdl生成JAX-WS存根。该代码应如何处理?

我可以看到两个选项:

  1. 生成存根一次并将其存储在版本控制中。这样,您就不必处理IDE类路径问题,因为您的树(或附近)中有源文件。但是,除了诱惑某人使用生成的代码进行欺骗外,你在版本控制方面还有很多混乱

  2. 每次在构建时生成存根。这颠倒了#1的利弊,因为开发人员现在必须处理运行构建脚本并将生成的jar添加到他/她的类路径中。

  3. 我们选择了#2,因为类路径相关问题的烦恼似乎超过了#1中详述的问题。

    其他人在做什么?有没有人有任何建议来简化这个过程?

7 个答案:

答案 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选项。原因很明显,我已经看到其他人已经足够支持这种选择了。

我的书中有一个例外。如果以下大部分/全部适用:
(因为,“大多数情况下”,你知道 - 这是一个思考标准,而不是写在石头上的东西......)

  1. 存根代码需要很长时间才能重新生成(*)
  2. 没有有效的方法可以提前确定源是否有变化( a-la MAKE),因此您每次都必须重建存根。
  3. 预计存根代码很少会发生变化(因为生成存根的源极少变化)
  4. 存根代码中的任何更改通常都需要手动更改程序的其余部分
  5. 我通常会编写脚本化生成步骤(并在源代码管理中记录这些步骤),但只能手动执行代理生成。

    以上的典型示例是数据库ORM类和Web服务代理类。

    **(多长时间“太长了”?这取决于;在高度互动的环境中,一分钟可能“太长”。正如我所说,这是你思考的标准。在真正的编程中,如在现实生活中,你必须挑选自己的邪恶)。*