Pergunta

Eu herdei um aplicativo Java (servlets) que é executado no Tomcat. Por razões históricas, o código tem diferentes opções "Look and Feel" com base em onde o aplicativo será implantado (essencialmente uma questão de marca).

Existem várias constantes que controlam esse processo de marca, que têm funções diferentes e não devem ser compactadas em uma única constante (por exemplo, marca, múltipla linguagem, além dos locais de ícones e folhas de estilo CSS, etc.).

Atualmente, a equipe de desenvolvimento deve alterar manualmente as constantes (elas estão pelo menos localizadas em uma classe de dados e bem documentadas) e depois recompilar o aplicativo usando a ANT.

Qual é a melhor maneira de automatizar esse processo assumindo pelo menos ANT 1.8 e Java 6.x?

Eu sei que não houve boas soluções usando argumentos do compilador (como se poderia fazer em C ou C ++), e estou inclinado para alguma "melhor maneira" de editar o arquivo de origem que contém as constantes ou colocá -las em outro arquivo e Trocando -os usando o processo de construção da formiga. Eu gostaria de ter um resultado que funcionaria usando algo como "Ant Build Brand-X", onde alterar a marca alteraria a compilação resultante.

Obrigado,

-Richard

Foi útil?

Solução

Use a tarefa Substitua em ANT para alterar os valores.

Outras dicas

Coloque seus valores em um arquivo de propriedades, diga "myApp.properties" e depois carregue -os em suas constantes do caminho de classe na startup (veja abaixo como isso se encaixa no processo de construção):

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 ...
    }
}

Agora, tenha um arquivo de propriedades separadas para cada marca. Passe o nome para Ant via -d ou build.properties e copie o arquivo para o seu diretório de compilação logo antes de você jarre (ou guerra).

Obviamente, o código acima funcionará, mas há muitas maneiras de limpá -lo e fazê -lo à prova de balas.

Há também uma maneira "primavera", que é usar um arquivo de propriedades, e um feijão que extrai o valor das propriedades e as injeta nas classes que precisam deles, por exemplo:

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

E então, você pode injetar propriedades com uma sintaxe "semelhante a formigas":

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

O que provavelmente implicaria mais reescrita do que você gostaria. Se você estiver mudando de constantes em cada compilação, cuidaria disso (se você estiver usando finais estáticas, é isso).

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

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

Se você mudar de alguma maneira em Foo para 2, mas não recompile a barra, a barra manterá o valor de 1 para alguém, pois as finais estáticas são compiladas (já que o compilador vê que ele nunca precisa descobrir novamente ).

Eu prefiro usar formigas ExpandProperties filtre em vez da tarefa de substituição. Com a tarefa de substituição, o arquivo de compilação tende a crescer para ser principalmente tokenização. O ExpandProperties permite incorporar propriedades de formigas diretamente em seu texto.

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

Eu tenho uma solução que funciona conforme necessário para essa situação em particular. Eu usei a ANT Substitua a tarefa em conjunto com uma versão "salva" da classe Constant:

<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="@BRANDING@" value="ONE_BRAND"/>
  <replace file="./tme3/MyConst.java" token="@STYLESHEET@"
           value="../stylesheet/onebrand.css"/>
  <replace file="./tme3/MyConst.java" token="@FAVICON@" value="../images/onebrand.ico"/>
  <replace file="./tme3/MyConst.java" token="@SHOW_LANGUAGES@" value="false"/>
</target>

Eu apenas faço cópias deste bloco e altero as substituições para os casos de que preciso - no meu caso particular, existem 3 conjuntos agora, mas mais esperados.

Obrigado a todos pelas ótimas respostas.

Use formiga arquivos de propriedade, e construir com "-dbrand = x".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top