2008-12-31 55 views
5

我继承表示Tomcat下运行的Java应用程序(servlet的)的Java构建过程中的常量。由于历史原因,该代码具有不同的“外观和感觉”的基础上在将应用程序部署(主要品牌的问题)的选项。最好的办法改变

控制这个品牌过程有几个常量,它们具有不同的功能,不应该压缩成一个常量(即品牌,多语言,加上图标和CSS样式表的位置等)。

目前开发团队必须手动更改常数(它们至少在一个数据类本地化,有据可查),然后使用ANT重新编译应用程序。

什么是自动执行此过程假设至少蚂蚁1.8和Java 6.x的最好方法是什么?

我知道使用编译器参数没有任何好的解决方案(就像在C或C++中可以做的那样),而且我倾向于编辑包含常量的源文件或者将它们放在一起的“最佳方式”到另一个文件并使用ant构建过程交换出来。我希望有一个结果能够使用像“ant build brand-x”这样的改变品牌会改变结果构建的东西。

感谢,

- 理查德

回答

2

使用Ant中替换任务来更改值。

+0

这是蛮力,但它的作品。但是它会覆盖文件,因此您必须创建一个已保存(或模板)的文件副本,并每次都将其复制一次。 -R – Huntrods 2009-01-03 18:57:27

+0

后续行动...自2008年这个答案以来,我一直在使用它,它一直在完美运作。开发时,我可以每周编译系统20次以上,这很好。 (当不开发系统运行稳定几个月和几个月)。 – Huntrods 2011-12-26 20:28:44

1

还有,拉从属性的值,并将其注入到需要它们的类别,例如“春天”的方式,这是使用属性文件,和一个bean:

<bean id="propertyPlaceholder" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="location" value="classpath:configuration.properties" /> 
</bean> 

和然后,你可以用“蚂蚁般的”语法注入性质:

<bean id="connectionPool" class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource"> 
    <property name="databaseName" value="mydb" /> 
    <property name="url" value="${db.url}" /> 
    ... 

这可能将需要更多的比你想重写。如果你打算在每个编译正在改变常量,我会注意这个疑难杂症(如果你使用静态总决赛,这是)。

public class Foo { 
public static final int SOME_CONSTANT=1; 
.. 
} 

public class Bar { 
    ... 
    int x=5+Foo.SOME_CONSTANT; 
    ... 
} 

如果再美孚改变SOME_CONSTANT 2,但不重新编译酒吧,酒吧将保留1 SOME_CONSTANT价值,为静态总决赛在编译(因为编译器看到的,它不应该需要再次找出它们)。

1

我更喜欢使用,而不是替代任务蚂蚁的expandproperties过滤器。随着替换任务,构建文件往往会成长为主要标记。 expandproperties可让您直接在文本中嵌入蚂蚁属性。

<copy file="from" tofile="to"> 
    <filterchain> 
    <expandproperties /> 
    </filterchain> 
</copy> 
9

将你的值放入一个属性文件,比如说“myapp”。属性”,然后将其加载到常数从启动时的类路径(见下文如何融入构建过程):

public class Constants 
{ 
    private static final Properties props = new Properties(); 
    public static final String MY_CONSTANT; 

    static 
    { 
     InputStream input = Constants.class.getResourceAsStream("/myapp.properties"); 
     if(input != null) 
     { 
      try 
      { 
       properties.load(input); 
      } 
      catch(IOException e) 
      { 
       // TODO log error 
      } 
     } 

     // Initialize constants (dont' forget defaults) 
     MY_CONSTANT = properties.getProperty("constant", "default"); 
     // .. other constants ... 
    } 
} 

现在,有一个单独的属性文件对每个品牌传递它的名字ANT。通过-D或build.properties并将文件复制到您的build目录,然后再打开(或打开)它。

很明显,上面的代码可以工作,但有很多方法可以清理它,让它防弹

1

我有一个解决方案,根据需要为这个特定的si tuation。我用Ant和常量类的“拯救”的版本替换任务结合:

<target name="one" description="constant substitution #1"> 
    <delete file="./tme3/MyConst.java" /> 
    <copy file="./save/MyConst.java" tofile="./tme3/MyConst.java" /> 
    <replace file="./tme3/MyConst.java" token="@[email protected]" value="ONE_BRAND"/> 
    <replace file="./tme3/MyConst.java" token="@[email protected]" 
      value="../stylesheet/onebrand.css"/> 
    <replace file="./tme3/MyConst.java" token="@[email protected]" value="../images/onebrand.ico"/> 
    <replace file="./tme3/MyConst.java" token="@[email protected]" value="false"/> 
</target> 

我只是做这个块的副本和更改我需要的情况下,替代 - 在我的特定情况下有现在是3套,但更多预期。

非常感谢大家的回复。