Melhor maneira de alterar as constantes no processo de construção de Java
-
03-07-2019 - |
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
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".