2010-03-22 115 views
0

我打算用现有的代码库在Java中创建一个软件的3个版本。最佳做法是什么?我应该为每个版本创建3个不同的项目吗?还有用于管理版本的任何工具?管理软件版本

+0

它是什么类型的应用程序?这是一个桌面应用程序,Web应用程序,本地可安装的Intranet应用程序吗?你可以提供的细节越多,答案就越好。 – 2010-03-22 22:27:24

+0

这是一个Java应用程序,可以基于网络或独立(较轻版本)。在tomcat上运行(在基于web的版本中),需要一个数据库 – user121196 2010-03-23 00:27:13

回答

1

我首先想到的是保持一个单一的代码库,如果可能的话,用某种标志的切换。

如果不可能,我会尽量保持尽可能相同,并具有较大的项目中使用更小的项目作为子项目,如果可能的话自动启用某些功能 - 例如,每个项目可以有它自己的主要,不同的版本可能只是调用不同的主要设置标志来启用功能。

如果你的标志是最终的,应该连拉避免不必要的代码到您的项目在所有。

最后,最坏的情况下,在颠覆3个分支。

编辑:

你让我觉得多一点关于这个,我想我找到了一个更好的解决方案。

我想我这个分成四个项目,结合所有的“共同”的东西变成一个基地项目,这是不同的东西,我会摊开其他三个项目 - 让我们说你有基地,示范,支付和业务项目..

其中三个可能有所不同,你将有一个对象从演示/薪酬/业务类中的一个提供的功能。例如,如果付费版本具有新的菜单项,则可能在您的某个对象中包含getMenuItems。它会返回一个菜单树,你可以放在你的菜单栏中。演示版本将有更少的项目。

通过这种方式,您的“Base”永远不会知道它运行的是哪个版本,它只是使用对象。

为了获得对象,我会有一个工厂。工厂会是这个样子:

private String[] availablePackages={"business", "pay", "demo"}; 

public getMenuClass() { 
    Class c; 
    for(String package : availablePackages) { 
     try { 
      c=Class.forName("com.meh.myapp."+package+".MenuClass"); 
     } catch... { 
      // No package by that name 
     } 
     if(c != null) { 
      return c.newInstance(); 
     } 
    } 
    // Something went wrong, no instance found. 

的上升气流是,你应该首先尝试实例c​​om.meh.myapp.business.MenuClass,然后再尝试......终于pay.MenuClass ... demo.MenuClass 。

这应该允许您通过简单地运送不同的罐子来改变您的配置 - 如果您决定只运送演示和主罐子,您将获得一个演示应用程序。通过运送付款jar,您将获得付费应用程序。

请注意,很可能您希望企业将其大部分工作委托给“支付”,并且“支付”委托其中一部分工作以“演示”,但演示不知道任何业务或支付,而“主”只能反映其他三个。

这将是一个很好的解决方案,因为没有配置要求 - 事实上,你只需要运送支付jar从演示升级到支付,主要和演示罐被重用并保持正确的位置是。

+0

你有没有任何指向java编译最终标志的链接?一个快速搜索没有给我很多信息。它如何丢弃未使用的代码? – user121196 2010-03-23 00:38:55

+0

我的意思是不是一个编译标志,我的意思是如果你有一个最终的变量,比如“private final boolean INCLUDE_CODE = false”,那么它的任何保护,例如:“if(INCLUDE_CODE)myVar = new SpecialClass() ;”应该永远不会编译进代码。它应该认识到,它永远不会是真实的,并优化它。如果这是SpecialClass被引用的唯一地方,那么SpecialClass不应该被拉进你的项目 - 但我可能已经想出了一个更好的解决方案,重新阅读我的答案。 – 2010-03-23 01:25:51

0

理想的方法是将你的应用分为“核心”,“额外的东西”,“更多的东西”,并结合这些依赖关系。不过,这可能会有很多工作,具体取决于您拥有的代码库。

如果您使用SVN进行源代码管理,您可以从现有代码库中为每个版本创建3个分支。通常人们试图避免这种情况,例如,如果您需要修复这些分支中的常见错误,则需要在其中一个分支中修复该错误,然后将其合并到其余分支中。也许其他源代码库更好地处理这种情况,但对于SVN,我想这是唯一的方法。

至于管理版本,我们使用maven。如果你采用“核心”,“额外的东西”,“更多的东西”的方法,maven可以提供帮助,因为它可以很好地跟踪每个组件的版本(使用pom)。

编辑:比尔的建议可能是最实际的。如果你使用最后的标志,那么编译器应该抛出无法访问的代码。