2009-02-26 146 views
3

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

有两种选择,我可以看到:

  1. 一旦生成stub并将其存储在版本控制。有了这个,你不必处理IDE类路径问题,因为你的树中(或附近)有源文件。然而,除了诱惑人们使用生成的代码进行猴子游戏之外,你在版本控制中还有很多额外的混乱因素。

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

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

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

回答

8

我的态度是生成的代码实际上不应该存储在版本控制中。必须有令人信服的理由才能做到这一点。我通常创建一个ant任务“build-for-eclipse”来构建所有生成的代码。我运行它,刷新生成代码所创建的目录,并且,我很适合去。

的目标是,你有一个“一键式”简单的任务,任何开发人员可以这样做,他们将有所有的源 - 产生的,而不是 - 在他们的IDE,但任何事情没有输出存储在源代码管理中。如果是发电机的输出,则根据定义,它不是来源。 :-)

这应该安全地满足每个人的需求。

0

我想你会发现J2EE/EJB 2.x人群不得不处理与XDoclet类似的问题。根据我的经验,我已经看到这两种方式 - 人们将生成的代码存储在版本控制中,在构建过程中生成代码。

只要你有一个很好的测试系统,我认为#1是最好的。如果你有非常好的可以处理样式2的工具(比如Eclipse的Xdoclet功能),那就去做吧。不过要注意 - 如果长时间构建和重新构建并且重新启动IDE/JVM通常是一件痛苦的事情,#2通常可以填充永久生成的JVM。

+0

XDoclet是如何解决这个问题的? – Kevin 2009-02-26 00:33:41

+0

每次对输入文件进行更改时都会运行的工具。 – Martin 2009-02-26 06:01:25

+0

(或者你可以用手运行它:) – Martin 2009-02-26 06:02:17

2

我试过这两种方式,并决定不存储生成的代码作为一般规则。当存在轻微的微小差异时,这可能会成为一个问题,而且看起来版本控制方面有所改变,而且确实没有什么重要的。此外,#1,你可以最终在你的仓库中放置很多垃圾,特别是在生成的代码是二进制的情况下。大多数回购不会存储二进制代码的差异,而是完整的副本。

即使在像你这样的情况下,生成的东西是文本,我倾向于不存储它,除非我绝对必须更改代码才能使其工作。

2

我更喜欢选项#3,它具有1 & 2的优点,但不是缺点:永远不会将生成的文件提交到源代码控制中,而是创建一个完全自动化的可移植构建过程(一个shell命令将其全部运行每个工作站)。

关于这两方面的SO(和“网络”)其他地方都有很多讨论。可以这么说:源代码控制用于SOURCE,不是生成代码或二进制文件,并且这种源代码包含可自动执行可重复构建的脚本。

您的真正问题取决于基于IDE的构建过程,这将不可避免地伤害到您。让开发人员配置他们的IDE进行构建,但不要让它在场上下注,也不要让它进入源代码管理系统。

祝福。

0

2号天更好。同样#2,你可以利用代码生成器(你的情况下的Apache CXF)的改进。每次开始使用新的CXF版本时,您不必重新生成并签入。 是的,有一个单击构建系统,它可以完成一切:-)

0

我们使用Eclipse作为主IDE /工具。我们为每个生成的代码定义新的Java项目。例如,如果我正在使用hibernate和Axis Web Services在Web项目中工作。我们在我们的工作空间中有这样的结构:

projectWeb:这是主要的项目,通常是一个动态的web项目。所有的编码员都在这里工作:-)

projectORM:使用hibernate工具生成的代码。

projectWS:使用Java2WDSL生成的代码。

projectWSClient:使用WDSL2Java生成的代码。

每个项目都在修订控制(SVN)下。我们使用Maven 2作为depencendy/build工具,并将生成代码中的二进制文件保存为我们的Maven 2存储库中的jar文件。在此之前,团队中的一个人(或多个)负责处理生成的代码并在每代之后对其进行测试(例如,模型发生更改时)。

Regards

0

大多数情况下,我会选择#2。原因很明显,我看到已经有足够的人支持这种选择。

我的书中有一个例外。如果大多数/所有的下列规定:
(如,“大多是”,你知道 - 这是一个思维的标准,不是写在石头上...)

  1. 存根代码需要长时间重新生成(*)
  2. 没有有效的方法来预先确定源是否有变化(a-la MAKE),所以您必须每次重建存根。
  3. 存根码有望很少改变(因为从其中短截线产生的变化很少源)
  4. 任何更改在存根码通常需要在程序的其余部分反正
手动更改

我通常会用脚本编写生成步骤(并记录源代码管理中的那些步骤),但只能手动执行代理生成。

以上的典型示例是数据库ORM类和Web服务代理类。 (多长时间“太长”?这取决于;在高度互动的环境中,一分钟可能会“太长”,正如我所说,这是一个需要考虑的标准,在真正的编程中,在现实生活中,你必须选择你的罪恶)*